Kubernetes API Server 暴露风险是什么
kube-apiserver 是集群的唯一入口,所有组件与运维操作都要经过它,默认监听 6443。它本身不是漏洞,风险来自权限配置:开启匿名认证会让未认证请求获得默认角色权限;给业务账号绑定 cluster-admin 会把一次应用失陷升级为集群接管;把控制面直接暴露到公网则让整个集群持续承受扫描与凭据尝试。托管集群默认收敛了多数项,但 RBAC 授权范围、审计配置与 kubelet 接口的暴露仍需要自行核查。
基本信息
| 默认端口 | 6443(kubelet 10250,调度器与控制器为本地端口) |
|---|---|
| 关键风险面 | 匿名认证开启、RBAC 授权过宽、控制面暴露公网 |
| 同级组件 | kubelet 接口可直接操作节点与容器,需要单独收敛 |
| 凭据形式 | kubeconfig 文件、服务账号令牌、客户端证书 |
| 核查手段 | kubectl auth can-i 模拟身份、审计日志、暴露面扫描 |
| 加固要点 | 关闭匿名认证、最小权限 RBAC、控制面不直接对公网、开启审计 |
典型暴露场景
- 自建集群为方便远程访问,把 6443 直接映射到公网地址
- 服务账号被授予 cluster-admin,任何有令牌的容器都能接管集群
- kubeconfig 文件散落在开发人员电脑与 CI 系统里且长期有效
- kubelet 的 10250 未限制来源,可绕过 API Server 直接操作节点
- 审计日志未开启,出事后无法判断谁做过什么操作
- 测试集群沿用简化配置,却与生产集群处在同一网络
收敛要点
收敛要点
1. 关闭匿名认证:--anonymous-auth=false
2. 不给公网暴露控制面;确需运维走堡垒机或 VPN
3. RBAC 最小权限:避免给业务账号 cluster-admin
4. kubelet:--anonymous-auth=false,限制 10250 来源
5. 审计日志开启并集中存储
6. kubeconfig 按人分发、定期轮换,离职人员权限及时回收核查命令(集群内)
核查命令(集群内)
kubectl cluster-info # 确认控制面地址与可达性
kubectl auth can-i get pods --as=system:anonymous -A
# 预期返回 no;返回 yes 说明匿名权限配置存在问题
kubectl get clusterrolebinding -o wide | grep cluster-admin # 核对高权限绑定
kubectl auth can-i list secrets --as=system:serviceaccount:<命名空间>:<账号名> -A风险点与收敛动作
| 风险点 | 后果 | 收敛动作 |
|---|---|---|
| 匿名认证开启 | 未认证请求获得默认权限 | 关闭匿名认证并重启组件 |
| RBAC 过宽 | 应用失陷即集群接管 | 按命名空间与资源收敛授权 |
| 控制面暴露公网 | 持续被扫描与尝试 | 改走 VPN 或堡垒机接入 |
| kubelet 暴露 | 绕过控制面操作节点 | 关闭匿名访问并限制来源 |
| 无审计日志 | 无法追溯操作 | 开启审计并集中存储 |
托管集群默认收敛多数项,但仍要核查 RBAC 授权与审计配置。
服务账号令牌是常见泄露点:优先使用短期令牌与工作负载身份机制,减少长期静态凭据的存放。