配置
appsettings.json

appsettings.json 配置

appsettings.json 文件是 GZCTF 的核心配置文件,通过挂载入容器内的方式进行配置。本篇将介绍配置文件的各个字段的含义。

appsettings.json 的每次更新都需要重启 GZCTF 服务才能生效。

配置文件结构

此处给出一个完整的配置文件示例:

{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Database": "Host=db:5432;Database=gzctf;Username=postgres;Password=<Database Password>"
    // redis is optional
    //"RedisCache": "cache:6379,password=<Redis Password>"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "EmailConfig": {
    "SendMailAddress": "a@a.com",
    "UserName": "",
    "Password": "",
    "Smtp": {
      "Host": "localhost",
      "Port": 587
    }
  },
  "XorKey": "<Random Key Str>",
  "ContainerProvider": {
    "Type": "Docker", // or "Kubernetes"
    "PortMappingType": "Default",
    "EnableTrafficCapture": false,
    "PublicEntry": "ctf.example.com", // or "xxx.xxx.xxx.xxx"
    "DockerConfig": {
      // optional
      "SwarmMode": false,
      "ChallengeNetwork": "",
      "Uri": "unix:///var/run/docker.sock"
    },
    "K8sConfig": {
      // optional
      "Namespace": "gzctf-challenges",
      "ConfigPath": "k8sconfig.yaml",
      "AllowCIDR": [
        // allow the cluster CIDR for LB
        "10.0.0.0/8"
      ],
      "DNS": [
        // custom DNS to avoid cluster DNS
        "8.8.8.8",
        "223.5.5.5"
      ]
    }
  },
  "RequestLogging": false,
  "DisableRateLimit": false,
  "RegistryConfig": {
    "UserName": "",
    "Password": "",
    "ServerAddress": ""
  },
  "CaptchaConfig": {
    "Provider": "None",
    "SiteKey": "...",
    "SecretKey": "...",
    "GoogleRecaptcha": {
      "VerifyAPIAddress": "https://www.recaptcha.net/recaptcha/api/siteverify",
      "RecaptchaThreshold": "0.5"
    }
  },
  "ForwardedOptions": {
    "ForwardedHeaders": 5, // a flag enum, see following link
    "ForwardLimit": 1,
    "ForwardedForHeaderName": "X-Forwarded-For",
    // use the following options to allow proxy
    "TrustedNetworks": ["10.0.0.0/8"],
    "TrustedProxies": ["10.0.0.1"]
  },
  "Kestrel": {
    "Limits": {
      "MaxResponseBufferSize": 2048,
      "MaxRequestBufferSize": 1048576,
      "MaxRequestLineSize": 8192,
      "MaxRequestHeadersTotalSize": 32768,
      "MaxRequestHeaderCount": 100,
      "MaxRequestBodySize": 27262946,
      "KeepAliveTimeout": "0.0:5:0",
      "RequestHeadersTimeout": "0.0:5:0",
      "MaxConcurrentConnections": null,
      "MaxConcurrentUpgradedConnections": null
    },
    "AddServerHeader": true,
    "AllowResponseHeaderCompression": true,
    "AllowSynchronousIO": false,
    "AllowAlternateSchemes": false,
    "DisableStringReuse": false,
    "ConfigurationLoader": null
  }
}

核心功能配置字段

ConnectionStrings

此处配置数据库连接字符串,其中 Database 为必填项,RedisCache 为可选项。

GZCTF 使用 PostgreSQL 作为后端数据库和数据持久化,使用 Redis 作为缓存和消息队列。单实例部署的情况下 Redis 不是必须的,可以直接采用 GZCTF 的内存缓存;多实例部署的情况下,Redis 是必须的,用作共享缓存和 SignalR 的 Scale-Out 广播。

GZCTF 仅支持 PostgreSQL 作为数据库,不支持 MySQL 等其他数据库。请在配置文件中填写正确的数据库连接字符串。

EmailConfig

此处配置邮件发送相关信息,若采用邮箱注册和其他相关邮件功能,此处为必填项。

  • SendMailAddress: 发件人邮箱地址
  • UserName: SMTP 服务器用户名
  • Password: SMTP 服务器密码
  • Smtp: SMTP 服务器地址和端口

由于部分云服务厂家限制,可能无法采用 465 端口发送邮件。此时请尝试使用 587 端口。

XorKey

此处配置加密密钥,用于加密数据库中比赛的私钥信息,可为任意长度的任意字符串。

ContainerProvider

此处配置容器后端,为比赛动态创建容器的必填项。

  • Type: 容器后端类型,可选 DockerKubernetes
  • PublicEntry: 容器后端的公网地址,用于生成比赛的访问地址,展示给参赛队伍。
  • PortMappingType: 端口映射类型,可选 DefaultPlatformProxy
  • EnableTrafficCapture: 是否开启流量捕获,仅在 PortMappingType 设置为 PlatformProxy 时可用。若开启,将会记录流量于 /app/files/capture 目录下。

Docker

  • SwarmMode: 是否为 Swarm 模式,若为 Swarm 模式,将会使用 Swarm API 进器管理。

    ⚠️

    由于 Docker Swarm 已不是一个活跃的项目,相关安全性功能相较于 k8s 有很大距离,不推荐使用。

  • Uri: Docker API Server 地址

    • 如需使用本地 docker,请将 Uri 置空,并将 /var/run/docker.sock 挂载入容器对应位置
    • 如需使用外部 docker,请将 Uri 指向对应 docker API Server,外部 API 鉴权尚未实现,不推荐此部署方式
  • ChallengeNetwork: 指定题目容器所在的网络,若不指定,将会使用默认网络。

Kubernetes

  • Namespace: Kubernetes 命名空间,用于创建题目实例的命名空间,默认为 gzctf-challenges
  • ConfigPath: Kubernetes 配置文件路径,用于连接集群,默认为 k8sconfig.yaml
  • AllowCIDR: 允许访问 Pod 的 CIDR 白名单
  • DNS: 避免使用集群 DNS 的自定义 DNS 服务器列表

默认行为请将集群连接配置放入 k8sconfig.yaml 文件中,并将其挂载到 /app 目录下。实验功能若非了解行为请勿更改。

请注意更改 k8sconfig.yaml 文件中的 server 字段,将其指向集群的 API Server 地址。集群默认地址一般为 https://127.0.0.1:6443,需要更改为集群实际地址。

RequestLogging

此处配置是否开启请求日志记录,若开启,将会在日志中输出每个请求的详细信息。此处输出不包括静态文件的请求。

DisableRateLimit

此处配置是否开启请求频率限制,若开启,将会根据预设规则限制每个 IP 和 API 的请求频率。

RegistryConfig

此处配置 Docker Registry 的用户名和密码,用于比赛动态创建容器时拉取镜像的验证,可选项。

  • UserName: Docker Registry 用户名
  • Password: Docker Registry 密码
  • ServerAddress: Docker Registry 地址,请注意不需要包含 https:// 前缀

请确保密码中不包含特殊字符(如 ":@ 等,但是可以使用 _),否则可能导致模板注入问题,导致 Secret 创建失败。

CaptchaConfig

此处配置验证码相关信息,用于注册、找回账号和登录时的验证码验证,可选项。

  • Provider: 验证码提供商,可选 NoneGoogleRecaptchaCloudflareTurnstile
  • SiteKey: 验证码 Sitekey
  • SecretKey: 验证码 Secretkey

GoogleRecaptcha

配置 Google Recaptcha v3 的相关信息,可选项。

  • VerifyAPIAddress: Google Recaptcha 验证 API 地址
  • RecaptchaThreshold: Google Recaptcha 阈值,用于判断验证码是否有效

ForwardedOptions

此处配置反向代理的相关信息,用于获取真实 IP 地址,可选项。

  • ForwardedHeaders: 反向代理转发的标头枚举,默认请使用 5,详情请见 ForwardedHeaders 枚举 (opens in a new tab)
  • ForwardLimit: 反向代理层数限制
  • ForwardedForHeaderName: 反向代理 IP 地址头名称
  • TrustedNetworks: 反向代理信任的网络列表,使用 CIDR 表示
  • TrustedProxies: 反向代理信任的代理列表,使用 IP 地址或域名表示

若想要忽略反向代理的信任列表,允许任意 IP 地址访问,请参考转发 Linux 和非 IIS 反向代理的方案 (opens in a new tab),设置环境变量 ASPNETCORE_FORWARDEDHEADERS_ENABLEDtrue

其他字段请参考官方文档描述:配置 ASP.NET Core 以使用代理服务器和负载均衡器 (opens in a new tab)ForwardedHeadersOptions 类 (opens in a new tab)

Kestrel

Kestrel 为 GZCTF 自带并使用的 Web 服务器。利用此配置可以自行控制 Kestrel 的行为,例如指定 HTTP 协议、修改请求大小上限等等。

具体可配置字段请参照官方文档中 KestrelServerOptions 类的属性: KestrelServerOptions 类 (opens in a new tab)