ironsh/actions-demo
GitHub: ironsh/actions-demo
演示如何通过 iron-proxy 对 GitHub Actions 自托管 runner 的出站请求进行审计、过滤和密钥边界交换。
Stars: 11 | Forks: 1
# actions-demo
GitHub Actions runner 可以发起任意的出站请求。受损的依赖项、恶意的构建步骤或提示词注入都可能导致敏感信息泄露、回连恶意服务器或建立反向 shell —— 而大多数团队对其 CI 作业流出的内容完全没有可见性。
本演示展示了 [iron-proxy](https://github.com/ironsh/iron-proxy) 如何对此进行锁定。它启动了一个位于 iron-proxy 之后的 GitHub Actions 自托管 runner,使得每个出站请求都遵循默认拒绝策略、经过审计,并且密钥在网络边界处被交换。
## 演示功能
一条命令即可完成所有设置:
```
git clone https://github.com/ironsh/actions-demo && cd actions-demo
./run-demo.sh
```
这将:
1. 将仓库 Fork 到您的 GitHub 账户(如果需要)
2. 生成用于 TLS 拦截的 CA 证书
3. 在 Docker 中启动 iron-proxy 和一个自托管 runner
4. 注册 runner,触发 GitHub Actions 工作流,并将每个出站请求实时流式传输到您的终端
5. 打印允许的请求、拒绝的请求和密钥交换的摘要
演示工作流会检出代码库,安装 Node.js,向 GitHub API 发出一个允许的请求,发送一个包含代理令牌的请求(该令牌会在边界处交换为真实的密钥),并尝试向两个被屏蔽的域名发送请求。
## 前置条件
- [Docker](https://docs.docker.com/get-docker/)
- [GitHub CLI](https://cli.github.com/) (`gh`),并已通过身份验证
- [jq](https://jqlang.github.io/jq/)
## 运作原理
该设置在共享的 Docker 网络上运行两个容器:
- **iron-proxy** 位于固定 IP,充当 DNS 服务器和 HTTPS 代理。Runner 的 DNS 指向该代理,因此所有主机名查找都解析为代理 IP,流量会自动通过它路由。
- **runner** 是一个临时的 GitHub Actions 自托管 runner。它信任代理的 CA 证书以进行 TLS 拦截。它只能访问代理令牌 —— 永远无法接触真实的密钥。
Iron-proxy 对每个请求强制执行两项转换:
- **Allowlist (允许列表)** — 仅允许 GitHub Actions 和演示所需的域名。其他所有内容都会收到 `403 Forbidden`。
- **Secrets (密钥)** — runner 在 `Authorization` 头中发送代理令牌。Iron-proxy 在转发到上游之前将其交换为真实的密钥。如果 runner 受到攻击,攻击者只能获得一个在代理之外毫无价值的令牌。
有关完整配置,请参见 [`proxy.yaml`](proxy.yaml)。
## 在您自己的仓库上运行
您可以审计您控制的任何工作流的出站流量:
```
./audit.sh myorg/myapp ci.yml
```
您的工作流需要将 `workflow_dispatch:` 作为触发器,并在您要测试的作业上设置 `runs-on: self-hosted`。该脚本将注册一个临时 runner,触发工作流,并向您展示它发出的每个出站请求。
## 了解更多
- [iron-proxy](https://github.com/ironsh/iron-proxy) — 出站代理
- [iron.sh](https://iron.sh) — 针对大规模运行此功能的团队提供的企业特性
标签:CI/CD 安全, DevSecOps, Docker 容器, GitHub Actions, IP 地址批量处理, MITM 代理, T1071, T1195, T1555, TLS 拦截, 上游代理, 出站流量控制, 底层编程, 数据投毒防御, 数据防泄露, 文档安全, 网络安全, 自动笔记, 自托管运行器, 请求拦截, 隐私保护, 默认拒绝策略