• 日本語
  • クイックスタート

    GZCTF は Docker イメージを通じて提供され、docker-compose を通じて完全に機能する CTF プラットフォームを迅速にデプロイできます。 これが唯一のデプロイ方法ではないことに注意してください。Kubernetes の使用をお勧めします。

    Warning

    GZCTF のセキュリティとフロントエンド機能 (クリップボードの操作など) は HTTPS に依存しています。このセクションで説明するデプロイ方法は HTTPS サポートを提供していないため、運用環境での使用には適していません、ローカルテストだけのためにで使用してください。

    本ドキュメントではHTTPSの設定方法については説明しておりません。nginx、traefik、その他のソフトウェアの設定方法や使用方法についてはご自身でお問い合わせください。GZCTFのWebSocket機能も別途設定が必要な場合がありますのでご了承ください。ゲーム通知をプッシュできない場合は、まずリバース プロキシの設定を確認してください。

    インストレーション

    Info

    GZCTF の使用をすぐに開始するには、Docker と docker-compose をインストールする必要があります。関連するインストール手順は、Docker 公式 Web サイト まで参照してください。

    1. 構成を円滑に進められるために、次の初期化パラメータを準備してください。

      • GZCTF_ADMIN_PASSWORD:初期管理者パスワード。 データベースが初期化されていない状態で有効となり、初回起動時に設定する必要があり、compose.yml で設定する必要があります。
      • POSTGRES_PASSWORD: データベースのパスワード。compose.ymlappsettings.json で設定する必要があります。
      • XOR_KEY: ゲーム秘密鍵の暗号化に使用されるランダムな文字列。appsettings.json で設定する必要があります。
      • PUBLIC_ENTRY: 外部アクセス アドレス。IP アドレスまたはドメイン名であり、プロジェクト コンテナにアクセスするためのアドレスを参加者に提供するために使用されます。appsettings.json で設定する必要があります。
    2. 次のコンテンツを appsettings.json ファイルとして保存し、初期化パラメーターに置き換えってください。具体的な構成手順については、appsettings.json 構成 を参照してください。

      {
        "AllowedHosts": "*",
        "ConnectionStrings": {
          "Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=<Your POSTGRES_PASSWORD>"
        },
        "EmailConfig": {
          "SenderAddress": "",
          "SenderName": "",
          "UserName": "",
          "Password": "",
          "Smtp": {
            "Host": "localhost",
            "Port": 587
          }
        },
        "XorKey": "<Your XOR_KEY>",
        "ContainerProvider": {
          "Type": "Docker", // or "Kubernetes"
          "PortMappingType": "Default", // or "PlatformProxy"
          "EnableTrafficCapture": false,
          "PublicEntry": "<Your PUBLIC_ENTRY>", // or "xxx.xxx.xxx.xxx"
          // optional
          "DockerConfig": {
            "Uri": "unix:///var/run/docker.sock"
          }
        },
        "CaptchaConfig": {
          "Provider": "None", // or "CloudflareTurnstile" or "HashPow"
          "SiteKey": "<Your SITE_KEY>",
          "SecretKey": "<Your SECRET_KEY>"
        },
        "ForwardedOptions": {
          "ForwardedHeaders": 7,
          "ForwardLimit": 1,
          "KnownIPNetworks": ["192.168.12.0/8"]
        }
      }
    3. 次のコンテンツを compose.yml ファイルとして保存し、初期化パラメーターに置き換えってください。利用可能なバックエンド言語は en-US, zh-CN, zh-TW, ja-JP, id-ID, ko-KR, ru-RU, de-DE, fr-FR, es-ES, vi-VN です。

      services:
        gzctf:
          image: gztime/gzctf:latest
          restart: always
          environment:
            - "GZCTF_ADMIN_PASSWORD=<Your GZCTF_ADMIN_PASSWORD>"
            # choose your backend language `en_US` / `zh_CN` / `ja_JP` ...
            - "LC_ALL=ja_JP.UTF-8"
          ports:
            - "80:8080"
          volumes:
            - "./data/files:/app/files"
            - "./appsettings.json:/app/appsettings.json:ro"
            # - "./kube-config.yaml:/app/kube-config.yaml:ro" # this is required for k8s deployment
            - "/var/run/docker.sock:/var/run/docker.sock" # this is required for docker deployment
          depends_on:
            - db
      
        db:
          image: postgres:alpine
          restart: always
          environment:
            - "POSTGRES_PASSWORD=<Your POSTGRES_PASSWORD>"
          volumes:
            - "./data/db:/var/lib/postgresql"
    Info

    ネットワーク セグメントの競合が発生する可能性があります。その場合は compose.yml のサブネット構成 または /etc/docker/daemon.json のネットワーク セグメント構成を変更してください。

    networks:
      default:
        driver: bridge
        ipam:
          config:
            - subnet: 192.168.12.0/24
    1. docker compose up -d を実行して GZCTF を起動して、ブラウザから GZCTF にアクセスできるようになります。

    初期管理者

    生産環境にはデフォルトで管理者権限を持つユーザーが存在しないため、初回起動時に環境変数 GZCTF_ADMIN_PASSWORD を設定して初期管理者パスワードを設定し、Admin アカウントでログインする必要があります。

    データベースエントリを手動で変更することで、現在登録されているユーザーを管理者として設定することもできます。管理者アカウントが登録を完了し、正常にログインしたら、選択したデータベース テーブルに入り、次を実行します。

    UPDATE "AspNetUsers" SET "Role"=3 WHERE "UserName"='your_admin_user_name';

    次のコマンドが使用される場合もあります:

    docker compose exec db psql -U postgres
    psql (15.2)
    Type "help" for help.
    
    postgres=# \c gzctf
    You are now connected to database "gzctf" as user "postgres".
    gzctf=# #do your sql query

    Garnet/Redisをキャッシュとして使用する

    Garnet/Redis をキャッシュとして使用して、よりシームレスなバージョンの切り替えとサーバーの再起動エクスペリエンスを実現する場合は、上記の構成に次のコンテンツを追加してください:

    1. ファイル compose.yml

      services:
        gzctf:
          # ...
          depends_on:
            - db
            - cache
      
        cache:
          # It is recommended to use garnet, you can also use redis:alpine
          image: ghcr.io/microsoft/garnet-alpine:latest
          command: ["--bind", "0.0.0.0"]
          restart: always
      
        db:
          # ...
    2. ファイル appsettings.json

      {
        "AllowedHosts": "*",
        "ConnectionStrings": {
          // ...
          "RedisCache": "cache:6379,abortConnect=false"
        }
        // ...
      }

    そして、docker compose up -d を実行して GZCTF をリスタートすればよいです。

    コンテナイメージ

    GZCTF は、Docker イメージとして事前に構築およびパッケージ化されており、Docker Hub で見つけることができます。

    イメージを取得するには、次の 2 つのコンテナー レジストリを使用してください。

    gztime/gzctf:latest
    ghcr.io/gztimewalker/gzctf/gzctf:latest

    テスト版と開発版には develop イメージタグを使用してください。

    チャレンジ構成

    チャレンジの構成と例については、GZCTF-Challenges をご覧ください。

    また、W4terCTF 2023 の公開チャレンジを参照することもできます。ここでのチャレンジはすべて、Docker イメージのサイズが確実に小さくなるように設計されています。チャレンジが正常に機能している場合は十分ですが、ゲーム中に迅速にデプロイするには十分です。

    チャレンジ コンテナのベース イメージとして GZCTF Challenge Base を使用することをお勧めします。これらのベース イメージは可能な限り最小限に抑え、定期的に更新しています。これらを使用することで、チャレンジ コンテナがイメージ レイヤーを最大限に共有できるようになり、ストレージ スペースの使用量とイメージ プル時間を短縮できます。

    GZCTF は、GZCTF_FLAG 環境変数をコンテナに挿入することで動的なフラッグ配布が実装されています。そのため、この環境変数のテキストがチャレンジのコンテナ初期化スクリプト内の適切な場所に配置されていることを確認してください。 この環境変数は、コンテナー イメージのビルド時ではなく、コンテナーの起動時に初期化されることに注意してください。