Kubernetes 的安全上限取决于底层主机、控制面配置和日常运维。应用即使配置得很严格,节点一旦失陷,攻击者仍可能读取容器数据、凭证和网络流量。本文给出一套可执行的加固清单,并说明 kube-bench 应该怎样使用。
## 1. 先明确边界
集群加固至少覆盖四层:
1. 操作系统与账号。
2. 容器运行时与 kubelet。
3. API Server、Controller Manager、Scheduler 和 etcd。
4. 网络、日志、补丁与备份。
托管 Kubernetes 会替你管理一部分控制面,但节点、工作负载权限、网络策略和镜像安全仍由使用者负责。
## 2. 主机系统基线
- 使用受支持、精简的 Linux 发行版,关闭无关服务和端口。
- 及时安装安全更新,先在测试节点验证,再滚动到生产节点。
- 禁止 root 直接远程登录,使用个人账号、密钥和受控 sudo。
- 开启时间同步,保证证书、日志和审计时间一致。
- 为 Kubernetes 数据、容器数据和日志设置容量监控。
- 限制对 /etc/kubernetes、kubelet 配置、PKI 目录和 etcd 数据目录的访问。
- 防火墙只允许控制面、节点和运维网络真正需要的端口。
节点维护时先执行 drain,完成加固与重启检查后再 uncordon,避免直接中断业务。
## 3. kubelet 与容器运行时
kubelet 是节点上的高权限组件。应关闭匿名访问,使用 webhook 认证与授权,保护只读端口,避免公开调试接口。容器运行时 socket 等同于主机高权限入口,不要挂载给普通 Pod。
同时建议:
- 使用受支持的 containerd 或 CRI-O 版本。
- 默认启用 seccomp RuntimeDefault。
- 避免特权容器和主机命名空间。
- 限制 hostPath;确需挂载时设置最小目录和只读属性。
- 使用 cgroup 与资源 requests/limits,降低资源耗尽风险。
## 4. 控制面与 etcd
API Server 应仅通过 TLS 暴露,并限制到可信网络。认证、RBAC 和准入控制需要同时工作。etcd 中保存了集群状态和 Secret,应使用双向 TLS、限制监听地址、开启静态数据加密并定期备份。
常见检查点:
- 控制面 PKI 私钥只有 root 可读。
- Scheduler、Controller Manager 的非安全监听接口不暴露。
- Admission 插件和审计策略已启用。
- ServiceAccount 私钥、bootstrap token 和 kubeconfig 有轮换机制。
- etcd 快照经过恢复演练,而不只是“备份文件存在”。
## 5. 用 kube-bench 做 CIS 棈查
kube-bench 根据 CIS Kubernetes Benchmark 检查集群配置。它适合发现权限、参数和文件配置问题,但结果不是自动修复命令,也不能替代威胁建模。
一种常见运行方式是使用项目提供的 Job:
```bash
kubectl apply -f job.yaml
kubectl get pods
kubectl logs job/kube-bench
```
因为部分检查需要读取宿主机进程和目录,运行清单通常具有较高权限。应先审查 YAML,在维护窗口运行,完成后删除,并严格限制谁能创建这类 Job。
解读结果时:
- PASS:当前检查项通过,不等于整个集群安全。
- FAIL:确认版本、部署方式和业务需求,再制定修复计划。
- WARN:需要人工判断,记录接受风险或补偿措施。
- INFO:提供背景或手工检查说明。
Kubernetes 版本与 CIS 基准版本不是一一对应,运行前要确认 kube-bench 支持的测试集合。
## 6. 修复流程
1. 导出扫描结果并按控制面、节点、策略分类。
2. 先处理高影响且低风险的权限和暴露问题。
3. 在非生产环境修改静态 Pod 清单或组件参数。
4. 观察 API Server、etcd、kubelet 和业务健康状态。
5. 每次只做一组可回滚变更。
6. 重新扫描,并把例外项记录到风险清单。
## 7. 日常检查清单
- 每月检查补丁、证书、RBAC、公开端口和审计日志。
- 每季度执行基线扫描、etcd 恢复演练和账号复核。
- 重大升级后重新验证 Pod Security、NetworkPolicy 与安全工具兼容性。
- 发现节点异常时,先隔离节点,保护证据,再评估是否重建;不要只重启进程后继续使用。
## 参考资料
- https://github.com/aquasecurity/kube-bench
- https://kubernetes.io/docs/concepts/security/security-checklist/
- https://kubernetes.io/docs/concepts/security/linux-kernel-security-constraints/