Kubernetes集群安全弱点自查工具(已停止开发)
项目状态:已停止开发,不建议在新项目中继续使用。 kube-hunter 的仓库 README 明确写着「kube-hunter is not under active development anymore」,官方给出的替代方案是 Trivy 的 Kubernetes 配置扫描与 KBOM 漏洞扫描。最后一个小版本 0.6.8 发布于 2022 年 5 月,仓库自 2024 年 3 月起没有实质更新,其内置的漏洞知识库也不会再跟进新的 Kubernetes 版本。若目标是持续性的安全检查,请直接使用
trivy;本文保留 kube-hunter 的用法,主要供已在使用旧流水线的团队查阅,以及理解「从攻击者视角看集群暴露面」这一思路。
kube-hunter 是 Aqua Security 开源的集群安全弱点扫描器,用于在自己的集群上做一次「如果我是攻击者,我能看到什么、能走到哪一步」的自查。它与 kube-bench 互补:kube-bench 逐条比对 CIS 基线文本,kube-hunter 则从网络与服务出发,主动发现暴露的端口、匿名可访问的接口和过宽的权限。
它的核心价值在视角:以 Pod 内身份、以节点身份、或以一个只能访问网络的匿名身份去探测,把「配置弱点」还原成「实际可达的攻击路径」。
三种扫描位置:
远程扫描(remote) 从集群外扫描 API Server、kubelet、etcd 等暴露端口
节点扫描(node) 在节点上执行,扫描本机网络接口与本地服务
Pod 内扫描(pod) 在集群内以普通 Pod 身份运行,看到的是「攻陷一个容器后能到达的范围」
结果按四类组织:
Vulnerabilities 可被直接利用的漏洞,需要优先处置
Weaknesses 配置弱点,单独看不致命,组合起来可能构成攻击链
Services 探测到的开放服务与端口,用于理解暴露面
Nodes 发现的主机及其角色
# 方式一:pip 安装(需要 Python 3.x)
pip install kube-hunter
kube-hunter --help
# 隔离环境安装(推荐,避免污染系统 Python)
pipx install kube-hunter
# 方式二:容器运行(自带全部依赖)
docker run -it --rm --network host aquasec/kube-hunter
docker run --rm aquasec/kube-hunter --cidr 192.168.0.0/24
# 方式三:源码运行
git clone https://github.com/aquasecurity/kube-hunter.git
cd kube-hunter
pip install -r requirements.txt
./kube-hunter.py --help
kube-hunter [options]
不接任何参数时会进入交互式菜单,让你选择扫描方式;脚本化使用时请显式给出目标参数。
--remote <host> 扫描指定的远程主机(IP 或域名),默认端口 443/6443 等
--cidr <网段> 扫描整个网段,如 192.168.0.0/24
--interface 扫描本机所有网卡所在的网段
--pod 以 Pod 内身份扫描,自动发现集群节点(权限受限的视角)
--active 启用主动模式:尝试利用发现的漏洞以获得更深的信息
--quick 把网段扫描限制在 /24,用于云上按 Pod 出网场景
--list 列出全部可执行的检查项(配合 --active 可看主动检查项)
--mapping 只输出节点与服务的网络拓扑图
--log <级别> 日志级别:DEBUG / INFO(默认)/ WARNING
--report <格式> 结果格式
--dispatch <方式> 结果投递方式:stdout(默认)/ http
HTTP 投递通过环境变量配置:
KUBEHUNTER_HTTP_DISPATCH_URL=https://collector.example.com/ingest
KUBEHUNTER_HTTP_DISPATCH_METHOD=POST
# 被动(默认):只做探测与只读查询,不会改变集群任何状态
kube-hunter --remote 10.0.0.10
kube-hunter --cidr 10.0.0.0/24
kube-hunter --pod
# 主动:发现弱点后会尝试利用,可能创建/修改集群内对象
kube-hunter --active --remote 10.0.0.10
官方对主动模式的描述是「can potentially do state-changing operations on the cluster」。主动模式只能在你自己拥有、且允许被破坏的测试集群上使用,绝不要对着生产集群或任何不属于你的集群运行。
# 从外部看 API Server 暴露了什么(最常用的第一次扫描)
kube-hunter --remote api.example.com
# 扫描整个内网网段,找出所有暴露的 6443 / 10250 / 2379
kube-hunter --cidr 10.0.0.0/24 --log WARNING
# 只看网络拓扑,先摸清有多少节点、开了哪些端口
kube-hunter --cidr 10.0.0.0/24 --mapping
# 在集群内以普通 Pod 身份自查:攻陷一个容器后能走多远
kube-hunter --pod
# 列出全部检查项,配合自建的加固清单做核对
kube-hunter --list
# 在测试集群上做主动验证(高风险,仅限自有测试环境)
kube-hunter --active --cidr 10.0.0.0/24
# 把结果投递到集中采集端
KUBEHUNTER_HTTP_DISPATCH_URL=https://collector.example.com/ingest \
kube-hunter --cidr 10.0.0.0/24 --dispatch http
这是最贴近真实攻击者视角的方式:以一个使用默认 ServiceAccount 的普通 Pod 运行,看它能发现什么。
# 应用官方 Job 清单
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-hunter/main/job.yaml
# 或者克隆仓库后使用本地清单
git clone https://github.com/aquasecurity/kube-hunter.git
cd kube-hunter
kubectl create -f ./job.yaml
# 查看结果(结果写在容器标准输出)
kubectl describe job kube-hunter
kubectl get pods -l job-name=kube-hunter
kubectl logs <pod-name>
# 清理
kubectl delete -f ./job.yaml
Job 默认不带 --active。--pod 模式下 kube-hunter 会使用挂载进容器的 ServiceAccount Token 做 API 调用 —— 这也正是它的意义所在:如果这个默认身份的权限过大,扫描结果会直接暴露出来。建议把它部署在独立的命名空间里,不要用 default,更不要给它挂 cluster-admin。
把扫描输出当作待办清单,常见条目与对应的修复方向:
Kubelet 匿名认证开启(10250 未鉴权)
→ 在 kubelet 配置中设置 authentication.anonymous.enabled: false
→ 同时把 authorization.mode 设为 Webhook
Kubelet 只读端口 10255 暴露
→ 该端口已在新版本移除;老集群应在启动参数中显式关闭 read-only port
API Server 允许匿名请求
→ 移除 --anonymous-auth=true,或在 --anonymous-auth=false 下重启 apiserver
Dashboard / 其他控制台未鉴权可访问
→ 不对外暴露,或接入统一身份认证并收紧 RBAC
暴露等权限过宽(默认可写、能建 Pod、能读 Secret)
→ 用 kubectl auth can-i --list --as=system:serviceaccount:<ns>:<sa> 核对实际权限
→ 按最小权限重建 Role/ClusterRole,参照 rbac 页面的做法
etcd 2379 对外可达
→ etcd 只监听内网/本地,启用客户端证书认证
容器可以挂载宿主机目录 / 以特权运行
→ 施加 Pod Security Admission 的 baseline 或 restricted 级别
修复完必须重跑一遍验证,而不是改完即认为闭环。
pip uninstall kube-hunter
pipx uninstall kube-hunter
# 清掉集群内留下的 Job 与 Pod
kubectl delete job kube-hunter -n <命名空间>
--active 会改变集群状态。它会尝试利用已发现的弱点(例如匿名创建 Pod)来深入探测,可能留下残留对象甚至造成服务中断。生产集群永远不要开主动模式;确需验证时,请在可随时销毁的测试集群里进行。Vulnerabilities 与 Weaknesses 要区别对待。前者是可直接利用的路径,应作为阻断项立即处理;后者多为配置项,需要结合业务判断。把两者混作一堆会淹没真正紧急的条目。--cidr 网段扫描会产生大量流量,可能触发云厂商的告警或网络 ACL 限流。生产网段上执行前应先与网络团队确认窗口,优先用 --quick 限制在 /24。--remote 的默认端口有限,自建的非标准端口(如把 apiserver 映射到 8443)可能扫不到,需要结合 --mapping 与手工确认。aquasec/kube-hunter 镜像长期未更新,其中的知识库停留在 2022 年,新版本 Kubernetes 的默认配置可能已与它的判断标准不符,容易产生误报或漏报。--exit-code 与 Trivy 的 --exit-code 才是为此设计的。create、list 请求并可能触发安全告警,提前告知值班同学可以避免误判为入侵。kube-bench — CIS 安全基线检查(活跃维护,推荐)trivy — 官方推荐的替代工具,覆盖配置与 KBOM 漏洞扫描kubectl — Kubernetes集群管理工具rbac — 核对扫描发现的过宽权限pod-security-admission — 收敛容器特权,减少可达的攻击面