2. Kubernetes 安全基线标准:CIS Benchmark、PSS 与 PSP 演进
Kubernetes 安全基线是云原生安全巡检的“度量衡”。本章深入解析三大核心标准:CIS Kubernetes Benchmark(行业合规基线)、Pod Security Standards (PSS)(策略即代码)以及已废弃的 Pod Security Policy (PSP) 的演进路径。理解这些标准是编写 Kyverno 规则与 OPA 策略的前提。
2.1 CIS Kubernetes Benchmark:行业合规基线
CIS (Center for Internet Security) Kubernetes Benchmark 是由社区与安全专家共同维护的最佳实践配置指南,覆盖控制平面、Worker 节点、RBAC、Pod 安全等 240+ 项检查项。它分为多个级别:
| 级别 | 说明 | 典型检查项示例 |
|---|---|---|
| Level 1 | 基础安全配置,直接影响集群安全 | 禁止匿名访问、启用审计日志、限制 kubelet 只读端口 |
| Level 2 | 纵深防御,适用于高安全环境 | Pod 使用只读根文件系统、启用 AppArmor/Seccomp |
| Automated | 可通过工具自动检测的项 | kube-bench 扫描结果、API Server 参数校验 |
| Manual | 需人工审计的项 | 证书管理流程、数据加密策略 |
巡检对齐点: Kyverno 和 OPA 可直接将 CIS 检查项转化为策略规则。例如,CIS 5.1.6 要求“确保 Pod 不设置 hostPID”,对应 Kyverno 规则:
spec.rules[].validate.deny.conditions.any[].key = "spec.hostPID"。
2.2 Pod Security Standards (PSS):策略即代码
PSS 是 Kubernetes 1.23+ 原生支持的三种安全等级,通过 PodSecurity 准入控制器或 Kyverno/OPA 实现。它替代了 PSP 的复杂模型,采用声明式标签驱动:
- Privileged:无限制,适用于特权容器(如网络插件)。
- Baseline:最小限制,禁止 hostPID、hostNetwork、特权提升等。
- Restricted:严格限制,强制只读根文件系统、非 root 用户、Seccomp 等。
实践建议: 在命名空间上添加标签
pod-security.kubernetes.io/enforce=restricted,即可自动拒绝违反 Restricted 级别的 Pod。Kyverno 可在此基础上补充自定义规则(如禁止挂载 Docker Socket)。
2.3 Pod Security Policy (PSP) 的演进与退役
PSP 是 Kubernetes 1.21 之前的安全策略机制,通过 PodSecurityPolicy 资源定义 Pod 安全约束。但由于以下缺陷,已在 1.25 版本中彻底移除:
- RBAC 耦合复杂:需要为每个 ServiceAccount 绑定 PSP,管理成本高。
- 更新困难:修改 PSP 需要重启所有 Pod,影响业务。
- 缺乏细粒度:无法按命名空间或标签灵活控制。
迁移警告: 如果集群仍在使用 PSP(K8s < 1.25),必须尽快迁移到 PSS + Kyverno/OPA 方案。Kyverno 提供
psp-migration 策略包,可自动将 PSP 规则转换为 Kyverno 策略。
2.4 三大标准对比与协同
| 标准 | 定位 | 实现方式 | 与 Kyverno/OPA 关系 |
|---|---|---|---|
| CIS Benchmark | 合规基线检查 | kube-bench 扫描、手动审计 | 作为策略规则来源,Kyverno 可自动修复 |
| PSS | Pod 安全等级 | PodSecurity 准入控制器 / 标签 | Kyverno 可增强 PSS(如自定义异常) |
| PSP (已废弃) | 历史安全策略 | PodSecurityPolicy 资源 | 需迁移到 PSS + Kyverno/OPA |
协同巡检示例: 使用 Kyverno 同时检查 CIS 5.1.6(禁止 hostPID)和 PSS Restricted(禁止特权提升),一条规则即可覆盖两个标准:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: cis-pss-combined
spec:
rules:
- name: deny-hostpid-privilege-escalation
match:
any:
- resources:
kinds:
- Pod
validate:
message: "违反 CIS 5.1.6 和 PSS Restricted:禁止 hostPID 和特权提升"
deny:
conditions:
any:
- key: "{{ request.object.spec.hostPID }}"
operator: Equals
value: true
- key: "{{ request.object.spec.containers[].securityContext.allowPrivilegeEscalation }}"
operator: AnyIn
value:
- true