4. 验证策略实战:强制Pod必须包含资源限制、禁止特权容器
本章进入策略验证的实战环节。我们将编写两条核心的Kyverno ClusterPolicy:一条强制Pod必须声明resources.limits,另一条禁止任何容器以特权模式运行。这两条策略是生产环境中最基础、最常用的安全与资源管控护栏。
4.1 策略一:强制资源限制(resources.limits)
在Kubernetes集群中,未设置资源限制的Pod可能导致节点资源被单个工作负载耗尽,引发“吵闹邻居”问题。Kyverno可以通过Mutate或Validate模式来强制资源限制。本实战采用Validate + Mutate组合:先验证是否已设置,若未设置则通过Mutate自动注入默认值。
4.1.1 策略YAML定义
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-resources-limits
spec:
validationFailureAction: Enforce
rules:
- name: check-resources-limits
match:
any:
- resources:
kinds:
- Pod
validate:
message: "Pod必须包含resources.limits配置。"
pattern:
spec:
containers:
- resources:
limits:
memory: "?*"
cpu: "?*"
- name: mutate-default-limits
match:
any:
- resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
spec:
containers:
- (name): "*"
resources:
limits:
memory: "512Mi"
cpu: "500m"
requests:
memory: "256Mi"
cpu: "250m"
关键参数说明:
validationFailureAction: Enforce:拒绝不符合策略的Pod创建请求。pattern中的?*:表示该字段必须存在且值非空。mutate规则:当验证失败时,自动注入默认资源限制,避免Pod被直接拒绝。
4.1.2 验证流程
部署策略后,通过以下步骤验证效果:
- 创建测试Pod(无资源限制)
kubectl run test-pod --image=nginx
预期结果:Pod创建被拒绝,返回Kyverno策略违规消息。
- 创建合规Pod(包含资源限制)
kubectl run compliant-pod --image=nginx --limits='cpu=500m,memory=512Mi'
预期结果:Pod成功创建。
- 查看策略审计日志
kubectl get policyreport -A
kubectl describe policyreport -n default
4.2 策略二:禁止特权容器
特权容器拥有宿主机内核级别的访问权限,是容器逃逸攻击的主要入口。Kyverno通过验证securityContext.privileged字段来禁止特权模式。
4.2.1 策略YAML定义
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-privileged-containers
spec:
validationFailureAction: Enforce
background: true
rules:
- name: check-privileged
match:
any:
- resources:
kinds:
- Pod
validate:
message: "禁止运行特权容器。"
anyPattern:
- spec:
containers:
- securityContext:
privileged: false
- spec:
containers:
- securityContext:
privileged: "false"
- spec:
containers:
- (securityContext):
(privileged): null
- spec:
containers:
- (securityContext): null
避坑指南:
anyPattern用于匹配多种合法情况:显式设为false、字符串false、未设置securityContext、未设置privileged字段。- 必须同时处理
initContainers和ephemeralContainers,否则攻击者可通过init容器绕过。 - 建议配合
background: true开启后台扫描,发现已存在的违规Pod。
4.2.2 扩展:禁止特权提升与只读根文件系统
在实际生产环境中,通常将特权容器策略与以下安全上下文约束组合使用:
| 安全字段 | 策略值 | 说明 |
|---|---|---|
privileged |
false |
禁止特权模式 |
allowPrivilegeEscalation |
false |
禁止特权提升 |
readOnlyRootFilesystem |
true |
强制只读根文件系统 |
runAsNonRoot |
true |
禁止以root用户运行 |
capabilities.drop |
["ALL"] |
删除所有Linux Capability |
4.3 策略验证流程图
下图展示了Kyverno在Pod创建请求到达API Server时的验证与变异流程:
4.4 流水线集成验证
在CI/CD流水线中,建议将策略验证分为两个阶段:
| 阶段 | 工具/命令 | 验证内容 | 失败处理 |
|---|---|---|---|
| 代码提交前 | kyverno apply |
本地YAML静态检查 | 阻止PR合并 |
| 部署到测试集群 | kubectl dry-run |
集群端动态验证 | 阻断部署流水线 |
| 生产环境 | Kyverno Enforce模式 | 实时准入控制 | 拒绝违规Pod创建 |
4.4.1 本地静态检查命令
# 安装Kyverno CLI
curl -sLO https://github.com/kyverno/kyverno/releases/download/v1.12.0/kyverno-cli_v1.12.0_linux_amd64.tar.gz
tar -xzf kyverno-cli_v1.12.0_linux_amd64.tar.gz
sudo mv kyverno /usr/local/bin/
# 对部署YAML执行策略检查
kyverno apply ./policies/ --resource ./deploy/pod.yaml --policy-report
4.4.2 GitLab CI集成示例
kyverno-policy-check:
stage: validate
image: kyverno/kyverno-cli:latest
script:
- kyverno apply policies/ --resource manifests/ --policy-report
only:
- merge_requests
- main
实战要点:
- 资源限制策略建议同时设置
requests和limits,避免调度器因缺乏requests信息而做出错误调度决策。 - 特权容器策略应配合
Pod Security Admission(PSA)使用,形成双层防护。 - 在流水线中,建议将策略检查放在单元测试之后、镜像构建之前,尽早发现配置问题。