STORES 株式会社 技術基盤グループの id:atpons です。2024/11/23 〜 2024/11/24 にかけて、SECCON CTF 13 予選 のスコアサーバーの構築、運用を行いました。今回はその活動についてご紹介します。
SECCON について
SECCON は日本の情報セキュリティコンテストイベントです。日本においては大きな CTF 競技とされています。
id:atpons は SECCON 実行委員 (LifeMemoryTeam) という有志の団体のメンバーとして、インフラ周りの整備 / NOC (ネットワーク) を 2019 年から行っています。SECCON はコンテスト以外にもカンファレンスなども開催しており、クラウドインフラだけではなく、現地会場のネットワークの対応もしています。
その中でも、SECCON CTF は SECCON が実施する CTF (Capture The Flag) です。2020 年から SECCON は賞金付きの CTF として開催しており、総額 100 万円の賞金などを用意していたり、日本の著名 CTF プレイヤーが作問に参加している大きなイベントで、様々な企業にスポンサードしていただき、ボランティアベースで運営しています。
予選・本戦のしくみ
予選はオンライン 24 時間で行われ、予選の結果を基に本戦をオフライン会場で行う仕組みです。
CTF はセキュリティに関係する問題を解いてフラグをゲットしてもらい、それをスコアサーバーというものに入れてい合っていれば点数がとれるというものです。 私はこのうち、スコアサーバーの開発と運用を行っています。
もし CTF に興味を持ったら、SECCON では GitHub で過去問を公開していますので、ぜひチャレンジしてみてください。今回の開催分についてもアーカイブの公開を予定しています。
2024 年は数千名の方にプレイいただきました。
インフラ構成
クラウド上に仮想マシンを用意し、CTF 問題とスコアサーバーを動かしています。急激なトラフィック増に耐えられるように複数台構成にしたり、Redis によるキャッシュを導入しています。
このうち、私はスコアサーバーのバックエンドの開発を行っています。バックエンドは Go 製のアプリケーションとなっており、Go の新しい Redis ライブラリ rueidis を使ったりしています。
rueidis では、Client-side caching と呼ばれる、クライアント側でのキャッシュをサポートしており、更新頻度の少ないキャッシュにおいて往復を減らせる機能がサポートされているので、通常のキャッシュに加えてネットワーク帯域の利用を減らすことが出来ています。
以前は Kubernetes などの採用を行っていましたが、systemd では標準出力のログも管理できるため、systemd でログの書き出し含め動作させています。
IdP の内製と Passkey
SECCON では、2022 年からフルスクラッチで IdP の内製 (SECCON ID) を行って運用しており、OAuth 2.0 サーバーを実装しています。理由としては、SECCON では参加者属性などを収集しており、既存の IdP ではそのような特殊な要件を満たすのが難しかったためです。
今回は、この IdP で実験的に Passkey にも対応しました。
特に Passkey の種類の判別などもなく、キーの名前も自分で命名してもらうようなシンプルな実装となっています。こちらは去年始めから実装を進めていたのもあり、最新の WebAuthn API に合っていない部分もあるため、今後のオフライン会場に向けて追従していきたいと考えています。
本戦に向けて
今回、予選に参加いただいたみなさま、SECCON にご協力、関係していただいている皆様にこちらで感謝を申し上げたいと思います。ありがとうございました!
また、SECCON CTF 13 Finals (SECCON CTF 13 決勝戦) は 2025/3/1 ~ 2025/3/2 に開催予定となっており、みなさんにも見ていただける形の CTF の本戦、そして併催されるカンファレンスのネットワーク構築等を進めています。
インフラ面のアップデートとしては、昨年、SECCON ID と連携したカンファレンス用の Wi-Fi システムを開発しました。その際は SECCON ID から Captive Portal へログインするための ID / パスワードを発行するものでしたが、今年もそちらの改善に向けて動いています。
今後もインフラ面でのチャレンジやアップデートをお届けできればと思いますので、楽しみにしていただければと思います!