業務する環境をセキュアにした話 番外編 〜CTF開催〜

f:id:k725a:20210831121606p:plain

前回出した記事(業務する環境をセキュアにした話 その3)の続編 & 番外編となります。

こんにちは!👋

テクノロジー本部サービス開発部でエンジニアをしている、江口・馬場・鈴木・@_k725です。

今回は、サービス開発部でCTF(Capture The Flag)を開催したので、そのレポートになります。

目的

サービス開発部とは

私達サービス開発部を有するサービス開発統括部では「未来の”はたらく”を自分のものにするサービスを、必要な人に素早く提供し、サービスを成長させる」というミッションを託された組織です。24サービスを同時開発できる体制を目標に、着々と新規事業を開発しています。

経緯

24サービスを同時開発するというミッションの一方で、開発スピードを優先するあまり、セキュリティ上不安があるコードがレビュー時に指摘されるケースが目に留まるようになってきました。

そのため、エンジニア全員のセキュリティ意識を高めるためにはどうしたらいいか、頭を悩ませていました。

1年前の2020年7月に、社内の勉強会の時間を使った簡易的なCTFを、江口が作った問題で実施します。内容は Firebase にホスティングされたチャットサービスを使って Firestore に格納されたフラッグを取り出すという比較的軽めの課題でしたが、様々な解法もあったことで、当日は非常に盛り上がりました。

本当は、コンスタントに小粒な課題を作成し、勉強会で簡易 CTF を出題したかったのですが、目の前の課題を優先するあまり、次の出題には至っていませんでした。

本来このようなイベントは、知識レイヤーが異なるメンバーが問題を出し合うことで知識レベルがあがっていったり、新しくジョインしたメンバーにセキュリティを考えてもらうタイミングになったりして、組織のカルチャーが形成されると思っています。

なので、定期的に行うことが何より大切なのですが、それができず、正直歯痒い思いでした。

せめて、今年も1回はCTFを開催したい…どうせやるなら、更に実践的な、Attack & Defence (以下 A&D) 形式にしたCTFイベントを開催したい…と思い立ったのが経緯です。

とはいえ、A&Dでは問題・環境を用意するコストが高いため、どうしたものか...と悩んでいました。

その件を馬場に相談したところ、インフラセキュリティチームでも組織内のセキュリティ意識に課題感を持っているということがわかりました。

このときからインフラセキュリティチームとコミュニケーションを取り始め、相談した結果、以下のような形式でCTFを開催することにしました。

  • 今回は A&D を諦めて、回答者にフラッグを見つけてもらうJeopardy形式のCTFにする
  • インフラセキュリティチームの馬場・鈴木・@_k725と江口でCTFの問題を持ち寄る
  • せっかくなのでチーム戦とし、プロジェクトを横断的に組み合わせた「いままで絡みがなさそうな人たち」で構成したチームにすることで、オンライン環境での新たなコミュニケーションのタッチポイントづくりを後押しする

インフラセキュリティチームとは

サービス開発部内で活動しているチームで、特定のプロジェクトに属さず、様々なプロジェクトへのアドバイスやサポート、部内で利用しているシステム・デバイスの管理、他部署との調整など行っているチームです。

現在は馬場・鈴木・@_k725の三人で活動を行っています。

やったこと

準備編 (インフラ)

CTFのスコアサーバとしては、数々のCTFで利用実績のあるCTFdを利用し、Google Cloud Platform上にサービスを構築しました。

Google Kubernetes Engine (GKE) Autopilot を使用しつつ、プライベートクラスタとして構築したこともあり、比較的堅牢な構成になったのかなという印象です。

特にGKEについては、本番中に多数のトラフィックが集中することで落ちる可能性を鑑みモニタリングも追加していましたが、特に大きな問題なく最後まで稼働し問題を提供できました。

f:id:k725a:20210831121706p:plain
インフラ構成図

上記図からは各問題のサーバは省いていますが、Googleの各種実行環境を活用し構築を行いました。

  • Google Compute Engine
    • Docker Engineを入れた上でTCPなどを用いた問題を実行するために利用しました。
  • Google Cloud Run
    • Dockerfileを適切に書き、 PORT 環境変数に基づきアプリケーションを実装するだけで容易に構築出来る環境です。httpのサーバサイドアプリケーションなどはこちらを主に利用しました。
  • Google App Engine
    • Cloud Runと同じくアプリケーションを実行できる環境ですが、Dockerfileではなく構成ファイルを書き、動作させる環境です。
  • Google Cloud Storage
    • スタティックなファイルのホスティングなどで利用を行いました。

準備編 (作問)

全体な質問の傾向として、サービス開発部で普段触らない分野の問題を作成していきました。

  • シングルページアプリケーションの中に仕込まれたフラグを取得する問題
  • x86のPEアプリケーションを解析してフラグを取得する問題
  • ファイルに隠されたフラグを取得する問題
    • 圧縮ファイル
    • 動画ファイル
    • PDFファイル
  • 弱い秘密鍵を特定してフラグを取得する問題
  • Dockerイメージを解析してフラグを取得する問題
  • ドメインなどに隠された情報からフラグを取得する問題
  • 脆弱性のある実行環境で動かしているアプリケーションからフラグを取得する問題
  • TCPサーバから問われた内容にひたすら回答してフラグを取得する問題

などなど、他にも色々ありますが様々な種類の問題を用意しました。

f:id:k725a:20210831121828p:plain
問題一例

当日編

事前に4チームに分かれてもらい、Slackのプライベートチャンネルでやり取りをしてもらいました。

f:id:k725a:20210831121853p:plain
目的が終わったらアーカイブ!

当日は特に大きなサーバ障害などもなく無事に終えることが出来ました。 時々、各チームの作戦場所のGoogle Meetなどにお邪魔し、進捗などを聞きながら運営を進行していましたが、「むずかしい!😣」との声もあり…。

10:15 ~ 18:30 で開催を行いましたが、それぞれのチームがかなり接戦となるタイミングも多く、運営側としても非常に見ていて面白い結果となりました。

f:id:k725a:20210831121916p:plain
結構接戦でした

また、優勝チームには豪華景品が贈呈されました 🎁

振り返り

イベント開催

サービスを開発してリリースするには、多くの規格や仕様として決められた技術を使うことになります。OSSなどで間接的に使っている場合も多くあり、意識することは少なくなってきていると思います。ただ、理解をしておくことで効率的な開発や安全な実装に繋がります。今回のイベント実施が、規格や仕様を知るキッカケとして有意義なものにすることが出来たと考えています。

運営として反省すべき点はありつつも(問題の難易度など)、丸一日かけ普段触らない分野に対して競う形で触れたのはよかったとフィードバックも頂きつつ、運営としてもしっかりと時間をかけて準備をした甲斐があったと感じました。

また実際に出題したことでわかったのですが、解答者の問題に対して感じる難易度は出題者の予想(具体的には得点)とは若干異なる傾向があり、自組織のエンジニアが何を得手不得手をするのか少し把握できたため、それも次の機会に活かすことができればと考えています。

回答者の感想

技能を活かせる宝探しのような感覚でとても楽しいイベントでした。 解答には知識だけでなく「ひらめき」が大事な面も多々あり、絶妙なバランスだと感じます。 作問や環境の準備だけでも相当大変だったことが窺い知れます。

私達のチームではリーダーが適切に進行し、メンバー同士がサポートしあうことで良い成績を出せました。 メンバーの誰かがフラッグを見つけるたび、チーム全体が沸き上がったのを覚えています。 一方で、解答に集中しすぎてしまい、あまり私からチームをサポートできなかったことが個人的な反省点です。

今回のCTFを通して新たな知識が身に付くとともに、セキュリティ意識が高まったように思います。 この場をお借りして、チーム及びCTF運営の皆さんに改めて感謝を申し上げます。

次回予告

実際に、コーディング時・サービス公開時に対してどのようなセキュリティ対策などを行っているか、解説しようと思います。 🙋‍♀️

江口 拓弥 Takuya Eguchi

エンジニアリング統括部 サービス開発部 第3グループ シニアエンジニア

2008年、地元山形のソフトハウスに入社するも、半年後に東京へ転勤。Webアプリケーションの受託開発とセールスエンジニアを3年経て、派遣先であった小さなSIerに転職。システム統合に伴うデータ整備業務を経験し、堅牢なシステムの作り方と運用に触れる。2018年に仙台に移住。Ruby on RailsとVue.jsを使用した受託開発業務を経験した後、パーソルキャリアにジョイン。Nuxt.jsとFirebaseを利用し、転職後アフターサービス「CAREER POCKET」を開発。その後は複数の新規サービスの開発に携わる。

マイポテ

馬場裕 Yutaka Baba

エンジニアリング統括部 サービス開発部 第3グループ シニアエンジニア

2017年にパーソルキャリア株式会社に入社。前職では、主に受託開発や客先常駐でWebサービスやアプリ、業務システムの開発。dodaに関連するサービスの開発に従事し、キーワード検索やアンケート機能、新規サービス開発を効率的に行うためのAPI開発を行う。現在は、開発環境の整備や新規サービスの開発フォローをするグループを立ち上げ、「より早く、より自由に、より安全に」を目標に業務を行っている。

alt

鈴木 大地 Daichi Suzuki

エンジニアリング統括部 サービス開発部 第3グループ リードエンジニア

@_k725

@_k725

エンジニアリング統括部 サービス開発部 第3グループ エンジニア

お寿司が好きです🍣

※2021年9月現在の情報です。

▶エンジニアリング統括部の求人ページはこちら