pl4nty/auto-CTFd
GitHub: pl4nty/auto-CTFd
基于 GitHub Actions 的 CTF 题目自动化部署框架,支持将容器化题目一键发布至 CTFd、Kubernetes、Azure 或 Google kCTF 等多种平台。
Stars: 9 | Forks: 1
# Auto CTFd
自动将您的 CTF 题目从 GitHub 部署到 CTFd。同时支持在托管的 CTFd、Kubernetes、Microsoft Azure 或 Google 的 kCTF 上部署容器化题目。
## 要求
* 一个[托管的](https://docs.ctfd.io/hosted/management/creating-hosted-instances)或[自托管的](https://docs.ctfd.io/docs/deployment/installation/) CTFd 实例
* 托管实例可享受 80% 的教育折扣。请[联系支持](https://ctfd.io/contact)了解更多详情。
* 每位题目作者都需要一个 [GitHub 账户](https://github.com/join)。如果您符合条件,可以考虑使用 [GitHub Education](https://education.github.com/benefits)
## 快速开始
1. [点击此处](https://github.com/new?template_name=auto-ctfd&template_owner=pl4nty)为您的 CTF 创建一个仓库。选择“Private”以防止公开访问
2. [允许 GitHub Actions 创建 pull request](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#preventing-github-actions-from-creating-or-approving-pull-requests)
3. [创建以下 secret](https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository)
| 名称 | 值 |
| ---- | ----- |
| `CTFD_TOKEN` | [CTFd 管理员访问 token](https://docs.ctfd.io/docs/api/getting-started#generating-an-admin-access-token) |
| `CTFD_SITE_PASSWORD`(可选) | [CTFd 站点密码](https://docs.ctfd.io/hosted/security/setting-site-password)(如果已启用) |
4. [创建以下变量](https://docs.github.com/en/actions/learn-github-actions/variables#creating-configuration-variables-for-a-repository)
| 名称 | 值 |
| ---- | ----- |
| `CTFD_DOMAIN` | [CTFd 域名](https://docs.ctfd.io/hosted/management/setting-custom-domains),例如 `example.ctfd.io` |
| `FLAG_PREFIX`(可选) | 用于 lint 的 flag 前缀,例如 `ctf{` |
5. 查看 [containers](#containers) 了解更多选项
## 用法
* [邀请您的团队成员访问该仓库](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-access-to-your-personal-repositories/inviting-collaborators-to-a-personal-repository)
* 为每个题目[创建 GitHub issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-an-issue)。向您的题目作者发送如下链接:[your-repo-url]/issues/new/choose
* 考虑使用 [GitHub Codespaces](https://github.com/features/codespaces) 进行题目开发
* 将 [CTFd 页面](https://docs.ctfd.io/docs/management/ctfcli/pages)添加到 `pages` 文件夹中,它们将被自动部署
## 更新
使用以下命令获取最新更新。您可能需要解决合并冲突。
```
git pull https://github.com/pl4nty/auto-CTFd --allow-unrelated-histories --rebase=false --squash -X theirs
git commit -m "chore: update repo template"
git push
```
## 容器
某些题目(如 pwn 或 web)可能需要在容器中运行服务。这些服务可以部署到多个平台。要禁用某个平台,请[禁用其 GitHub 工作流](https://docs.github.com/en/actions/using-workflows/disabling-and-enabling-a-workflow)。
### 托管的 CTFd
请注意,托管的 CTFd 有特定的 Dockerfile 要求和限制。有关更多详细信息,请参阅 [CTFd 文档](https://docs.ctfd.io/tutorials/challenges/deploying-challenges)。
创建以下变量
| 名称 | 值 |
| ---- | ----- |
| `REGISTRY` | [托管的 CTFd registry](https://docs.ctfd.io/tutorials/challenges/deploying-challenges),例如 `registry.ctfd.io/example` |
### Kubernetes
1. 为您的每个题目添加一个 Compose 文件,如 `docker-compose.yml`
2. 确保 TCP 题目具有唯一的端口
3. 创建以下变量
| 名称 | 值 |
| ---- | ----- |
| `REGISTRY` | Kubernetes 集群可访问的 container registry |
| `KUBE_HOST` | 题目的主机名。HTTP 题目将通过 `example.KUBE_HOST` 上的 ingress 访问,而 TCP 题目将通过 `KUBE_HOST:port` 上的 load balancer 服务访问 |
4. 创建以下 secret
| 名称 | 值 |
| ---- | ----- |
| `REGISTRY_USERNAME` | Container registry 用户名 |
| `REGISTRY_PASSWORD` | Container registry 密码 |
| `KUBE_CONFIG` | 静态的 [kubeconfig 文件](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/)。若要改用动态文件,请修改工作流以获取其自己的 kubeconfig,例如使用 [azure/aks-set-context](https://github.com/Azure/aks-set-context) |
5. 部署题目
6. 在集群中创建 ingress controller
7. 为 `*.KUBE_HOST` 创建一条指向该 controller IP 地址的公共 DNS 记录
8. 为 `KUBE_HOST` 创建一条指向 load balancer IP 地址的公共 DNS 记录
### Microsoft Azure
1. [创建 Azure 应用注册和联合凭据](https://learn.microsoft.com/en-us/azure/developer/github/connect-from-azure?tabs=azure-portal%2Clinux#use-the-azure-login-action-with-openid-connect)
2. [创建 Azure Container Apps 环境](https://learn.microsoft.com/en-us/azure/container-apps/quickstart-portal)。请注意,[TCP 端口需要自定义 vnet](https://learn.microsoft.com/en-us/azure/container-apps/ingress-overview#tcp)。
3. 删除快速入门的 Container App,并[在其资源组上为应用注册分配 `Contributor` 角色](https://learn.microsoft.com/en-us/azure/role-based-access-control/role-assignments-steps)
4. [创建用户分配的 managed identity](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-manage-user-assigned-managed-identities#create-a-user-assigned-managed-identity) 并
5. [创建 Azure Container Registry](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) 并为其分配 `AcrPull` 角色给该 managed identity
6.(可选)[添加自定义 DNS 后缀](https://learn.microsoft.com/en-us/azure/container-apps/environment-custom-dns-suffix)到 Container Apps 环境
7. 创建以下变量
| 名称 | 值 |
| ---- | ----- |
| `REGISTRY` | Container Apps 环境可访问的 container registry |
| `AZURE_TENANT_ID` | 应用注册租户 ID |
| `AZURE_CLIENT_ID` | 应用注册客户端 ID |
| `AZURE_CONTAINER_ENV` | Container Apps 环境[资源 ID](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-get-info?tabs=portal#get-the-resource-id-for-a-storage-account) |
| `AZURE_CONTAINER_IDENTITY` | Managed identity 资源 ID |
| `AZURE_CONTAINER_SUFFIX` | Container Apps 环境 DNS 后缀,例如 chals.example.com |
### Google kCTF
1. [设置 kCTF 基础设施](https://google.github.io/kctf/google-cloud.html)
2. [创建一个 Docker Artefact Registry](https://cloud.google.com/artifact-registry/docs/docker/store-docker-container-images#create),名称与 GKE 集群相同(取决于 https://github.com/google/kctf/pull/406)
3. [创建 Workload Identity Pool 和 Provider](https://github.com/google-github-actions/auth#preferred-direct-workload-identity-federation)
4. 将 Kubernetes Engine Developer 和 Artifact Registry Writer 角色授予该 Pool
```
# TODO: 将下面的 ${PROJECT_ID}、${WORKLOAD_IDENTITY_POOL_ID} 和 ${REPO}
# 替换为您的值。
# # ${REPO} 是包含父 GitHub 组织在内的完整 repo 名称,
# 例如 "my-org/my-repo"。
# # ${WORKLOAD_IDENTITY_POOL_ID} 是完整的 pool id,例如
# "projects/123456789/locations/global/workloadIdentityPools/github"。
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--role="roles/container.developer" \
--member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository/${REPO}"
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
--role="roles/artifactregistry.writer" \
--member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository/${REPO}"
```
4. 创建以下变量
| 名称 | 值 |
| ---- | ----- |
| `KCTF_CONFIG` | kCTF 配置文件 `kctf/config/.lastconfig` 的内容 |
| `KCTF_IDENTITY` | Workload Identity Provider 资源名称 |
标签:CTFd, GitHub Actions, 子域名突变, 版权保护, 特权提升, 自动化部署, 自动笔记, 请求拦截