🚀

AWSでCTFdを構築しよう!

に公開

CTF・CTFdとは

CTF(Capture The Flag)とは、コンピューターセキュリティの知識と技術を競い合うセキュリティ競技です。
参加者はサーバーやWebアプリケーションに隠された「Flag(フラグ)」を探し出し、スコアを競います。

CTF運営者にとって課題となるのが、安全でスケーラブルな環境をどのように用意するか です。
そんなときに便利なのが、オープンソースのCTFプラットフォーム CTFd

本記事では、AWSのマネージドサービスを活用して ECS Fargate + RDS + EFS + ALB でCTFdを構築する手順を丁寧に紹介します。

手順

はじめに: 事前準備

本ガイドでは、ローカル環境からAWSへCTFdをデプロイします。
そのため、まず以下のツールをPCにインストールしておきましょう。

🧰 必要なツール一覧

ツール 用途 備考
Git CTFdのソースコードを取得する Zenn解説あり
Docker CTFdのコンテナイメージをビルド・実行する WindowsではWSL2が必要
AWS CLI AWSリソースの操作やECRへのログインに利用 AWSアカウント連携が必要

💡 インストール参考記事

環境構築が初めての方は、以下のZenn記事を参考に設定しておくとスムーズです。

⚙️ 動作確認

インストール後、以下のコマンドでバージョンが表示されれば準備完了です。

git --version
docker --version
aws --version

ステップ1: CTFdのDocker準備(ローカルPC)

AWSにデプロイする前に、ローカルでCTFdのDockerイメージを作成します。
これにより、アプリの動作を確認でき、ECSでも同じ環境を再現できます。

1. CTFdソースコードの取得

まず、GitHubからCTFdのソースコードを取得します。

git clone https://github.com/CTFd/CTFd.git cd CTFd

2. Dockerイメージのビルド

CTFdディレクトリ内で以下のコマンドを実行します。

docker build -t ctfd-app .

-t ctfd-app は、作成するDockerイメージの名前を指定しています。

3. ローカル実行で動作確認

ビルドしたイメージを使ってローカルで起動します。

docker run -p 8000:8000 ctfd-app

ブラウザで http://localhost:8000 にアクセスし、CTFdの初期画面が表示されればOKです。

ステップ2: AWS環境の準備

AWS上にCTFdを動かすためのネットワークとリポジトリを準備します。

1. VPCの作成

  1. AWSコンソールで VPC サービスを開く

  2. 「VPCを作成」をクリック

  3. 以下の設定を入力

    • 名前タグ: ctfd-vpc

    • サブネット数: パブリック2 / プライベート2

    • NATゲートウェイ: 無し(検証用)

  4. 「VPCを作成」をクリック

2. ECRリポジトリの作成

Dockerイメージを保存する場所を用意します。

  1. AWSコンソール → ECR サービス

  2. 「リポジトリを作成」 → 名前に ctfd-repo を入力

  3. 可視性: プライベート

  4. そのまま「作成」をクリック

3. ECRへのDockerイメージのプッシュ

ECRリポジトリの詳細画面で「プッシュコマンドの表示」をクリックし、
表示されたコマンドをローカルのターミナルで順に実行します。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
docker tag ctfd-app:latest <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/ctfd-repo:latest
docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/ctfd-repo:latest

ステップ3: データベースとストレージの準備

CTFdのデータとファイルを永続化するため、RDSとEFSを構築します。

1. RDS(MySQL)を作成

  1. AWSコンソール → RDS → 「データベースを作成」

  2. エンジン: MySQL

  3. テンプレート: 無料利用枠

  4. 設定

    • DBインスタンス識別子: ctfd-db

    • マスターユーザー名: admin

    • パスワード: 任意の強力な文字列

  5. 接続設定

    • VPC: ctfd-vpc

    • パブリックアクセス: 無効

  6. セキュリティグループ: ctfd-db-sg(後でECSから3306を許可)

  7. 追加設定 → 初期データベース名: ctfd

  8. 「データベースを作成」クリック

作成後、RDSエンドポイント(例: ctfd-db.xxxxx.ap-northeast-1.rds.amazonaws.com)を控えておきます。

2. EFS(永続ストレージ)

  1. AWSコンソール → EFS

  2. 「ファイルシステムを作成」クリック

  3. VPCに ctfd-vpc を選択

  4. セキュリティグループ: ctfd-efs-sg(ECSから2049を許可)

  5. 作成完了後、EFS IDを控える


ステップ4: ECSサービスの構築

1. タスク定義の作成

  1. AWSコンソール → ECS → 「タスク定義」 → 「新しいタスク定義の作成」

  2. 設定項目:

    • 起動タイプ: Fargate

    • CPU: 1 vCPU

    • メモリ: 2GB

    • コンテナ名: ctfd-container

    • イメージURI: ECRのURI

    • ポートマッピング: 8000/tcp

  3. 環境変数を設定

    DATABASE_URL=mysql+pymysql://admin:<RDSパスワード>@<RDSエンドポイント>:3306/ctfd UPLOAD_FOLDER=/var/uploads

  4. ボリュームを追加

    • 名前: ctfd-volume

    • タイプ: EFS

    • ファイルシステムID: 作成したEFS ID

  5. コンテナマウントポイント

    • ソースボリューム: ctfd-volume

    • コンテナパス: /var/uploads

  6. 「作成」をクリック

2. クラスターとサービスの作成

  1. クラスター名: ctfd-cluster

  2. サービス名: ctfd-service

  3. 起動タイプ: Fargate

  4. タスク定義: 作成したタスク定義を選択

  5. サブネット: パブリックサブネット

  6. セキュリティグループ: ctfd-ecs-sg

  7. ロードバランサー設定:

    • 新しいALB作成

    • 名前: ctfd-alb

    • リスナー: HTTP(80)

    • ターゲットグループ: ctfd-tg

    • ヘルスチェックパス: /

  8. 確認して「作成」をクリック


ステップ5: 動作確認

  1. ECSのサービスが「実行中」になるまで数分待機

  2. AWSコンソール → EC2 → 「ロードバランサー」から ctfd-alb を選択

  3. DNS名をコピーしてブラウザでアクセス

  4. CTFdのセットアップ画面が表示されれば構築成功です 🎉


ステップ6: 本番環境向けの改善ポイント

今回の構成(ECS + RDS + EFS + ALB)はシンプルで十分動作しますが、
本番運用では以下のサービスを追加することで安定性・セキュリティが大幅に向上します。

🔹 ElastiCache (Redis)

CTFdはセッション管理やキャッシュでRedisをサポートしています。
Amazon ElastiCache for Redis を導入すると:

  • ログインやスコア更新が高速化

  • 同時接続数が多いCTFでも安定

  • キャッシュ層をAWSが自動スケーリング

🔹 AWS Certificate Manager (ACM)

ALBにSSL証明書を適用してHTTPS化することで、通信を暗号化できます。

  • ACMで無料の証明書を発行

  • ALBリスナーにHTTPS(443)を追加

  • 自動更新で運用負荷を削減

🔹 その他のおすすめ設定

  • CloudWatch Logs: ECSやALBのアクセスログを一元管理

  • Secrets Manager: RDSパスワードを安全に管理

  • Auto Scaling: イベント開催時の負荷に応じて自動スケール


まとめ

本記事では、ECS Fargate + RDS + EFS + ALB を使ってCTFdをAWS上に構築する手順を紹介しました。
最小構成でも十分に動作しますが、ElastiCacheACM を組み合わせることで
「高速・安全・スケーラブルなCTF環境」が完成します。

AWSのマネージドサービスを活用して、
インフラ管理に悩まずCTF問題作成に集中できる環境 を手に入れましょう!

Discussion