appsettings.json の設定
appsettings.json ファイルは GZCTF のコア設定ファイルで、コンテナ内にマウントすることで設定します。この記事では、設定ファイルの各フィールドの意味を説明します。
appsettings.json の更新は、GZCTF サービスを再起動するたびに反応されます。
設定ファイルの構造
以下に完全な設定ファイルの例を示します:
コア機能の設定フィールド
ConnectionStrings
ここでは、データベースの接続を構成できます。
Database
このフィールドは必須です。
GZCTF は PostgreSQL をバックエンドデータベースおよびデータ永続化に使用します。
GZCTF はデータベースとして PostgreSQL のみをサポートしており、MySQL などの他のデータベースはサポートしていません。設定ファイルに正しいデータベース接続文字列を記入してください。
RedisCache
このフィールドはオプションです。
GZCTFはRedis をキャッシュおよびメッセージキューとして使用します。単一インスタンスのデプロイでは Redis は必須ではなく、GZCTF のメモリキャッシュを直接使用できます。複数インスタンスのデプロイでは、Redis は必須であり、共有キャッシュおよび SignalR の Scale-Out ブロードキャストとして使用されます。
v1.0以降、GZCTFはガーネットをキャッシュサービスとして使用することをサポートしています。
Storage
このフィールドはオプションです。
GZCTFは2種類のストレージプロバイダーをサポートしています:
-
ローカルディスクストレージ(デフォルト)
disk://path=./filespath: 任意。ファイルをローカルに保存するパス(デフォルト:./files)
-
S3互換ストレージ (AWS S3、MinIO、DigitalOcean Spaces など)
s3://accessKey=...;secretKey=...;bucket=...;region=...または便宜上、特定のスキームを使用できます:
aws.s3://...(equivalent tos3://...)minio.s3://...(equivalent tos3://...)
パラメータ:
accessKey: 任意。Access Key IDsecretKey: 任意。Secret Access Keybucket: Bucket 名region: リージョン(例:us-east-1)endpoint: 任意。カスタムエンドポイント URL(MinIO または他の S3 互換サービス用)useHttp: 任意。HTTPS の代わりに HTTP を使用するかどうか(デフォルト: false)forcePathStyle: 任意。パススタイル URL を使用するかどうか(デフォルト: false)
詳細については、以下のリンクを参照してください:
Logging
ロギングレベルとスコープを設定することができます。さらに、GZCTF は Loki サーバーへのログ送信もサポートしています。
- LogLevel: 名前空間ごとの最小ロギングレベル。
- Loki: Loki サーバーの設定。
- Enable: 有効にするかどうか。
- EndpointUri: Loki サーバーの URI。
- Labels: 任意。グローバルログイベントラベル。
- PropertiesAsLabels: 任意。Loki のラベルにマップするべきプロパティのリスト。
- Credentials: 任意。基本認証に使用される資格情報。
- Tenant: 任意。Loki サーバーへのログ送信に使用されるテナント ID。
- MinimumLevel: 任意。最小ロギングレベル。
利用可能なロギングレベル: Trace, Debug, Information, Warning, Error, Critical, None。
Telemetry
GZCTF はメトリクスと分散トレーシングをサポートしています。使用するプロバイダーを設定できます。
-
Prometheus: Prometheus エンドポイント。
- Enable: 有効にするかどうか。
- TotalNameSuffixForCounters: 任意。カウンタに
_totalサフィックスを含めるかどうか。
-
OpenTelemetry: メトリクスとトレーシングデータを OpenTelemetry にエクスポートします。
- Enable: 有効にするかどうか。
- Protocol:
GrpcまたはHttpProtobuf。 - EndpointUri: テレメトリーデーターがプッシュされる OpenTelemetry エンドポイント URI。
-
AzureMonitor: メトリクスとトレーシングデータを ApplicationInsights にエクスポートします。
- Enable: 有効にするかどうか。
- ConnectionString: 接続文字列。
-
Console: トレーシングデータをコンソールにエクスポートします。
- Enable: 有効にするかどうか。
EmailConfig
ここではメール送信に関する情報を設定します。メールでの登録やその他のメール機能を使用する場合、この項目は必須です。
- SenderAddress: 送信者のメールアドレス
- SenderName: 送信者の名前
- UserName: SMTP サーバーのユーザー名
- Password: SMTP サーバーのパスワード
- Smtp: SMTP サーバーのアドレスとポート
- BypassCertVerify: 証明書の検証をバイパスするかどうか
一部のクラウドサービスプロバイダの制限により、465 ポートを使用してメールを送信できない場合があります。その場合は、587 ポートを試してみてください。
XorKey
ここでは暗号化キーを設定します。これは、データベース内のゲームの秘密鍵情報を暗号化するために使用されます。任意の長さの任意の文字列を使用できます。
ContainerProvider
ここではコンテナバックエンドを設定します。これは、ゲームで動的にコンテナを作成するための必須項目です。
- Type: コンテナバックエンドのタイプ。
DockerまたはKubernetesを選択できます。 - PublicEntry: コンテナバックエンドの公開アドレス。これは、ゲームのアクセスアドレスを生成し、参加チームに表示するために使用されます。
- PortMappingType: ポートマッピングのタイプ。
DefaultまたはPlatformProxyを選択できます。 - EnableTrafficCapture: トラフィックキャプチャを有効にするかどうか。
PortMappingTypeがPlatformProxyに設定されている場合のみ使用できます。有効にすると、/app/files/captureディレクトリにトラフィックが記録されます。
Docker
Docker Swarm は v1.8.0 以降サポートされなくなりました。より高いセキュリティとスケーラビリティのため、Kubernetes の使用を推奨します。
-
Uri: Docker API Server のアドレス
- ローカルの Docker を使用する場合は、
Uriを空にし、/var/run/docker.sockをコンテナの対応する位置にマウントします。 - 外部の Docker を使用する場合は、
Uriを対応する Docker API Server に指定します。外部 API の認証はまだ実装されていないため、このデプロイ方法は推奨されません。
- ローカルの Docker を使用する場合は、
-
ChallengeNetwork:
v1.8.0 以前
チャレンジコンテナが所属するネットワークを指定します。指定しない場合は、デフォルトの Docker ネットワークが使用されます。
v1.8.0 以降
チャレンジネットワークを作成するためのネットワークプレフィックスとして扱われます。GZCTF はネットワークモードごとに 2 つのネットワークを自動的に作成します。オープンネットワークモードには
<ChallengeNetwork>-open、隔離ネットワークモードには<ChallengeNetwork>-isolatedが使用されます。また、自分で
<ChallengeNetwork>-customネットワークを作成してカスタムネットワークモードに利用することもできます。要件に合わせて自由に設定してください。 -
UserName, Password: Docker API Basic Auth のユーザー名とパスワード。オプションです。
Kubernetes
- Namespace: Kubernetes の名前空間。チャレンジインスタンスを作成するための名前空間で、デフォルトは
gzctf-challengesです。 - ConfigPath: Kubernetes の設定ファイルのパス。クラスタに接続するために使用します。デフォルトは
kube-config.yamlです。 - AllowCIDR: Pod へのアクセスを許可する CIDR ホワイトリスト。
- DNS: クラスタ DNS を避けるためのカスタム DNS サーバーリスト。
デフォルトの動作は、クラスタ接続設定をkube-config.yamlファイルに入れ、それを/appディレクトリにマウントすることです。実験的な機能は、行動を理解していない限り、変更しないでください。
kube-config.yamlファイルのserverフィールドを変更し、クラスタの API Server アドレスを指定することに注意してください。クラスタのデフォルトアドレスは通常https://127.0.0.1:6443で、クラスタの実際のアドレスに変更する必要があります。
v1.8.0 以前
基本的なネットワーク分離を実現するために、GZCTF はチャレンジの Namespace に gzctf-policy という名前の NetworkPolicy を作成してアクセスを制限します。GZCTF はこの NetworkPolicy が既に存在するかどうかを自動的に検出し、存在する場合は再作成しません。そのため、この NetworkPolicy を作成または編集することでネットワークポリシーをカスタマイズできます。
v1.8.0 以降
GZCTF はチャレンジの Namespace に gzctf-network-open と gzctf-network-isolated という 2 つの NetworkPolicy を作成し、それぞれオープンネットワークモードと隔離ネットワークモードのアクセス制御に使用します。GZCTF がこれらの NetworkPolicy を自動的に管理するため、手動で変更・削除しないでください。
同じ Namespace 内に追加の NetworkPolicy を作成することで、独自のネットワークポリシーを定義できます。ターゲット Pod は次のラベルを使用して選択できます。
gzctf.gzti.me/TeamId: 特定のチームを選択gzctf.gzti.me/UserId: 特定のユーザーを選択gzctf.gzti.me/ChallengeId: 特定のチャレンジを選択gzctf.gzti.me/NetworkMode: 特定のネットワークモードを選択(open、isolated、custom)
RequestLogging
ここでは、リクエストログの記録を有効にするかどうかを設定します。有効にすると、ログに各リクエストの詳細情報が出力されます。この出力には静的ファイルのリクエストは含まれません。
この設定項目はリクエストの具体的な情報を記録しますが、ログファイルのサイズおよびプラットフォームの同時実行性能に大きな影響を与える可能性があるため、デバッグ時にのみ有効にしてください。
DisableRateLimit
ここでは、リクエストの頻度制限を有効にするかどうかを設定します。有効にすると、事前に設定したルールに基づいて、各 IP と API のリクエスト頻度が制限されます。
この設定はプラットフォームの安全性の基礎となるものであり、テスト環境以外で無効化した場合の結果については自己責任となります。
正しく設定されたほとんどのケースでは、ユーザーがレート制限に達することはありません。通常の使用中に頻繁にレート制限が発生したり、バックエンドログに異常なIP情報(例:同一IPから大量のリクエスト)が表示される場合は、リバースプロキシの信頼できるプロキシ設定を確認してください。
この設定を有効にすると、GZCTF は非常に少ないリソースで通常のリクエストの数十倍に達する悪意のあるリクエストを防ぎ、プラットフォームの正常な動作を確保することができます。
RegistryConfig
この設定項目は非推奨となり、Registries フィールドを使用して定義してください。
Registries
ここでは、Docker Registry のユーザー名とパスワードを設定します。これは、ゲームで動的にコンテナを作成する際にイメージをプルするための認証で、オプションです。
パスワードに特殊文字(":@など、ただし_は使用可能)が含まれていないことを確認してください。そうでないと、テンプレートインジェクションの問題が発生し、Secret の作成に失敗する可能性があります。
CaptchaConfig
ここでは、キャプチャ関連の情報を設定します。これは、登録、アカウントの回復、ログイン時のキャプチャの検証に使用されます。オプションです。
- Provider: キャプチャのプロバイダ。
None、HashPowまたはCloudflareTurnstileを選択できます。 - SiteKey: キャプチャの Sitekey
- SecretKey: キャプチャの Secretkey
安全性を確保し、プラットフォームが悪意のある登録やメールのクォータ消費などの問題に巻き込まれないようにするため、キャプチャ機能の有効化を強くお勧めします。
CloudflareTurnstile キャプチャプロバイダーの使用を推奨します。関連文書。
HashPow
HashPow キャプチャの関連情報を設定します。オプションです。
安全なコンテキスト用: この機能は一部またはすべての対応しているブラウザーにおいて、安全なコンテキスト (HTTPS) でのみ利用できます。
- Difficulty: HashPow キャプチャの難易度。ハッシュビットの先頭にあるゼロの数を指定するために使用されます。利用可能な範囲は 8 から 48 です。
GoogleRecaptcha
この機能は非推奨となり、v1.2.2以降で削除されます。これは上流依存関係のメンテナンス不足によるものです。
代わりに CloudflareTurnstile CAPTCHAプロバイダをご利用ください。
Google Recaptcha v3 の関連情報を設定します。オプションです。
- VerifyAPIAddress: Google Recaptcha の検証 API アドレス
- RecaptchaThreshold: Google Recaptcha の閾値。キャプチャが有効かどうかを判断するために使用します。
ForwardedOptions
ここでは、リバースプロキシの関連情報を設定します。これは、実際の IP アドレスを取得するために使用されます。オプションです。
- ForwardedHeaders: リバースプロキシが転送するヘッダーの列挙型。デフォルトは
7を使用してください。詳細は ForwardedHeaders 列挙型を参照してください。 - ForwardLimit: リバースプロキシの層数制限
- ForwardedForHeaderName: リバースプロキシの IP アドレスヘッダー名
- KnownIPNetworks: リバースプロキシが信頼するネットワークのリスト。CIDR で表現します。
- KnownProxies: リバースプロキシが信頼するプロキシのリスト。IP アドレスまたはドメイン名で表現します。
リバースプロキシの信頼リストを無視し、任意の IP アドレスからのアクセスを許可したい場合は、Linux および非 IIS のリバース プロキシのスキームを転送するを参照し、環境変数ASPNETCORE_FORWARDEDHEADERS_ENABLEDをtrueに設定してください。
他のフィールドについては、公式ドキュメントの説明を参照してください:プロキシ サーバーとロード バランサーを使用するために ASP.NET Core を構成するおよびForwardedHeadersOptions クラス
Kestrel
Kestrel は GZCTF が内蔵して使用している Web サーバーです。
この設定を利用すると、HTTP プロトコルを指定したり、リクエストのサイズ上限を変更したりと、Kestrel の動作を自由に制御することができます。
他の設定フィールドについては、公式ドキュメントのKestrelServerOptionsクラスの属性を参照してください:KestrelServerOptions クラス。