2. Kubernetes集群安全基线
2.1 CIS Kubernetes Benchmark 标准解读
CIS(Center for Internet Security)Kubernetes Benchmark 是业界公认的 Kubernetes 集群安全配置基线标准。该标准针对不同版本的 Kubernetes 组件(kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、etcd 等)提供了详细的审计与加固建议。每个检查项被划分为以下等级:
| 等级 | 含义 | 典型示例 |
|---|---|---|
| Level 1 | 基础安全要求,不显著影响性能或可用性 | 禁止匿名请求、启用审计日志 |
| Level 2 | 深度防御要求,可能带来性能或运维成本 | 启用 Pod 安全策略、限制 Secret 加密 |
| Scored | 可自动化评分,直接影响合规分数 | kubelet 证书轮换、RBAC 最小权限 |
| Not Scored | 建议性检查,不纳入评分体系 | 容器镜像标签策略、命名空间命名规范 |
关键原则:初始策略组应优先修复所有 Level 1 + Scored 的检查项,这些项覆盖了最常见的攻击面且对业务影响最小。
2.2 Kube-bench 工具介绍
Kube-bench 是 Aqua Security 开源的 CIS Benchmark 自动化检测工具。它通过运行一组 Go 语言编写的检查程序,对比当前集群配置与 CIS 标准,输出 JSON/YAML 格式的合规报告。Kube-bench 支持以下运行模式:
- 本地节点模式:直接在 Master/Worker 节点上运行二进制文件,检测本地组件配置。
- Job 模式:以 Kubernetes Job 形式部署到集群中,自动检测所有节点。
- DaemonSet 模式:在每个节点上运行一个 Pod,持续监控配置漂移。
# 使用 Job 模式运行 kube-bench(推荐初始基线扫描)
kubectl apply -f https://raw.githubusercontent.com/aquasecurity/kube-bench/main/job.yaml
# 查看检测结果
kubectl logs job/kube-bench
# 输出示例片段(JSON 格式)
{
"id": "1.1.1",
"text": "Ensure that the API server pod specification file permissions are set to 644 or more restrictive",
"type": "manual",
"score": "WARN",
"remediation": "Run: chmod 644 /etc/kubernetes/manifests/kube-apiserver.yaml"
}
实践建议:在 CI/CD 流水线中集成 kube-bench,每次集群变更后自动触发扫描,并将结果与初始基线对比,防止配置退化。
2.3 初始策略组设计原则
初始策略组是集群上线前必须强制执行的一组安全配置集合。设计时应遵循以下五大原则:
- 最小权限原则:所有组件、用户、ServiceAccount 仅授予完成任务所需的最小权限。例如:kubelet 使用 TLS 证书认证而非 ,避免使用 cluster-admin 角色。
- 纵深防御原则:在多个层面设置安全控制。网络层(NetworkPolicy)、容器层(SecurityContext)、节点层(AppArmor/Seccomp)形成多层防护。
- 可审计原则:启用 API Server 审计日志、kubelet 日志、etcd 日志,并配置集中式日志收集(如 ELK/Loki)。
- 默认拒绝原则:所有未显式允许的访问默认拒绝。例如:默认拒绝所有 Ingress 流量,仅开放必要端口;默认拒绝特权容器。
- 自动化与可重复原则:策略组应通过 Infrastructure as Code(IaC)管理,使用 OPA/Gatekeeper、Kyverno 等策略引擎自动执行,避免人工操作。
常见误区:不要一次性启用所有 CIS 检查项。部分 Level 2 项(如强制 Pod 使用只读根文件系统)可能破坏现有应用。初始策略组应选择 Scored + Level 1 项,逐步迭代。
2.4 初始策略组与 CIS Benchmark 映射关系
下表展示了初始策略组中必须包含的核心策略及其对应的 CIS 检查项 ID:
| 策略组类别 | 具体策略 | CIS 检查项 ID | 严重等级 |
|---|---|---|---|
| API Server 安全 | 禁用匿名请求、启用 TLS 1.2+、设置审计日志 | 1.1.1, 1.2.1, 1.2.2 | Level 1 |
| etcd 安全 | 启用 TLS 认证、限制访问 IP、启用数据加密 | 2.1, 2.2, 2.3 | Level 1 |
| kubelet 安全 | 启用证书轮换、禁用只读端口、设置身份验证模式 | 4.1.1, 4.2.1, 4.2.2 | Level 1 |
| Pod 安全 | 禁止特权容器、限制容器用户为 non-root、启用只读根文件系统 | 5.1.1, 5.1.2, 5.1.3 | Level 2 |
| 网络策略 | 默认拒绝所有入站/出站流量、仅允许必要端口 | 5.3.1, 5.3.2 | Level 1 |
2.5 初始策略组设计流程
下图展示了从 CIS 标准到初始策略组落地的完整设计流程:
2.6 初始策略组参数调优示例
以下是一个基于 CIS Benchmark 的初始策略组 YAML 配置片段,使用 OPA/Gatekeeper 实现:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: require-security-context
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
labels:
- key: "security-tier"
allowedRegex: "^baseline|restricted$"
---
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedUsers
metadata:
name: non-root-container
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
parameters:
runAsUser:
min: 1000
max: 65535
runAsGroup:
min: 1000
max: 65535
参数调优要点:
- runAsUser 范围:根据业务容器实际用户 ID 调整,避免设置过严导致 Pod 启动失败。
- allowedRegex:初始阶段可放宽为
^baseline|restricted|privileged$,逐步收紧。 - 豁免机制:为系统组件(如 kube-proxy、coredns)设置豁免标签,避免影响集群核心功能。