Hardening 1010 Cash Flow参加記【h1010cf】

こんばんは、Knotfoundです。
Hardening 1010 CashFlow( https://wasforum.jp/2017/04/hardening-1010-cash-flow/ )にTeam 03、「術中Hack」として参加しました。
その結果、弊チームはグランプリを受賞しました。

今回はその振り返りをしてみます。(チームの全体的な流れについても触れます。)

1.参加申し込み前後
 申し込みは個人で行い、チームを組む際にで同じ学校の同級生2人と組みたいという希望を出しました。
 その後、チームメンバーが通達されましたが希望通りに2人がチームにいた上にもう一人年下の同じ学校の後輩がチームになってしまいました。
 つまり、僕のチームは社会人2人+学生(高専生)4人という学生主体と言ってもいい構成でした。
 通達された後、のちにチームリーダーになる社会人の方がさっそくSlackのTeamを作成して下さり、自己紹介やそれぞれの目標などを確認しあいました。早い段階でこれができたことで士気も上がったのではないか、と思います。

 ちなみに僕が参加した目的は2年前のリベンジです。
 このブログでも多分エントリがあると思いますが、2年前に同じく沖縄で行われたHardening 10 MarketPlaceに僕は参加しました。
 その時の僕の実力としてはLinuxの存在や最低限のコマンドを知っていたくらいのレベルで、サーバーを自分で構築して運用するなどの経験がほとんどない状態でした。
競技当日はほとんど何もわからない状態で挑んだため、ただサーバー上でtopコマンドを叩いて画面を眺めるくらいしかできませんでした。(後はメール対応の文面を考える
のを少し手伝ったのと翌日のSoftningdayで発表したくらいかな)
 この時何もできなかったのが悔しかったので今回は更にチームに貢献できるようにする、というのが僕の目標でした。

2-1.事前に何をしたか(個人的な奴)
 ・競技環境の再現に挑戦
 僕が所属している研究室にはvSphereの演習用のサーバーがあります。せっかくその環境があるのなら、とそこに去年(Value × Value)のHardening環境を見よう見まねで再現しようとしました。また、それを聞いたチームリーダーの方にさくらのクラウドにも環境を作らないか?とのオファーを頂き、vSphereでの作業を中心にしつつ両方での環境構築に挑戦しました。空いている時間を縫って試行錯誤をした結果、リバースプロキシ(Nginx)とwebサーバ2台(Apache)、
Webサーバのデータなどを格納するデータベース、踏み台用のWindowsServer、DNSサーバー(BIND)などは実際に稼働させることができました。
 Webサーバ2台に関しては実際にWordpress+Welcartも導入しました。ただし、肝心のWebコンテンツなどは持っていないためそこまでしか再現できませんでした。
 BINDは内向けの正引きゾーンファイルのみを書きました。逆引きや外向けのゾーンファイルも書きたかったのですが、まずは基本のものを1つ書こうということで
1つだけ書きました。実際に他のサーバーなどからも名前を引くことはできました。しかし、ホスト名のみの名前解決ができませんでした。(例えばweb1.hoge.com
というFQDNがあった場合、web1だけで名前解決ができないということです。)このDNSサーバーですが、当時の環境だとメールサーバとしての役割もありました。
しかし今回はそこまでの構築は時間の都合上見送りました。リバースプロキシは本来であればロードバランサとして稼働させたかったのですがそこまではできなかったです。
全Webサーバにプールさせるためのコンテンツを持っていなかったのと、僕の技術力がまだ足りていなかったのが原因です。他のサーバに関してはOSのインストールのみで
ミドルウェアのインストールなどもできていませんでした。
 結果的に完全には環境の再現ができませんでしたが、そもそもコンテンツを持っていない時点で完全な再現は無理だと割り切っていましたし、自分の実力をアップさせるのが大きな目的だったため、個人的にはかなり役に立ったと思います。
 特にBINDのゾーンファイルなどは自分で構築する機会などもなかったため、かなり勉強になったと思います。(後で書きますが、今回のWAFに関するゾーンファイルの変更もスムーズに行えました。)
 ・分からないところなどを質問した
BINDのゾーンファイルを書いたことがなかったためSlackを通じて社会人勢に添削してもらいました。
ロードバランサの仕組みがいまいちわかってなかったためその部分も確認をしたり質問したりしました。(結果的に今回は使われませんでしたが)
さらに本番でやる作業をどうするかも話し合いました。当初はsshの接続ポート変更やsshのログインに公開鍵認証などをやることも考えましたが、社会人のメンバーに、作業に見合うだけのメリットが低いのではないか、という指摘を頂きました。僕もその指摘を受けて納得し、データベースやApacheのチューニングに注力しようということになりました。
バックアップするコンテンツの絞り込みについても話し合い、例えばWebサーバーなら/var/www/以下とか、データベース(MySQL)ならmysqldumpを使うとか、あとは各ミドルウェアなどのconfファイルとかをバックアップしよう、ということになりました。

2-2.事前に何をしたか(チーム全体的な奴)
・当日の流れを決めた
 当日の大まかな流れを決めました。具体的には、

踏み台端末へのログイン→各サーバー、端末の全アカウントのパスワード変更→
コンテンツのバックアップ→後はインシデント対応、時間があれば各種ミドルウェアのチューニング(個人的にはここで踏み台端末のWindowsやWindowsServerにパッチを当てる予定でした)
みたいな感じです。ちょっと細かいところが違うかもしれません。

・MarketPlaceの戦略を立てた
 初手で初期資産のほぼ全てを広告に割り当てる方向になりました。(売り上げで回収できるだろうという予想です)
 また、MarketPlaceは買えるだけ買ってしまえ!という方針で、結構ガンガン買うことになりました。僕も前回の反省から、MarketPlaceは積極的に利用するという考えに賛成でした。

MarketPlaceの商品一覧や特徴、またそれ以外にSlackにそのまま貼ると流れて困ってしまう情報などはチームリーダーが作ってくれたGoogleスプレッドシートにまとめてくれました。これのおかげで適宜見直すことができました。

3.前日に何をしたか
・踏み台端末などで使用するWindows用ツールのダウンロード(ポータブル版のWebブラウザ、TeratermThunderbird、NMap、7-ZipWireSharkなど)
・運営から届いた資料の読み込み、それに伴う戦略の変更
想像していたのとは異なり、MarketPlaceの購入が競技開始から2時間後からしかできないため、その間はひたすら広告を打つことになりました。今回は借金制度もありましたがそれもMarketPlace同様に開始から2時間後からしか利用できないため、見送りました。

4.当日
競技開始
集合時間を勘違いしてしまい、会場入りが遅れてしまいました・・・申し訳なかったです。(競技開始自体には間に合いました。)

・自分が使った踏み台端末(Windows)が落ちる
踏み台端末にはRDP経由で接続しました。必要なツール群を転送するためにファイル転送をしましたがしばらくするとRDPのセッションが切れてしまいました。
再接続を試みてもつながらなかったため、仕方なく管理用の画面から再起動を行いました。ファイル転送が負担になってRDPごと端末が落ちるのかなぁと思っていましたが、
それ以外の普通の作業を行っていてもだいたい10分ほどで落ちてしまい、仕方なく空いている踏み台端末に切り替えました。そこではセッションが切れるようなことはなく、作業が継続できました。ちなみに別のチームメンバーがこの端末を利用しても同じように定期的に落ちていましたが、原因はわからなかったです。

・ADのオペレーションで手間取った
 踏み台端末(Ubuntu)を利用予定のチームメンバーがなぜかsshでログインできなかったため踏み台端末(Windows)の
ActiveDirectoryのアカウントを増やそうとしたら手間取ってしまいました。今思えばわざわざActiveDirecotyを使わずに、ローカルアカウントでもよかったんじゃないかなー
って思います。
この他にもWindowsServerでMBSAのオフラインスキャンをかけましたが、会場の回線だとパッチを全てダウンロードするのにはめちゃくちゃ時間がかかることが発覚、取捨選択しようにもどれを優先したらいいのかすぐには判断できなかったため、パッチの適用を断念しました。

 その間に他のチームメンバーは踏み台端末のローカルアカウントやDB、Wordpressなどのパスワード変更、踏み台端末のWindowsのポート封鎖など、あらかじめ決めていた
  通りに着々と作業を行っていて、内心では少し焦っていました。さらに本来僕がやる予定だったDBやApacheのチューニングに関しては、他のチームメンバーが進めてくれており、僕はその設定内容をまだチューニングしていないWebサーバーにコピペするなどの作業を行っていました。
 また、本来初手でやるべきだったコンテンツのバックアップもWebページの改ざんがあったことに気づいてから行いました。幸いまだ改ざんが行われていなかったため、
そこから優先してバックアップを行いました。バックアップは念のため、踏み台端末とファイルサーバにも置きました。

 そうこうしている間に14時20分ごろに弊チームで個人情報の流出があったことが発覚、原因究明や被害規模が明確に洗い出せないまま記者会見が行う運びに。
記者会見はチームリーダーと僕と僕と同期のチームメンバーの2人で行い、その間僕は被害状況の確認のためにデータベースやWebページのログのチェックを手伝いました。
Apacheのログなどから、PHPバックドアがあったことやHTTPのリクエストの制限が行われていないことがわかり、担当のチームメンバーによって修正が行われました。

 それからしばらくしてMarketPlaceで購入したWAFの(運営側の)設定が終わったとの連絡があり、指示通りにBINDのゾーンファイルを書き換えてWebページへのアクセスをWAFを経由して行うように設定しました。後日WAFを提供して頂いた運営様からのWAFの検知ログによると約100件ほどの不正なアクセスがブロックされていました。これは僕の主観ですがWAFの設定をしたあと、Webページの改ざんや個別でのWebページのダウンなどがかなり減ったと思います。

 このタイミングになると、ほぼ安定してECサイトが稼働するようになってきました。ただ、会場4か所に設置されていた各チームの稼働状況やSLA、総資産情報などを示す
情報画面を監視しているとたまに自チームのWebサーバーが全部ダウンしているときがありました。各Webサーバー自体は稼働していたため、DNSサーバー(BIND)のダウンが原因だろうということになり、その都度BINDを再起動するようにしました。その頃はチーム内に少し余裕もあったため、社会人のチームメンバーの方がBINDの稼働状況を確認し、落ちていたら再起動をかけるシェルスクリプトを書いてくれました。
それによって(理論上は)ダウンタイムが最長でも59秒という素晴らしい稼働率になりました。

 情報画面とにらめっこしながら競技は終盤を迎え、10時間にもわたる楽しいHardeningDayは終わりを迎えました。
 作業ログをあさったり記憶からたどったりしましたが多分当日はこんな感じだったと思います。他にもたくさんあったと思いますが僕のHardeningDayはだいたいこんな感じです。

5.自分の中での良かったこと・反省点
良かったこと
・事前に演習環境を再現するために構築しようとしたこと
 他のチームのメンバーにどれほど貢献したかはわかりませんが、僕個人としてはいい修行になったと思います。少なくともロードバランサやDNSサーバを自分で建てるという機会が今までなかったため、今回それにトライし、完全ではないものの稼働させることができたというのはその過程を含めて多くの知見が得られました。
・わからないところは聞いたこと
 ロードバランサなどは多少知っていたもののちゃんとした仕組みをまだ理解していなかったため、質問して少しでも理解しようとしました。今でもまだ完全には理解していませんが、それはこれから追々理解をしていこうと思っています。
・ツールなどを事前に用意したこと
 これは競技時間内で少しでも本質的ではないことに時間は割きたくないなという考えでやっておきました。使わないツールなどもいくつかありましたが、少しでも作業に集中しやすくなったかなと思います。
・PCを2台持ってきたこと
 これは社会人のお二方の話で、実行しました。僕も私物で2台ノートPCがあったので、1台は競技環境との接続、もう1台はSlackや調べもの、資料閲覧というように作業内容を分けるようにしました。その結果、1台の画面であっちこっちに行くよりも作業効率が上がったと思います。これからコンテストや大会などに参加するときはPCは2台持っていこうと思います。
反省点
・Webサーバ、DBのチューニングをほぼ人任せにしてしまったこと
 これは事前のリサーチ不足もそうですが、当日で他のオペレーションに手間取ってしまったために人任せになってしまいました。チューニングに関しては実際に設定してみて効果などを測ってみないと見えてこないため、前もってやって慣れておかないと本番にどういう作業をしたらいいかわからなかったです。
・パスワード変更に漏れがあったこと
 これも言い訳になるようですが、外部DNSレンタルサーバーなどのことをすっかり忘れてしまっていました。
・コンテンツのバックアップが遅れたこと
 運よく全部のWebサーバーが改ざんされていたわけではなかったため、被害を免れたサーバーから急いでバックアップを行いました。やはりバックアップは大事です。
MBSAのスキャン結果を活かせなかったこと
 競技前までは、当日スキャンしてパッチを適用すれば大丈夫だろうと考えていましたが、会場の回線事情やスキャンが端末に与える負荷の考慮など事前の読みが甘かったです。今後の課題でもあります。
6.知見
・標準で提供されているリモート管理ツールの罠
 競技中、BINDがよく落とされていましたが、SoftningDayやkuromame6の中の人の情報( https://www.lac.co.jp/lacwatch/people/20170629_001322.html )によれば、今回の攻撃では脆弱性を利用したものだけではなく、リモート管理ツール(RNDC)で停止されたものもあるとのことでした。特に、リモート管理ツールでサービスを落とされた場合だと、通常のセキュリティ対策のソリューションなどでは検知できないこともあるようで、今後はRNDCに限らずリモートで制御できるツールについても注意をしなければならないことがわかりました。

シェルスクリプトは書けるようになると非常に役に立つ
 今回はBINDの自動再起動を行うために、社会人のチームメンバーの方に書いてもらいましたが、やはりシェルスクリプトが書けるというのは通常の業務にも役に立つはず
なので身に着けておかなければならない技術の一つなんだと再認識しました。

・パッチを当てる場合、必要最低限のものに絞る
 散々言ったMBSAのことですね。

・設定を変更する場合に必ずバックアップをとる、変更適用前には誰かに見てもらう
 これはチーム全体でも意識していたことで、とりあえず既存の設定ファイルを別名でコピーして置いたうえで編集し、変更箇所もコメント文で分かるようにしました。
さらに変更適用を行う前には隣の人に確認してもらい、ミスを少しでも減らすようにしました。Apacheなどはrestartではなくreloadにとどめることで変更による影響を減らすようにもしました。

・専任でメール対応を行う人を付ける
 今回はチームリーダーの方にメール対応全般をお願いしました。技術的なことはほとんど関与しない一方で迅速かつ適切なメール対応をしていただきました。おそらくそれがSLAや信頼度の向上などにもつながったのではないのかなーとチームの人たちと話し合って気づきました。

 本当はSoftningDayの次の日にはこの記事を仕上げたかったのですがズルズルと伸びてしまい、さらに見づらい文章になってしまったかもしれません。ですがとりあえず記憶がまだ確かなうちにありったけのことを書いておくことで後から見返して思い出せるような記事にしました。
 今回はグランプリを受賞し、個人的な目標も達成することができました。この結果に慢心せず精進してさらに技術力を高めていきたいです。
 最後に、このような楽しく濃密で素敵な10時間を作り上げるために奔走していただいた運営の皆様、そしてグランプリを取れた一番の理由であるチームメンバーの皆さんと、同じく今回参加した皆様に、遅ればせながら感謝と慰労の意を申し上げます。今回は本当にありがとうございました!

#h1010cf