Helm 部署

CBCTF Chart 位于仓库根目录的 chart/。默认会创建应用 Deployment、Service、Ingress、ServiceAccount、ClusterRole、共享 PVC,以及内置 PostgreSQL 和 Redis。

前置要求

  • Kubernetes 集群可用
  • Helm 可用
  • 集群可以拉取 ghcr.io/0rays/cbctf、PostgreSQL、Redis 以及题目镜像
  • 如启用持久化,集群需要可用 StorageClass
  • 动态附件建议使用支持 ReadWriteMany 的共享存储
  • VPC 靶机需要提前安装 Kube-OVN 和 Multus CNI
  • KubeVirt VM 靶机需要提前安装 KubeVirt,并确认节点支持虚拟化

安装

添加 Helm Repo

helm repo add cbctf https://cbctf.0rays.club

须使用自定义 values

Helm values 会渲染为容器内 /app/config.yaml。升级 values 后会滚动重启:

helm show values cbctf/cbctf > values.yaml
helm install cbctf cbctf/cbctf -n cbctf --create-namespace -f values.yaml

升级和卸载

helm upgrade cbctf cbctf/cbctf -n cbctf -f values.yaml
helm uninstall cbctf -n cbctf

共享 PVC 默认带有保留策略,卸载不会删除 /app/data 中的数据。PostgreSQL 和 Redis 的 PVC 也应在确认备份后再手动清理。

常用 Values

配置项说明示例
image.repository应用镜像仓库ghcr.io/0rays/cbctf
image.tag应用镜像标签latest
imagePullSecrets私有镜像拉取 Secret[{name: regcred}]
imageCredentials.*Chart 自动创建镜像仓库 Secret 的内联凭据registry: ghcr.io
timezone容器时区Asia/Shanghai
service.typeService 类型ClusterIP
service.portService 端口8000
ingress.enabled是否启用 Ingresstrue
ingress.classNameIngressClassnginx
ingress.hosts域名和路径ctf.example.com
ingress.tlsTLS Secret 配置cbctf-tls
resources应用 Pod 资源限制requests.cpu: 500m
persistence.enabled是否创建共享 PVCtrue
persistence.storageClass共享 PVC 的 StorageClassnfs-client
persistence.accessMode访问模式ReadWriteMany
persistence.size共享 PVC 容量20Gi
persistence.existingClaim复用已有 PVCcbctf-data

应用配置

上传大小限制已拆分为 cbctf.gin.upload.picturecbctf.gin.upload.challengecbctf.gin.upload.writeup。旧的 cbctf.gin.upload.max 不再生效。

配置项说明示例
cbctf.host平台公开访问地址,不要带尾部 /https://ctf.example.com
cbctf.log.level应用日志级别info
cbctf.log.save是否持久化日志false
cbctf.gin.modeGin 运行模式release
cbctf.gin.host容器内监听地址0.0.0.0
cbctf.gin.port容器内监听端口8000
cbctf.gin.upload.picture图片上传大小限制,单位 MiB8
cbctf.gin.upload.challenge题目附件上传大小限制,单位 MiB8
cbctf.gin.upload.writeup题解上传大小限制,单位 MiB8
cbctf.gin.proxies可信代理 IP 或 CIDR10.244.0.0/16
cbctf.gin.origins允许的浏览器请求 Originhttps://ctf.example.com
cbctf.gin.ratelimit.global全局限流100
cbctf.gin.jwt.secretJWT 签名密钥change-me-long-random
cbctf.gin.metrics.whitelist允许访问 /metrics 的 IP 或 CIDR10.0.0.0/8
cbctf.gin.pprof.whitelist允许访问 /debug/pprof/* 的 IP 或 CIDR127.0.0.1
cbctf.asynq.queues.traffic靶机流量解析任务并发2
cbctf.registration.enabled是否允许公开注册true
cbctf.registration.default_group新用户默认分组 ID,0 表示不指定0
cbctf.cheat.ip.whitelist作弊检测 IP 白名单10.0.0.0/8
cbctf.webhook.whitelistWebhook 目标白名单example.com

JWT、PostgreSQL 和 Redis 密钥会写入 /app/config.yaml

管理后台不能修改 PostgreSQL/GORM、Redis、数据目录、Gin 监听地址和监听端口。

PostgreSQL 和 Redis

配置项说明示例
postgres.enabled是否部署内置 PostgreSQLtrue
postgres.auth.database数据库名cbctf
postgres.auth.username用户名cbctf
postgres.auth.passwordPostgreSQL 密码example-postgres-password
postgres.persistence.enabledPostgreSQL 数据持久化true
postgres.persistence.sizePostgreSQL PVC 容量5Gi
postgres.extraConfig追加到 postgresql.conf 的配置max_connections = 500
redis.enabled是否部署内置 Redistrue
redis.auth.passwordRedis 密码example-redis-password
redis.persistence.enabledRedis 数据持久化true
redis.persistence.sizeRedis PVC 容量1Gi
Info

当前 Chart values 中没有外部 PostgreSQL 或外部 Redis 的 externalHost 配置项。如果需要使用外部数据库,需要同步调整 Chart 模板或用等价的 Service 名称接入。

Kubernetes 靶机配置

配置项说明示例
serviceAccount.create是否创建应用 ServiceAccounttrue
cbctf.k8s.capture流量捕获镜像ghcr.io/domcyrus/rustnet:latest
cbctf.k8s.frp.on是否启用 FRP 端口暴露false
cbctf.k8s.frp.frpcFRP client 镜像ghcr.io/fatedier/frpc:v0.69.0
cbctf.k8s.frp.nginxFRP 转发辅助 Nginx 镜像nginx:latest
cbctf.k8s.frp.frpsFRPS 服务端、token 和端口池host: frps.example.com

Chart 创建的 ClusterRole 包含 Pod、Service、Job、NetworkPolicy、EndpointSlice、Multus NAD、KubeVirt VirtualMachine、Kube-OVN Subnet/VPC/IP 等资源权限。Chart 不会安装 KubeVirt、Kube-OVN 或 Multus,需要时请先在集群层面安装这些组件。

API groupResourcesVerbs用途
corepodscreate, get, list, watch, delete, deletecollection创建靶机、生成器、FRPC Pod,并等待状态和清理
corepods/execcreate在动态附件生成器 Pod 中执行命令
corepods/logget读取 Pod 日志
coreservicescreate, list, delete创建和清理 NodePort 暴露
coreconfigmapscreate, deletecollection写入文件挂载、FRPC 和 Nginx 配置
corepersistentvolumeclaimsget启动时检查共享 PVC
corenamespacesget启动时检查靶机命名空间
corenodeslist枚举节点镜像和预拉取目标节点
batchjobscreate创建镜像预拉取 Job
networking.k8s.ionetworkpoliciescreate, deletecollection创建和清理靶机网络策略
discovery.k8s.ioendpointslicesdeletecollection清理 Service 产生的 EndpointSlice
authorization.k8s.ioselfsubjectaccessreviewscreate启动时执行权限自检
k8s.cni.cncf.ionetwork-attachment-definitionscreate, get, deletecollectionVPC 模式下创建和清理 Multus NAD
kubevirt.iovirtualmachinescreate, get, deletecollectionVM 靶机模式创建和清理 VM
kubeovn.iosubnetscreate, get, deletecollectionVPC 模式下创建和清理 Kube-OVN 子网
kubeovn.iovpcscreate, deletecollectionVPC 模式下创建和清理 Kube-OVN VPC
kubeovn.ioipsdeletecollection清理 Kube-OVN IP 分配

Chart 不会安装 KubeVirt、Kube-OVN 或 Multus,需要时请先在集群层面安装这些组件。

如果使用自定义 ServiceAccount 或外部 RBAC,可以用下面的命令提前检查关键权限:

kubectl auth can-i create pods -n cbctf --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i watch pods -n cbctf --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i create selfsubjectaccessreviews.authorization.k8s.io --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i create network-attachment-definitions.k8s.cni.cncf.io -n cbctf --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i create virtualmachines.kubevirt.io -n cbctf --as=system:serviceaccount:cbctf:cbctf
kubectl auth can-i create subnets.kubeovn.io --as=system:serviceaccount:cbctf:cbctf

Ingress 示例

cbctf:
  host: "https://ctf.example.com"
  gin:
    origins:
      - "https://ctf.example.com"
    proxies:
      - "10.244.0.0/16"
    pprof:
      whitelist:
        - "127.0.0.1"
        - "10.244.0.0/16"
    jwt:
      secret: "change-me-long-random-secret"

ingress:
  enabled: true
  className: nginx
  hosts:
    - host: ctf.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: cbctf-tls
      hosts:
        - ctf.example.com

安装后检查

kubectl get pods -n cbctf
kubectl logs -n cbctf deployment/cbctf
kubectl get pvc -n cbctf
kubectl get ingress -n cbctf

检查初始管理员密码:

kubectl logs -n cbctf deployment/cbctf | grep "Init Admin"

如果 Pod 反复重启,优先检查日志中的数据库、Redis、RBAC、PVC、KubeVirt、Kube-OVN/Multus 相关错误。

启动时资源检查与创建

Helm 安装后,应用启动时会检查或创建以下资源:

  • 命名空间:{namespace}
  • 共享存储 PVC:{namespace}-shared-volume
  • Kubernetes API 权限:上方 RBAC 表中的所有 verbs
Warning

PVC 缺失会导致动态附件不可用。KubeVirt 资源不会在启动时创建,只有启动包含 x-kubevirt: true 的 VM 靶机时才会创建对应 VirtualMachine