blueteamvillage/btv-k8s-sandbox-infrastructure
GitHub: blueteamvillage/btv-k8s-sandbox-infrastructure
为 DEF CON 34 蓝队村 CTF 提供一键搭建的本地 Kubernetes 沙盒集群,集成运行时遥测与安全防护机制,供参赛者在隔离环境中部署并分析挑战。
Stars: 8 | Forks: 3
# DC34 K8s 沙盒 — 蓝队村 CTF
欢迎,防守者!本仓库用于快速搭建 **你即将参赛的本地 Kubernetes 沙盒**,用于 **DEF CON 34 蓝队村 CTF**(Project Obsidian)。只需一条命令,即可在你的笔记本电脑上构建一个独立的集群——包含运行时遥测和安全防护机制——在活动期间,CTF 挑战将直接部署到其中。
这里的任何操作都不会影响共享基础设施:整个环境都运行在你机器上的 VM 中,你可以随时将其暂停或清除。
## 沙盒概览
```
Your laptop
└── Linux VM running Docker ← colima on macOS, Docker Desktop (WSL2) on Windows
└── minikube cluster "dc34" ← single-node Kubernetes
├── Cilium ← CNI: pod networking + NetworkPolicy enforcement
├── Tetragon ← eBPF runtime observability (process/syscall events)
├── Kyverno ← policy engine enforcing the guardrails below
└── metrics-server ← resource metrics for kubectl top / k9s
```
作为参赛者,你需要关注的点:
- **Tetragon** 会从每个工作负载中流式传输内核级事件(进程执行、网络连接)——这是你在分析挑战时可以进行追踪的遥测数据。
- **Kyverno + Cilium** 会限制挑战工作负载的权限:受限的 Pod 安全、默认拒绝网络策略和资源配额。你部署的任何可疑内容都会被限制在沙盒内部。
## 环境要求
所有平台:需要为 VM 预留 **约 4 个 CPU 核心和 8 GB 内存**,约 20 GB 磁盘空间,并且需要 **一个 GitHub 账户** 以便在活动期间拉取挑战镜像(见下文)。
- **macOS** — [Homebrew](https://brew.sh);`make` 工作流会自动安装其他所有内容(参见 [`Brewfile`](Brewfile):minikube、kubectl、helm、helmfile、k9s、colima、docker CLI)。
- **Windows 10/11** — winget + Docker Desktop(WSL2 引擎);`windows\start.cmd tools` 会安装其他所有内容。参见 [`windows/README.md`](windows/README.md)。
- **Linux** — 除了 colima 之外,其他工具都是跨平台的。安装 `minikube`、`kubectl`、`helm` 和 `helmfile`,将 Docker 指向你的本地 daemon,然后运行相同的 `minikube start --profile dc34 --driver=docker --cpus=4 --memory=6144 --cni=cilium --addons=metrics-server`,接着执行 `helmfile sync`。如果遇到问题,请在 BTV Discord 中提问。
## 快速开始
克隆仓库:
```
git clone https://github.com/blueteamvillage/btv-k8s-sandbox-infrastructure.git
cd btv-k8s-sandbox-infrastructure
```
**macOS:**
```
make tools & make up
```
**Windows**(PowerShell 或 cmd — 完整指南见 [`windows/README.md`](windows/README.md)):
```
windows\start.cmd tools # once; then start Docker Desktop and open a new terminal
windows\start.cmd up
```
首次运行需要几分钟时间(VM 镜像、集群引导、Helm charts)。验证所有组件是否正常运行:
```
make status # Windows: windows\start.cmd verify
kubectl --context dc34 get pods -A # everything Running/Completed
```
| macOS | Windows | 功能说明 |
|---|---|---|
| `make up` | `start.cmd up` | 启动 VM + 集群,部署沙盒技术栈。可安全重复运行。 |
| `make status` | `start.cmd status` | 显示 VM 和集群健康状态。 |
| — | `start.cmd verify` | 自动化健康检查(集群、节点、Tetragon、Kyverno)。 |
| `make stop` | `start.cmd stop` | 暂停集群 — **状态会被保留**,执行 `up` 会从中断处恢复。 |
| `make clean` | `start.cmd clean` | 销毁所有内容(macOS:包括 VM 磁盘)。完全重置。 |
| `make tools` | `start.cmd tools` | 仅安装/更新 CLI 工具(Homebrew / winget)。 |
## 部署挑战
每个挑战都是 [`challenges/`](challenges) 中一个可直接应用的 manifest,并搭配了来自蓝队村 registry 的容器镜像(`ghcr.io/blueteamvillage/challenge-`)。每个 manifest 都是 **独立的** — 一次应用即可创建挑战的 namespace 及其 pod:
```
kubectl --context dc34 apply -f challenges/challenge-000.pod.yaml
kubectl --context dc34 -n challenge-000 get pods
```
然后深入分析证据:
```
# 在 pod 内部探查
kubectl --context dc34 -n challenge-000 exec -it challenge-000 -- sh
# 或者将 artifacts 复制到你的机器
kubectl --context dc34 -n challenge-000 cp challenge-000:/forensics ./challenge-000-forensics
```
两种类型的挑战:
- **独立挑战**(`challenge-.pod.yaml`)— 每个都部署在其独立的 `challenge-` namespace 中。
- **Converged Frontier 场景**(`challenge-001-s-*.challenge.pod.yaml`)— 包含十个场景,每个场景都有 **`-beginner`** 和 **`-pro`** 两个变体;请选择适合你的赛道。它们共享 `converged-frontier` namespace,并且可以并行运行。
### 移除挑战
```
kubectl --context dc34 -n challenge-000 delete pod challenge-000
```
`kubectl delete -f ` 也适用于独立挑战(它也会删除该挑战的 namespace),但**请勿对 Converged Frontier 文件使用此命令** — 这会删除共享的 `converged-frontier` namespace,并连带删除你正在运行的所有场景 pod。在这种情况下,请改为删除单个 pod。
## 你可能会遇到的防护机制(它们是功能,不是 Bug)
沙盒经过了刻意的安全加固。如果一个 pod 无法调度或无法连接网络,很可能是因为以下原因:
- **受限的 Pod 安全** — Kyverno 对所有工作负载强制执行 Kubernetes `restricted` Pod 安全标准。请求特权模式、host namespace、root 用户等的 Pod 会在**准入阶段被拒绝**。
- **默认拒绝网络策略** — 每个 namespace 都会自动配置拒绝所有 ingress *和* egress 的 NetworkPolicies。除非有策略明确允许,否则工作负载无法对外发起通信。
- **资源配额** — 每个 namespace 都会获得一个 ResourceQuota(最多 5 个 pod,2 CPU / 2 Gi 请求,4 CPU / 4 Gi 限制)和一个 LimitRange(容器默认为 500m / 512 Mi)。
Namespace 可以通过标签来豁免特定的防护机制 — 挑战 manifest 会在需要时设置这些标签,你在进行实验时也可以这样做:
| Namespace 上的标签 | 效果 |
|---|---|
| `blueteamvillage.org/allow-inbound: "true"` | 跳过默认拒绝 **ingress** 策略 |
| `blueteamvillage.org/allow-outbound: "true"` | 跳过默认拒绝 **egress** 策略 |
| `blueteamvillage.org/disable-quotas: "true"` | 跳过 ResourceQuota |
| `blueteamvillage.org/disable-limits: "true"` | 跳过 LimitRange |
(`kube-system` 和 `kyverno` 不受上述所有限制。)
## 实用命令
```
# Cluster 访问 — kubectl context 为 "dc34"
kubectl --context dc34 get pods -A
# 用于 cluster 的交互式 TUI (https://k9scli.io)
k9s --context dc34
# 观察 Tetragon runtime 事件(进程执行、连接等)
kubectl --context dc34 logs -n kube-system ds/tetragon -c export-stdout -f
# 查看哪些 workloads 被 Kyverno policies 标记
kubectl --context dc34 get policyreports -A
# 列出某个 namespace 中的活跃 guardrails
kubectl --context dc34 get networkpolicy,resourcequota,limitrange -n
```
## 故障排除
- **`up` 中途失败** — 该操作是幂等的;直接再次运行即可。`helmfile sync` 会从中断处继续执行。
- **Docker 命令连接到了错误的 daemon**(macOS)— 此设置使用了名为 `colima-dc34` 的 Docker context。`make` 会自动导出它;在普通的 shell 中,请手动运行 `docker context use colima-dc34`。
- **一切都很慢 / pod 被驱逐** — VM 分配了 8 GB 内存和 4 个 CPU。请关闭其他占用资源大的应用程序;如果你的机器还有余力,可以在 [`Makefile`](Makefile) 中调大这些数值。
- **出现奇怪且无法恢复的状态** — 执行 `clean` 然后再执行 `up`,只需几分钟就能获得一个全新的沙盒。
- **Windows 特定问题**(Docker Desktop、WSL2、Git Bash、执行策略)— 参见 [`windows/README.md`](windows/README.md#troubleshooting)。
## 比赛结束后
- `make stop` / `windows\start.cmd stop` — 暂停沙盒并释放 CPU/RAM;你的集群状态会被保留。
- `make clean` / `windows\start.cmd clean` — 彻底删除集群(在 macOS 上还会删除 VM 及其磁盘)。
## 获取帮助
你可以在 **蓝队村 Discord** 中找到我们,或者在村里的 BTV 工作人员处寻求帮助 — 我们非常乐意在 CTF 开始前帮助你把沙盒跑起来。祝你狩猎愉快! 🔵
标签:CTF基础设施, Libemu, 子域名突变, 本地沙箱, 环境部署, 网络策略, 请求拦截