Kubernetes Goat 基于 KIND 的本地部署:用 Docker 容器节点构建可攻防的 Kubernetes 学习集群
【免费下载链接】kubernetes-goatKubernetes Goat is a "Vulnerable by Design" cluster environment to learn and practice Kubernetes security using an interactive hands-on playground 🚀项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-goat
本文以 Kubernetes Goat 仓库中的 KIND 部署指南为核心,完整讲解如何在本地用 KIND(Kubernetes IN Docker)一键拉起 Kubernetes 集群并部署全部漏洞场景:从kind、kubectl、helm三个前置工具的准备,到setup-kind-cluster-and-goat.sh的逐行行为剖析、场景清单与端口映射,再到环境访问与安全环境销毁。读完后,你应能在自己的主机上从零搭建、验证并彻底拆除一套完整的 Kubernetes 安全攻防演练环境。
什么是 KIND,为什么用它跑 Kubernetes Goat
KIND 是一个基于 Docker 容器充当 Kubernetes 节点("container nodes")来运行本地 Kubernetes 集群的工具。它最初是为测试 Kubernetes 本身而设计的,同样适用于本地开发或 CI 场景。选择 KIND 的意义在于:
- 不依赖云厂商账号与配额,一个 Docker 宿主就能承载完整的控制面与数据面;
- 集群即容器,销毁集群只需删除几个容器,非常适合"用完即拆"的安全实验;
- Kubernetes Goat 的所有漏洞场景(特权容器、hostPath 挂载、DinD 等)在 KIND 节点容器上都能直接复现,"宿主机"就是 KIND 节点容器本身,隔离边界清晰、不污染宿主机。
仓库中 KIND 相关的落地代码集中在 platforms/kind-setup 目录,包含一键部署脚本、集群配置、访问脚本与拆机脚本;官方文档入口为 guide/docs/how-to-run/kind.md。
前置条件:kind、kubectl 与 helm
按文档要求,开始部署前需在宿主系统上准备好三样工具,并逐一验证:
| 工具 | 用途 | 验证命令 |
|---|---|---|
kind | 创建并管理基于 Docker 的本地集群 | kind version |
kubectl | 对集群执行 k8s 资源操作,且需要cluster-admin 级别访问权限 | kubectl version |
helm | 部署 metadata-db 等 Helm Chart 场景 | helm version |
三项工具的安装方式可分别参照 kind、kubectl 与 Helm 的官方安装文档,安装完成后确保它们在PATH中可用。kubectl version能正常返回版本信息,说明 kubectl 与集群凭据链路基本就绪。
一键部署流程
部署步骤在 guide/docs/how-to-run/kind.md 中只有三步,但背后是一条完整的自动化链路。
第 1 步:克隆仓库
git clone https://github.com/madhuakula/kubernetes-goat.git第 2 步:进入 KIND 部署目录
cd kubernetes-goat/platforms/kind-setup第 3 步:运行部署脚本
bash setup-kind-cluster-and-goat.sh脚本内部到底做了什么
阅读 platforms/kind-setup/setup-kind-cluster-and-goat.sh 源码,可以看到脚本分四段执行:
环境自检:先执行
kind version,未安装则提示并退出;再执行docker version --format '{{.Server.Version}}'确认 Docker 守护进程可用,任一失败都会提前终止,避免后续步骤在半配置状态下执行。创建 KIND 集群:
kind create cluster --config kind-cluster-setup.yaml --name kubernetes-goat-cluster集群名固定为
kubernetes-goat-cluster。配套的 kind-cluster-setup.yaml 内容极简:kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane即默认拓扑——单节点、control-plane 角色。这也意味着所有 workload(包括特权容器与 hostPath 挂载类场景)都运行在这个唯一的 KIND 节点容器上。
切回仓库根目录:
cd ../..,因为后续部署脚本引用的是仓库根目录下的scenarios/清单。部署 Kubernetes Goat:调用根目录的 setup-kubernetes-goat.sh 完成全部场景的部署。
值得注意的脚本细节是,setup-kubernetes-goat.sh支持两个可选参数(见其开头的参数解析循环):
--insecure:设置KUBECTL_INSECURE="--insecure-skip-tls-verify"与HELM_INSECURE="--kube-insecure-skip-tls-verify",用于跳过 API Server 的 TLS 证书校验(本地 KIND 集群通常自带受信 CA,一般无需此参数);--kubeconfig <path>:显式指定 KUBECONFIG,便于多集群环境下精确指向kubernetes-goat-cluster。
脚本内部按以下顺序部署(可对照 setup-kubernetes-goat.sh 逐行验证):
- 校验
kubectl可用; - 部署insecure super admin场景:
kubectl apply -f scenarios/insecure-rbac/setup.yaml,创建集群级越权 RBAC(这是后续多场景攻击链的起点); - 通过 Helm 安装 metadata-db 场景:
helm install metadata-db scenarios/metadata-db/; - 依次
kubectl apply各漏洞场景清单:scenarios/batch-check/job.yaml、scenarios/build-code/deployment.yaml、scenarios/cache-store/deployment.yaml、scenarios/health-check/deployment.yaml、scenarios/hunger-check/deployment.yaml、scenarios/internal-proxy/deployment.yaml、scenarios/kubernetes-goat-home/deployment.yaml、scenarios/poor-registry/deployment.yaml、scenarios/system-monitor/deployment.yaml、scenarios/hidden-in-layers/deployment.yaml; - 输出提示:确保所有 Pod 处于 Running 状态后再运行
access-kubernetes-goat.sh。
部署完成后的验证
脚本执行完毕后,回到仓库根目录确认资源就绪:
kubectl get pods此时应看到kubernetes-goat-home、health-check、internal-proxy、system-monitor、poor-registry、hunger-check、batch-check等负载陆续进入 Running 状态。
访问 Kubernetes Goat 环境
集群与场景就绪后,在仓库根目录执行:
bash access-kubernetes-goat.shaccess-kubernetes-goat.sh 的工作方式是:对每个目标 Pod 循环轮询其status.phase与containerStatuses[*].ready(未就绪时每 10 秒重试一次),全部就绪后为各 Pod 建立kubectl port-forward,把本地 1230~1236 端口段映射到集群内各服务:
| 本地端口 | 目标 Pod / 容器端口 | 对应场景 |
|---|---|---|
| 1230 | build-code:3000 | 代码库中泄露敏感密钥 |
| 1231 | health-check:80 | Docker-in-Docker 利用 |
| 1232 | internal-proxy:3000 | K8s 世界中的 SSRF |
| 1233 | system-monitor:8080 | 容器逃逸访问宿主系统 |
| 1234 | kubernetes-goat-home:80 | Goat 门户首页 |
| 1235 | poor-registry:5000 | 攻击私有镜像仓库 |
| 1236 | hunger-check:8080(big-monolith命名空间) | 资源 DoS |
随后浏览器访问http://127.0.0.1:1234即可进入 Kubernetes Goat 首页,逐个点开场景开始演练。该脚本同样支持--insecure与--kubeconfig参数,解析逻辑与 setup 脚本一致。
KIND 环境下的安全特性:为什么漏洞场景能生效
Kubernetes Goat 的许多场景依赖特权容器与 hostPath 挂载,例如 scenarios/health-check/deployment.yaml 中:
- Pod 的
securityContext.privileged: true; - 以
hostPath: /只读挂载宿主根目录(host-root卷),由一个busyboxinit 容器探测containerd.sock或docker.sock的位置,再软链到统一卷container-socket-unified,主容器把该 socket 挂到/var/run/docker.sock、/run/docker.sock等多个路径。
在普通 Kubernetes 集群中,这些挂载指向的是物理/虚拟机宿主;而在 KIND 上,"宿主"就是kubernetes-goat-cluster对应的 KIND 节点容器——你在其中做容器逃逸、DinD 利用,边界止于该节点容器,这正是 KIND 适合安全实验的原因:真实漏洞链可完整复现,但影响面可控。
访问与拆除:README 的完整操作对照
platforms/kind-setup/README.md 将 Bash 与 Windows(PowerShell)两套入口并列给出,与本文主体流程完全一致:
| 操作 | Bash | Windows PowerShell |
|---|---|---|
| 部署集群 + Goat | bash setup-kind-cluster-and-goat.sh | .\setup-kind-cluster-and-goat.ps1 |
| 暴露场景到本地 | bash access-kubernetes-goat.sh | .\access-kubernetes-goat.ps1 |
| 拆除环境 | bash teardown-cluster.sh | .\teardown-cluster.ps1 |
其中 teardown-cluster.sh 只有两行核心逻辑:先调用根目录的 teardown-kubernetes-goat.sh 清理 Goat 资源(删除 superadmin ClusterRoleBinding 与 ServiceAccount、删除 all-your-base / belong-to-us 等 RBAC、helm delete metadata-db --no-hooks、删除 kube-system 中的 tiller-deploy,并逐一kubectl delete -f各场景清单),再执行kind delete cluster --name kubernetes-goat-cluster销毁整个 KIND 集群。README 也建议:练习结束后彻底删除集群,比逐个清理资源更干净。
小结与下一步
本文沿仓库 KIND 部署文档的主线,覆盖了前置工具准备、一键部署脚本的内部机制、集群配置拓扑、场景部署顺序、端口转发映射、KIND 下漏洞场景的生效原理以及环境拆除方式。部署成功后,可继续按 Getting Started 指南 从http://127.0.0.1:1234门户进入各个场景逐一演练;各场景的完整 YAML 与镜像构建代码均可在仓库 scenarios 与 infrastructure 目录中对照阅读,便于从"能跑通"深入到"看得懂为什么这么脆弱"。
【免费下载链接】kubernetes-goatKubernetes Goat is a "Vulnerable by Design" cluster environment to learn and practice Kubernetes security using an interactive hands-on playground 🚀项目地址: https://gitcode.com/GitHub_Trending/ku/kubernetes-goat
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考