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, 安全防御评估, 系统提示词, 自定义请求头, 请求拦截, 隐蔽技术