AWS GameDay !!!

gameday

Publickeyさんのこの記事→「「Obama For America」の開発チームが作り上げた大規模な選挙キャンペーンシステムの舞台裏(後編)」で非常に気になっていた「GameDay」が、なんと日本で開催されるとのことで参加してきました!
上の写真は、この素晴らしいイベントを開いて下さったObama for AmericaチームのボランティアメンバーのMiles Wardさんと、AWSソリューションアーキテクトチームの皆さんです。ありがとうございました!

普段全然AWS使ってないし・・そもそもアプリ屋の人だし・・スゴそうなメンバーがいっぱい集まりそうだし・・って思ったのですが、イベント概要に「システムに関わる全ての皆様の参加をお待ちいたします」ってあったし!「チームで対戦形式としますので、ノービスからシニアまでご遠慮なくご参加ください」って書いてあるし!それ以上にとにかくやってみたかったし!ってことで飛び込んでみました。

終わってみたら、本当にとてつもなく楽しいイベントで、帰ってきてもなかなか興奮がさめないでいます。
取り急ぎ、もろもろを書いておきます。以下長いです。

イベント概要 「AWS Game Day Tokyo 2013」 日本初!対戦型システム信頼性向上策を体感しよう!
公式サイト AWS GameDay
開催報告・ルール概要など
AWS Game Day Tokyo 2013 開催報告 – Part 1 : Unclouded Eyes
AWS Game Day Tokyo 2013 開催報告 – Part 2 : Unclouded Eyes
AWS Game Day Tokyo 2013 Vol.1 – flickr

自分のAWSスペック

  • 仕事では使っていない。
  • 3時間くらいのハンズオンを受講して、S3で静的なHTMLのサイト作成とか、EC2の作成から簡単なVPCの構築までを体験。
  • それ以外は個人のアカウントでEC2を作成、gitなどをインストールして開発環境を構築したり、簡単なコマンドを叩いたりした程度。
  • 普段の仕事はアプリ屋でインフラ構築は携わっていない(開発環境を作る程度)

参加前にやったこと

さすがにAWSに慣れてなさすぎて、攻撃・防御に四苦八苦したくなかったので、いろいろと予習してみました。これが結果的に自分のAWSの基本スキルを上げることになって一石二鳥w。やっぱり何か目的があると勉強しやすいですよね。あと、クラウドデザインパターン本が面白くて役に立ちましたです。

Amazon Web Services クラウドデザインパターン設計ガイド
Amazon Web Services クラウドデザインパターン実装ガイド

  • クラウドデザインパターン本を薄い方と厚い方を両方読む
  • 自前のアカウントで以下のことを自習としてやってみた。
    • RDSにMySQLのインスタンスを作成
    • EC2を作成してApache、PHP、Wordpressなどをインストール。DBはRDSに作ったMySQLを使う
    • 作ったEC2をAMIに保存
    • AMIから複数のEC2を作成・CloudInitにも初期化スクリプトを設定(これはスクリプトを調整しながら何度か繰り返し)
    • ELBを作成し、複数のEC2にロードバランスする構成を作成
    • 攻撃用にjmeterのスクリプトテンプレートをいくつか作成(DDosとか、データあふれさせたりするのとかに使えないかと思って。結果として未使用でした)

システム概要

用意されたシステムは簡単なバッチのクラスタ構成でした。それを準備段階で手順書を見ながら構築します。処理の流れとしては以下のような感じです。

  1. 複数の画像のURLをSQSのキューに流す
  2. サーバーに常駐したスクリプトがキューを取得、画像をダウンロードしてローカルに保存しImageMagickで合成、その画像をS3に保存する
  3. 処理結果と保存先URLを出力用のSQSにキューとして登録

これらの構成に対して、AutoScalingと監視用のCloudWatchを設定し、負荷に応じて自動的にスケールするバッチクラスタを構成します。

ずっとWebシステムをイメージして準備していたので、問題が明らかになったときにまさかのバッチクラスタwって思いました。でもそんな意表をつかれたのも面白かったです。

ルール概要

以下を参照。
http://www.slideshare.net/kentamagawa/aws-gameday-tokyo2013-22642423

PowerUser権限を持つIAMユーザーを作成し、それを交換して相手チームのAWS Manegement Consoleにアクセスして攻撃します。なので、簡単な全消しとかはもちろんナシ。相手に気づかれない方法でシステムを壊すことが高評価につながります。また、PowerUser権限では相手チームのサーバーにはログインできません。

ルール概要にある「攻撃によりコストが発生してはいけません」とは、要するに「課金増やす攻撃はなし」ってことですw。

チーム

基本は3人チームでしたが、自分のチームは人数の関係で2人体制でした。チームメイトの@Canelmoさんはお仕事でもAWSを使っており、AWSのコマンドも手慣れていて手がとても早い方でした。なので、AWSのコマンド系は彼が主に担当し、ブラウザから実行できる設定などは自分がやるなどの分担をしました。チーム名は2人の趣味とか好きなものとかをいろいろ出し合って、チームFujinomiyaに決定!

システム構築および防御

手順通りに構築して行ったのですが、最後あたりでまさかのリージョン違い問題が発生(東京リージョンで構築したのですが、バッチスクリプトはデフォルトのUS Eastで動くようになってた)。スクリプトを修正しようかとも思いましたが、時間がなかったので、運営の方からチート用wのCloudFormationの構成をもらって、ポチッとなって感じで全構成を自動作成しました。ここでこのCloudFormationの凄まじさをまざまざと実感する結果にw


まさに負け組かとw

「CloudFormationで作っちゃったからシステムにイマイチ愛着わかなかったです」とはチームメイトの談wやっぱそうですよね。その上、防御用の独自設定は時間の関係でほとんどできなかったです。

次こそは!

攻撃

以下の攻撃を実施しました。
攻撃時間が20分間なので、短い時間の間にアイディアを出して、すぐにそれを実行してみる緊張感が楽しかったです。

  • バッチスクリプトを読んだところ、画像をダウンロードするwgetコマンドにコマンドインジェクションの脆弱性を発見。それを利用することにした。(ちなみに、それを防ぐパッチをあてたチームが見事ベストディフェンス賞をゲットしました。おめでとうございます!)
    • 攻撃されるアカウントとは別のアカウントの方にEC2のWebサーバーを建てて無限リダイレクトが発生する画像URLを設置。それを使って「—max-redirect 99999999 http://無限リダイレクトのURL」をキューに流した。
    • 入力キューのURLに、「chmod 000 /バッチの出力ディレクトリ」をコマンドインジェクションした(成功したかは未確認)。
  • SQSのキューの「Delivery Delay」を最大値の15分に設定した。
  • S3のバケットポリシーに書き込み拒否を設定。
  • オートスケールの設定を、最大・最小共に1に設定。
  • オートスケールの設定に、1分おきにインスタンスが停止するように設定。

受けた攻撃

SQSのキューとS3バケットの名称をほんのわずかに修正された。「o -> O」のような感じでw。
その結果、キューにアクセスできなくなったため、バッチプロセスが終了してしまっていた。

修復

CloudInitに設定してるバッチの起動スクリプトに書いているキュー名とかバケット名を修正。しかし、これがなぜかなかなか面倒でした。しかも完全に正しく修正しているのにも関わらず、なぜか何度EC2を起動し直してもバッチが正常に起動しなくなる現象が発生。だいぶ調べましたが、どうにも原因がつかめなかったので、最後に時間切れでCloudFormationをポチって、システム再構築しましたw。修復としてそれアリなのかという議論はもちろんありますが、今回はDBなどがないシンプルなシステムだったので、(本当は自分たちでCloudFormationを構築していればw)アリなのかと思います。

それにしても、名称の変更って地味に分かりにくいし、地味に効果的で、地味に修復にも手間取るので、単純ながら以外にやっかいな攻撃だと思いました。

そんな風に修復に手間取っていたため、修復後に流せたのはわずか1件のキューのみ。しかし、それがまさかのFunniest Image賞に選ばれましたww

ホントは3枚くらいまとめて流したかったビンタ画像w 「攻撃する人なんてこうよ!」って意味にしたかったので。
20130609143831

感想など

とにかく本当に楽しかったです。
短い時間の中でアイディアを出しあってそれをすぐにオペレーションしたり、ソースコードを読んでコマンドインジェクションの脆弱性を見つけ出したり、同じ部屋の別チームと攻撃方法を共有しあったり(ファイルを入れたUSBをまわし合ったり)、その日初めて顔を合わせた方と2人で、サーバーがうまく動かない事象を喧々諤々Shellを叩いて調査し合ったり、遊びながらどんどん創造性が湧き出てくるようなひとときでした。

予習は比較的役に立ちました。特に2人チームだったので、自分が全部教わりながらだと間違いなくもっと時間が足りなかったはず・・。終わってみれば、基本的なAWSの機能群に加えて、CloudFormation、AutoScalingなどの機能とその威力などが理解できて、非常に有意義な勉強になりました。

他のチームの創意工夫に富んだ攻撃方法や防御方法も興味深い物が多く、得られた物が本当に多かったです。遊びはスキルを一気に延ばす力があるということも改めて実感しました。

終わってみて

  • CloudFormationの復旧最強かも。CloudFormerも調べてみたい。
  • 自分がいつも使う各種スクリプトのテンプレートや設定ファイルなどは、githubのようなところに上げておけば、EC2サーバーにすぐに反映しやすくていいかも。
  • Mac同士ならAirDrop使うと鍵ファイルとかの転送が手早く簡単で良いです。Windowsの場合は共有作ったりするしかない感じ?あらかじめなんかアプリを入れておくといいかも。
  • ブラウザで別々のアカウントでAWSにログインしたい時は、Chromeの場合では片方のアカウントをシークレットモードでアクセスすると同時に使えるので良いです。
  • スゴく時間がなかったので、弁当持参だったのが昼の時間も使えてよかったです。
  • コマンドインジェクションなんでもできるので怖い!!でも、この手はさすがに次は使えないかも。。自分も次は間違いなく先に見つけてつぶすと思うし。
  • 次は絶対にキチンと防御まで構築して、攻撃側をだます罠とか、自動修復までするようなシステムを作っておきたい!

そして、チームメイトの@Canelmoさん、2人チームでしたがホントに楽しかったです。ありがとうございました!

次も絶対参加したいです!