こんにちは、メルペイでバックエンドエンジニアをしている id:koemu です。
去る2019/07/04〜05の間、私を含めたメルカリグループ3名のエンジニアが、セキュリティの「衛り」の全国大会 Hardening II SU に参加してきましたので、報告します。
TL;DR
- セキュリティの「衛り」の技術を競う大会に参加してきた
- 自走できるレベルの高いメンバーが集まりOSSをはじめ成果物もできた
- 惨敗だったがセキュリティの衛りの知見をたくさん得ることができた
Hardening とは
Hardening とは、セキュリティの衛りの技術を競う大会です。日本各地で開催されており、この Hardening Project が主催する Hardening II SU (以下、本競技)は最も規模が大きく、競技の複雑度も高くなっています。
本競技において、セキュリティに関するソフトウェア技術は衛りの技術の一つでしかないものです。この他にも、物理セキュリティ、カスタマーサポート、当局への通報などの渉外対応、広報対応*1、そしてそれらを取り巻く環境に優先度を付けながら対応していくスキルが求められる、総合格闘技的なものとなっています。思い当たるものすべてが対象と思っていただいて差し支えありません。
大会は2日間に行われます。
1日目はHardening Day と呼ばれ、競技です。攻撃は、実際に受けると新聞の社会面に掲載されてしまうような重大インシデントレベルのものが数十分置きにいくどもなく襲ってきます。これに対し、予め対策を施していくか、それとも攻撃を受けたときにいかに冷静に対処して鎮圧していくか、それぞれ力が試されます。
2日目はSoftening Day と呼ばれ、各チームのプレゼンテーションと、競技解説、表彰式、そしてネットワーキングがおこなれます。
CTF (Capture The Flag)との違いとして、CTFは攻撃を中心としたセキュリティ技術の競技となっていて、Hardeningとは真反対のものとなります。なお、Hardeningでは他チームへの攻撃は禁忌とされています。
ISUCON (Iikanjini Speed Up Contest)との違いも記載します。ISUCONは与えられた環境をあらゆる技術を用いてチューニングしますが、環境はスタートの時点から自分が操作しない限り一切変化することはありません。Hardeningは開始してしばらくすると運営側から攻撃が始まり、システムの状況が刻々と変化します。環境が変化する点が決定的に違います。
今回のルールについて
NICTのStarBED に構築されたVM上にあるECサイトがあります。これを、攻撃から衛りながら売上を最も出せるように戦います。構成は運営側からオープンにしないようにお達しが出ていますので、省略します。
また、チーム構成に特徴があり、東西南北の4つの「連合」と、それに紐づく3つの「チーム」で構成されます。最も売上が立った連合の中から、最も売上が立ったチームが優勝となります。したがって、チームとして最も売上が立っているだけではだめで、連合全体で売上を底上げしないと優勝できません。実際今回それで勝てなかったチームがありました。
この連合というシステムは結構よくできていまして、後々考えますと、準備段階から協力しあえる状況を作ることで、よりハイレベルに戦える状況を作れるかどうかがかかっています。だからといって、自チームが最後には勝ちたい。そのバランス感が現実の事業提携とよく似ていて、Hardeningの競技としての面白さを更に際立たせています。
所属チームについて
全員、本職の仕事がきれいにバラけるチームでした。住まいも、関東・関西・沖縄とバラバラ。そのため、チーム内でのロールを以下のようにしました。左は本職、右がチーム内でのロールです。
- セキュリティエンジニア 技術に強い人 → 脆弱性切り分け
- セキュリティエンジニア 環境・渉外に強い人 → 渉外対応・作業ログ記録
- SRE → SRE
- ネットワークエンジニア (Hardening過去出場者) → CS/連絡担当
- ソフトウェアエンジニア (バックエンド) → インシデントコマンダー
- 大学生 → ECサイト 販売管理
特に、過去の出場者がいたことが大きく、実戦に向けての準備に大きく貢献いただきました。
また、チームメンバーの中にヒエラルキーは作らず、フラットでアジリティが出せる組織構造にしました。実際このやり方はうまく行ったと思っています。
自分はどう参加したか
自分を始め、メルカリグループのメンバーは、MINI Hardening Project 3.2で勝ち上がって本戦出場権を獲得したメンバーでした。その模様は個人のブログに書きましたので、よろしければご覧ください。
自分のロールは、インシデントコマンダーを割り当てました。これには以下の理由があります。
- 本番でインシデントコマンダーをやるときまでに経験を積んでおきたい。
- インシデント発生時に、各自がどんな動きをしていくのか、引いた目で理解したい。
- 実務に強い人たちがいるので、自分がやりたい気持ちをぐっとこらえてお願いしてみたい。
あと、運営上便宜的にチームリーダーが必要だっため、合わせて自分が引き受けました。
準備について
準備の基本は、過去の出場者のメンバーから得た情報をもとにすることでした。そこから、以下のことをまとめていきました。
- 必要となるロールを調べて割り当てる。
- ロールごとに準備をする。例えば、脆弱性切り分けなら、よくある脆弱性情報を洗い出す。CS担当なら、テンプレを用意する、など。
- 週1回、30分だけでも、オンラインMTGをする。家庭と仕事を大事にした結果のギリギリのところ。
一人ひとりの自走力が高く、特に誰かが言い出すこともなく準備が進んでいたのが大変印象的でした。準備の段階から、素晴らしいチームメンバーに恵まれたなと感じました。
準備の中で最も素晴らしかったのは、今年新卒で当社に入社したSREの同僚が作ってきた、本競技向けサーバ運用・監視ツール “flos” の開発です。運用・監視ツールは世間に出回っていますが、どれも競技に使うには重厚な感じでした。そこを、夜なべまでして軽量なツールを作ってくれたものです。主に「監視」「ログ・プロセスビュー」「コマンド一括送信」そして「バックアップ」機能が備わっています。作るだけでなく、当日ちゃんと動いたことも特筆できます。ただ、本人は、競技開始の早い時間で投入したかったと言っておりました。
本人がコードを公開していますので、ぜひご覧ください。
本番の模様
本番は、全員遅刻することなく会場に集まり、準備から競技開始を迎えることができました。
競技中は、大きな混乱もなく対応を進めることができました。各人が、事前に決められたロールの中で仕事を進めることができました。
特に、Market Placeという売上金を使ってサービス・機材を購入できるルールを行使して得た、NECさんのHardening/CTF経験者による助っ人サービスを通じて、序盤に施せるセキュリティ対策を高速に施せたのは非常に良かったと思っております。
問題だったのが、2つあります。
まず、ロールからあぶれた作業でした。例えば、公式サイトがメンテされていないなどの作業を誰がするのか、インシデントコマンダーの自分に判断が委ねられました。ここは、実はNECさんにお願いしてしまいました。ただ、NECさんにお願いしていたのは2時間の制限があったため、その後は急を要しない時は僕自身が作業をしていました。
次に、ECサイトでの販売管理でした。売上の人気度に応じて値付けを変えていくものだったのですが、初動が遅くもうちょっとやり方があったなーと反省しています。
反省点
3つあります。
まず、もう、何よりも、大減点を受けていたことですね。表彰のときに発表された売上金が、最後に見た売上金よりだいぶ減っておりました。本当に残念。チームメンバー一同、本当にがっくりしてしまいました。何がダメだったのかは公式には発表されないため、情報を集めてチーム内で予測するしかありません。たぶん、なにかをやりすぎて採点できないくらいに何かを施してしまったのではと予想しています。
次に、準備で足りなかったことがあるとすると、連合内での情報共有です。リーダー間でもっとシェアできる情報があったのではと反省しています。当日、連合間で定時の情報共有タイムを作りましたが、それ以前にもセキュリティ対策や接続方法の共有などを行っていれば、他のチームにも貢献できたんじゃないかなと思っています。
最後に、ECサイトの管理です。これは正直手薄になってしまって、事前の計画のときにもっと施すことがあったのではと反省しています。
ほかにも、あのときあれができたらと思うことはたくさんあります。ただ、それができたとしても、別の攻撃や対応が必要となるのがHardeningの奥深さ。衛りのセキュリティに答えはないことを身をもって知る日になりました。
参考資料のプレゼンテーションにも、どのようなことをしてきたのかを書いていますので、合わせてご覧ください。
後日、チームメンバーを集めてオンラインでRetrospectiveをする予定です。
感想
本競技のチームメンバーは、メルカリグループ以外のメンバーの中には当日初めて実際に会う人もいました。そんな中でも、まるで昨日も普通に仕事をしていたようなチームワークで競技できたことを、本当に嬉しく思います。一方で、MINI Hardeningで優勝して乗り込んできたこともあり、こてんぱんにされて本当に悔しいという気持ちも拭えません。
セキュリティ対策の知見も、たくさん養うことができました。Softening Dayでkuromame6(攻撃担当の方々のチーム名)のみなさんが行っていた攻撃手法の一部が開示されるのですが、えっ、こんな脆弱性が…というものがいくつもありました*2。その中には、事前の設定を見直すなどで防げるものもたくさんあります。パスワードを変更したあと、変更前のパスワードでログインできないかの確認も、大切なことだと知りました。これが全部ではないというのも、セキュリティ対策の奥深さを知るには十分です。
本大会でお世話になった競技者のみなさま、スポンサー・Market Placeのみなさま、そして運営のみなさま、大変お世話になりました。また機会がありましたら、出場したいです。どうもありがとうございました。
このブログを読んで興味を持たれた方、次の出場者はあなたです。ロールをご覧いただくと分かる通り、ソフトウェアエンジニアじゃなくても大丈夫です。むしろそれ以外の方、チャレンジされてみてください。
それではみなさま、ごきげんよう。
参考資料
Softening Day 発表資料 (ブログの内容を一部含みます)
Softening Day プレゼンテーションの模様