28Pollux28/galvanize
GitHub: 28Pollux28/galvanize
Galvanize Instancer 是一个基于 Ansible 和 Docker 的 CTF 挑战部署工具。
Stars: 3 | Forks: 3
# Galvanize Instancer -> 铠化 Instancer
Galvanize Instancer 是一个轻量级服务,通过 Ansible 和 Docker 需求式部署 CTF 挑战实例。它旨在与 Zync CTFd 插件(https://github.com/28Pollux28/zync)协同工作,并提供简单的 HTTP API 以部署、状态、扩展和终止工作流程。
## 突出特点
- 每队挑战实例具有 TTL 和扩展控制
- Ansible playbooks 用于 HTTP、TCP 或自定义 Compose 部署
- 简单的 YAML 挑战定义,符合 CTFd 挑战格式
- JWT 保护的 API,便于与 CTF 平台集成
## 工作原理
- Instancer 服务在容器中运行并公开 HTTP API。
- 挑战定义在 `data/challenges/*/challenge.yml` 中。
- `data/playbooks/` 中的 Ansible playbooks 处理在您的目标主机上的部署。
- 目标主机必须可通过 SSH 访问并已安装 Docker。
- HTTP 挑战使用 Traefik 自动设置域名和 SSL。
## 快速入门(Docker Compose)
1. 创建您的配置文件:
cp config.example.yaml config.yaml
2. 编辑 `config.yaml` 以设置:
- `auth.jwt_secret`
- `instancer.instancer_host`
- `instancer.ansible.inventory`
- `instancer.ansible.user`
- `instancer.ansible.private_key`
3. 更新 `docker-compose.yml` 中的 SSH 密钥挂载:
volumes:
- /path/to/your/ssh/key:/home/galvanize/.ssh/ansible-ssh:Z,ro
4. 启动服务:
docker compose up -d --build
5. 检查健康状态:
curl -f http://localhost:8080/health
### 可选:监控(Prometheus + Grafana)
将监控覆盖层附加到 Instancer 以启动 Prometheus 和 Grafana:
```
docker compose -f docker-compose.yml -f docker-compose.monitoring.yml up -d --build
```
| 服务 | URL | 凭据 |
|------------|------------------------|--------------|
| Grafana | http://localhost:3000 | admin / admin |
| Prometheus | http://localhost:9090 | — |
Grafana 预配置了 **Galvanize CTF Instancer** 仪表板,涵盖部署计数、操作持续时间、扩展统计、工作队列指标、HTTP API 延迟等。Instancer 在端口 **5001**(`/metrics`)上公开 Prometheus 指标。
## Zync CTFd 插件集成
配置 Zync 插件以使用您的 Instancer 基础 URL 和与 `config.yaml` 中设置的相同的 JWT 密钥。
- 基础 URL 示例:`http://your-instancer-host:8080`
- JWT 密钥:`config.yaml` 中的 `auth.jwt_secret`
有关确切配置字段,请参阅 Zync 插件文档。
## API 概述
API 在 `galvanize-instancer/api/openapi.yaml` 中进行了文档记录。主要端点:
- `POST /deploy`
- `GET /status`
- `POST /extend`
- `POST /terminate`
- `GET /health`
除 `/health` 外的所有端点都需要 JWT 携带者令牌。令牌由 Zync 插件自动生成。
## 挑战定义
示例挑战文件(每个 playbook 类型一个):
- `data/challenges/example/http/challenge.yml`
- `data/challenges/example/tcp/challenge.yml`
- `data/challenges/example/custom_compose/challenge.yml`(带有独立的 `docker-compose.yml`)
关键字段:
- `name`,`author`,`category`
- `playbook_name`:`http`,`tcp` 或 `custom_compose`
- `deploy_parameters`:image,ports,env 或 Compose 定义
- `flags`,`value`,`description`,`tags`
### 多服务 / Docker Compose 挑战
对于需要多个容器(数据库、边车、自定义网络/卷)的挑战,在 `challenge.yml` 旁边放置一个标准的 Docker Compose 文件:
```
data/challenges/web/my-chall/
├── challenge.yml
└── docker-compose.yml
```
Galvanize 会自动检测挑战目录中的第一个 `compose.yaml`、`compose.yml`、`docker-compose.yaml` 或 `docker-compose.yml`,验证它,并部署它。当存在 compose 文件时,`playbook_name` 默认为 `custom_compose`,因此一个最小的 `challenge.yml` 就足够了:
```
name: my-chall
author: YourName
category: web
type: zync
deploy_parameters:
unique: false
```
这允许您使用普通的 `docker compose up` 在本地开发和测试堆栈,然后发送未更改的文件。
#### 暴露服务(`expose`)
Compose 挑战不再需要手动编写的 Traefik 标签、手动网络布线或手动选择的主机端口。声明一个 `expose` 块,Galvanize 会为您布线网络——与 `http`/`tcp` playbook 为单个容器提供的相同自动化:
```
deploy_parameters:
unique: false
expose:
- service: web # HTTP via Traefik → auto domain + SSL
port: 80
type: http
- service: ssh # raw TCP → published host port
port: 22
type: tcp
scheme: ssh # optional, only affects the rendered connection URL
```
对于每个条目,Galvanize 在部署时将执行以下操作:
- `type: http` — 将服务连接到外部 Traefik 网络,添加 `traefik.enable` + 路由/服务标签,并将 `https://./` 路由到它(当暴露多个 HTTP 服务时,每个服务都获得一个 `-.` 子域名)。
需要 `traefik_network` 在 `instancer.extra_deployment_parameters` 中。
- `type: tcp` — 发布容器端口。当启用 `instancer.randomize_published_ports` 时,主机端口会为每个团队随机化并持久化,因此实例不会冲突。
连接信息会自动从结果 Traefik 路由或发布端口返回。
注意:
- 使用 `deploy_parameters.compose_file: ` 指向一个不同命名的文件(相对于挑战目录)。
- 内联 `deploy_parameters.compose_definition` 字符串仍然有效,并优先于任何 compose 文件,因此现有的挑战不受影响。
- `expose` 是可选的:如果您愿意,您仍然可以手动编写 Traefik 标签和 `ports:` 在 compose 文件中,并完全省略 `expose`。
- 项目名称会自动为每个团队生成;不要在服务或实例中设置 `container_name`,否则实例将冲突。
- 图像 `build:` 上下文和主机绑定挂载引用的是 **目标部署主机** 上的路径,而不是 Instancer — 建议使用预构建的镜像。
## 故障排除
- 如果部署失败,请验证目标主机的 SSH 访问权限以及 Docker 是否已安装。
- 确保在 `docker-compose.yml` 中挂载的 SSH 密钥路径与 `instancer.ansible.private_key` 匹配。
- 使用 `docker logs galvanize-instancer` 检查容器日志。
标签:Ansible, Challenge Deployment, Challenge Instance Management, Containerization, Container Orchestration, CTFd, Docker, EVTX分析, Grafana, HTTP API, Infrastructure Automation, JWT Authentication, Monitoring, On-Demand Service, Python脚本, Security Testing, SSH, Team-Based Challenges, Traefik, TTL and Extension Controls, YAML Configuration, 安全防御评估, 系统提示词, 自定义请求头, 请求拦截, 隐蔽技术