fbctfを用いた社内技術コンテストの立ち上げ

#はじめに

昨年度、弊社の私が所属する事業部にて社内SE向け技術コンテストを開催しました。
各チーム三人で計７チーム、制限時間２時間で約60問の問題を解き、優勝チームに10万円の賞金を進呈する、というものです。

![shigoto_man_casual.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322145/a0ab0896-037c-a3d8-edab-5f994d8c5202.png)

ちょうど事業部内でAWSやAzure等の共通パブリッククラウド利用環境が立ち上がったところで、それを使って何かイベントを企画しよう! という軽い気持ちから検討が始まったのですが、研究開発発表のようなありきたりな企画ではなく、もっと楽しく、かつためになるイベントを開催しよう、と考えました。
そこで考えたのが、賞金を賭けてエンジニア同士が技術力を競い合う、技術コンテストの開催です。

さっそく企画書を作成し、上層部の許可を得て、正式にこのプロジェクトが発足の運びとなりました。
なお、当時企画書には、開催目的として以下のような項目を記載しています。

1.パブリッククラウドの利用促進
2.通常業務では触れることが少ない幅広い知見を獲得する。
3.技術スキルを競い合うことによるSEのモチベーション向上
4.参加、運営を通じた事業部全体のSEのコミュニケーションの活性化
5.潜在的なSE人材の発掘
6.継続的な開催、および表彰によるSEの地位向上、技術スキルの継続的向上。

![group_young_world.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322145/a9b2bd6e-0ecb-ee11-04f3-4eb1293be643.png)

ちなみに、世の中にある技術系のコンテストではSECCONやハッカソンなどが有名ですが、いずれもセキュリティやプログラミング技術など特定の技術分野に偏っているものが多く、SIerに属するエンジニアとしての総合力を問うコンテストとなるとあまり参考になるものが多くありません。
そこで、問題の出題形式、分野などを一から考え、事業部オリジナルの設問からなる技術コンテストを開催しよう、と言うことになりました。問われるのは総合的な技術力です。事業部内から公募し、問題作成などの運営を行う７名のチームが発足されました。準備期間は三ヶ月です。

#スコアサーバ選定
コンテストに用いるスコアサーバは、下記の理由によりfbctfを選定しました。
1.ユーザインターフェースが非常に格好良いこと。
2.導入が非常に容易であること。
3.競技中のスコアがリアルタイムに表示されること
4.問題によって得点、ボーナス得点、ヒントによる減点などが個別に設定できること

1は競技者のモチベーションを上げるために特に重要と考えます。fbctfは下記のように、世界地図の国を選ぶ形で問題を選択し、正解するとその国に自チームの旗が立つといったインタフェースで非常に本格的です。
　![fbctf.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322145/82608aa0-26c6-5323-3f50-81d97ab64643.jpeg "fbctfの画面")


#サーバ構築
今回、AWS上にサーバを構築をしましたが、スペックは下記のものを使用しました。
・構築、検証時：　t2.micro
・本番運用時 ：　t2.xlarge

構築、検証時は無料枠で使用できるタイプのインスタンスで運用し、これでも２～３人で同時に使用しても性能面では全く問題ありませんでしたが、実際の競技時は性能劣化や予期せぬサーバダウンによるスコアの消失などは許されないため、4vCPUモデルにて運用しました。
初回ログイン時にのみ多少時間がかかりますが、それ以降の競技時には全く問題なく稼働しています。

サーバの導入は極めて容易で、下記の手順にて導入します。
1.AWS（もしくはAzure）にて、Ubuntu 16.04 x64 のAMIからサーバーを構築
2.NTPの導入、およびfbctfのモジュール導入を行う。
詳細は下記サイトの、Development InstallationとManual (Alternate)の章の手順を参照下さい。
　　https://github.com/facebook/fbctf/wiki/Installation-Guide,-Development
上記を行うだけでfbctfのサービスが起動し、以降はサーバの再起動時にも自動的に起動するようになります。

#各種設定
https://<導入サーバのアドレス> でアクセスすると、以下のようなログイン画面が表示されます。（画面中央上は弊社ロゴを設定しています）
![login.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322145/64986762-db53-9526-b61e-1241d27d0739.jpeg)
右上のログインボタンから、ユーザ「admin」、パスワードは導入時のスクリプトの応答で提示されたパスワード（ランダムな非常に長い文字列）を入力すると、管理者権限でスコアシステムにログインできます。
管理者ユーザでも競技は可能ですが、通常は競技用ユーザとして複数チームの登録を行って運用をします。
管理者は、下記手順にてスコアサーバの設定を行っていきます。

##チーム登録
管理者画面から手入力にてチームを登録することも可能ですが、2019/12月時点でのバージョンでは一定数以上のチームの登録が行えないようです。
そのため、登録用のjsonファイルを作成してチームを登録します。登録は
　GAME ADMIN > CONTROLS > TEAMS > IMPORT TEAMS　
から行います。
jsonファイルのフォーマットは、同じメニューにある EXPORT TEAMS で出力されるデフォルトチームのフォーマットと同様なので、それを参考にして作成します。

##カテゴリ登録
fbctfは、問題のタイプとしていくつか選択ができますが、社内の技術コンテストとしては「flag」のタイプを選択するのが良いと思います。「QUIZ」と異なり「flag」のタイプでは問題のカテゴリを分類できるため、広範囲の技術知見を問うような問題の場合は有益です。
チームの時と同様、GAME ADMIN > CONTROLSからカテゴリ登録を行います。
なお、今回は下記のようなカテゴリを登録し、問題を作成しました。
・セキュリティ
・データベース
・インターネット
・プログラミング
・パブリッククラウド
・暗号解読
・ネットワーク
・社内情報
社内情報とは、社内ポータルに掲載されるような情報のことです（例：社内における○○窓口の連絡先のメールアドレスは？等）。

##問題登録
ここまで登録したら、いよいよ問題の登録です。問題は上記カテゴリ別に運営チームの各自が約80問作成し、それを別のメンバーにて検算し、選定後難易度に応じて配点を決定して登録しました。問題作成＆選定期間は約二ヶ月です。
なお、問題の形式として選択式の問題では何回か回答を繰り返すと正解にたどり着けてしまうため、問題文を工夫して全て記述式の問題でかつ回答のゆらぎが無いものを作成しています。
出題内容はTeamsの専用チャネル上のExcelに取りまとめ、これを同様にjson形式に変換して登録しました。
上記同様、GAME ADMIN > CONTROLSからIMPORTできます。
なお、競技終了後、問題とその模範回答集は全て公開しています。

##競技開始
上記まで準備が終了したら、競技を開始できます。adminユーザでログインし、GAME STARTを押すと競技が開始され、各ユーザで問題の解答ができるようになります。当社では競技時間2時間に設定してゲームを行いました。
なお、競技開始前でも、競技者は問題の内容を確認することは可能です。
![computer_programming_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322145/7dda00d5-eee7-79b6-a770-0234158c9f33.png)


##運用
競技スコアは、ゲームを開始したタイミングで前回のデータが消されてしまいます。そのため、消されたく無いスコアはバックアップを取る必要があります。こちらも、GAME ADMIN >　CONTROLS > UTILITIES からバックアップ、およびリストアが可能です。
なお、fbctfはmySQLのデータベース上で管理されているため、直接mySQLのctfスキーマの中を確認することでもスコアは確認可能です。例えばゲーム終了後各問題の正答率などを分析する際には、activity_logテーブルの内容を解析する形になります。このスコアのデータ化は次回開催時の課題として進めていく予定です。

#開催当日
午後６時から競技説明、３０分後に各チームに別れた島に座り競技開始、終了後に全員でビールでの簡単な打ち上げ。その後難問の解説、順位発表を行い、非常に盛り上がりました。優勝チームはその後全事業部員を対象としたキックオフ会場にて表彰もしています。

#開催を終えて
当初企画書に記載した目的は全て達成したと考えています。参加者を対象にした事後アンケートでも８割以上の方が「非常に満足度が高い」と回答しており、技術に対する興味が沸いた、日々の業務に対してもモチベーションを高く望めるようになった、といった感想もを頂いています。
そのため、現在第二回の開催を計画しており、さらに規模を広げて全社で同様の企画を立ち上げることも検討中です。コンテストとしては半年に一回のペースで今後開催し続けていく計画としています。
![pose_gutspose_business.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322145/20ea720a-a720-62a3-ba51-3ac53ba11494.png)

#おわりに
以上、fbctfを用いた社内の技術コンテスト立ち上げの概要についてお伝えいたしました。こうしたコンテストは運営する側の手間もそれなりにかかるものですが、かけた時間の分参加者には真剣さ度合いが伝わり、非常に充実したイベントとなったと感じました。また参加者側も運営する側も技術的な知見を得ることができ、SEがお互いをリスペクトできる風土の醸成にも寄与できたと考えます。ぜひこの記事をご覧の方々も試してみていただければ幸いです。