超强Kyverno实战:10个生产级安全策略模板
引言: Kubernetes安全的隐形守护者
你是否曾因容器镜像使用:latest标签导致生产环境版本混乱?是否担忧特权容器突破隔离边界?作为Kubernetes原生策略引擎(Policy Engine),Kyverno通过声明式YAML配置,在集群准入控制(Admission Control)环节筑起安全防线。本文精选10个生产级策略模板,覆盖镜像管理、权限控制、资源配置等核心场景,配备完整代码示例与实施指南,助你30分钟构建企业级安全基线。
读完本文你将掌握:
- 阻止特权容器与危险挂载的5种防御策略
- 自动化资源配置与标签管理的最佳实践
- 零信任网络策略的快速落地方法
- 策略例外场景的精细化处理技巧
策略模板详解
1. 禁止使用:latest镜像标签
痛点::latest标签具有易变性,可能导致不同节点拉取到不同版本镜像,引发"在我电脑上能运行"的生产事故。
解决方案:通过双重验证确保镜像使用特定版本标签。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-latest-tag
spec:
admission: true
background: true
rules:
- name: require-image-tag
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "镜像必须指定标签(如nginx:1.25而非nginx)"
pattern:
spec:
containers:
- image: "*:*" # 确保包含标签分隔符
- name: validate-image-tag
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "禁止使用':latest'标签,需指定具体版本"
pattern:
spec:
containers:
- image: "!*:latest" # 感叹号表示否定匹配
validationFailureAction: Audit # 初始阶段设为审计模式
实施建议:部署后通过kubectl describe clusterpolicy disallow-latest-tag查看违反策略的Pod,2周后可将validationFailureAction改为Enforce强制拦截。
2. 禁止特权容器
风险分析:特权容器(Privileged Container)获得主机的root权限,可直接访问内核资源,是容器逃逸攻击的主要入口。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-privileged
spec:
admission: true
background: true
rules:
- name: validate-privileged
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "禁止使用特权容器,securityContext.privileged必须为false"
pattern:
spec:
containers:
- =(securityContext): # 问号表示该字段可能存在
=(privileged): false # 强制设为false
- name: validate-allowPrivilegeEscalation
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "禁止特权升级,allowPrivilegeEscalation必须为false"
pattern:
spec:
containers:
- securityContext:
allowPrivilegeEscalation: false
关键参数:allowPrivilegeEscalation: false可防止setuid二进制文件提升权限,即使容器以非root用户运行也需配置。
3. 强制设置资源请求与限制
资源治理必要性:未设置资源限制的Pod可能耗尽节点资源,导致级联故障。Kyverno可确保所有工作负载包含CPU/内存配置。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-pod-requests-limits
spec:
admission: true
background: true
rules:
- name: validate-resources
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "所有容器必须设置resources.requests和limits"
pattern:
spec:
containers:
- resources:
limits:
memory: "?*" # 内存限制是必须的
requests:
cpu: "?*" # CPU请求是必须的
memory: "?*" # 内存请求是必须的
进阶配置:结合values.yaml可设置默认资源值,使用mutate规则自动补全缺失配置:
# 示例:自动添加资源限制的mutate规则片段
mutate:
patchStrategicMerge:
spec:
containers:
- (name): "*"
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
4. 限制主机命名空间共享
攻击面分析:共享主机网络/进程命名空间(HostNetwork/HostPID)使容器能窥探主机进程与网络流量,是横向移动的高危入口。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-host-pid-ipc
spec:
admission: true
background: true
rules:
- name: validate-host-namespaces
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "禁止共享主机PID/IPC命名空间"
pattern:
spec:
=(hostIPC): "false" # 等号表示字段可选,存在时必须为false
=(hostPID): "false"
检测技巧:执行kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{.metadata.name} {.spec.hostPID} {.spec.hostIPC}{"\n"}{end}'找出违反策略的Pod。
5. 禁止主机路径挂载
安全风险:HostPath卷可能泄露主机敏感文件(如/etc/passwd、/var/run/docker.sock),甚至允许容器修改主机配置。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-bind-mounts
spec:
admission: true
background: true
rules:
- name: validate-hostPath
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "禁止使用hostPath卷"
pattern:
spec:
=(volumes):
- X(hostPath): "null" # X()表示禁止存在该字段
替代方案:使用PersistentVolumeClaim或emptyDir替代hostPath,敏感数据通过Secret/ConfigMap挂载。
6. 默认拒绝入站流量
零信任网络实践:Kubernetes默认允许所有Pod间通信,需通过NetworkPolicy实施最小权限原则。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-networkpolicy
spec:
admission: true
background: true
rules:
- name: default-deny-ingress
match:
any:
- resources:
kinds: ["Namespace"]
name: "*"
exclude:
any:
- resources:
namespaces: ["kube-system", "kyverno"] # 排除系统命名空间
generate:
kind: NetworkPolicy
name: default-deny-ingress
namespace: "{{request.object.metadata.name}}" # 引用新创建的命名空间
data:
spec:
podSelector: {} # 匹配命名空间内所有Pod
policyTypes: ["Ingress"] # 默认拒绝所有入站流量
synchronize: true # 命名空间删除时同步删除策略
工作原理:当创建新命名空间时,Kyverno自动生成拒绝所有入站流量的NetworkPolicy,应用团队需显式创建允许规则。
7. 强制标签规范
治理价值:统一的标签规范(如app.kubernetes.io/name)是实现流量管理、成本核算、资源调度的基础。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-certain-labels
spec:
admission: true
background: true
rules:
- name: validate-labels
match:
any:
- resources:
kinds: ["Pod"]
validate:
anyPattern: # 满足任一模式即通过
- metadata:
labels:
app.kubernetes.io/name: "?*" # 应用名称
- metadata:
labels:
app.kubernetes.io/component: "?*" # 组件名称
message: "必须包含'app.kubernetes.io/name'或'app.kubernetes.io/component'标签"
标签最佳实践:参考Kubernetes标签推荐,至少包含应用名称、版本和环境标签。
8. 禁止特权端口映射
端口安全:绑定1024以下特权端口可能被恶意利用,且通常不需要容器直接监听这些端口。
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-host-network-port
spec:
admission: true
background: true
rules:
- name: validate-host-port
match:
any:
- resources:
kinds: ["Pod"]
validate:
message: "禁止使用hostPort映射"
pattern:
spec:
containers:
- =(ports):
- X(hostPort): "null" # 禁止设置hostPort
实施策略:内部服务通过Service暴露,边缘服务使用Ingress控制器统一入口。
策略部署与管理
策略应用流程
- 审计模式部署:
kubectl apply -f disallow-latest-tag.yaml
- 监控违反情况:
kubectl get policyreports -A
kubectl describe policyreport -n default policy-report
- 强制执行: 修改策略中的
validationFailureAction: Enforce
策略优先级与例外处理
通过priority字段设置策略执行顺序(数值越高优先级越高):
spec:
priority: 100 # 默认0,特权容器策略应设为高优先级
rules: [...]
为特定资源创建例外:
spec:
rules:
- match:
any:
- resources:
kinds: ["Pod"]
exclude:
any:
- resources:
namespaces: ["security-exception"] # 例外命名空间
- resources:
names: ["monitoring-agent-*"] # 例外Pod名称
总结与进阶方向
本文介绍的10个策略模板构建了Kubernetes安全的基础防线,实际生产环境需根据业务场景扩展:
- 镜像安全:集成Cosign验证镜像签名
- 运行时防护:结合Falco检测异常行为
- 合规审计:生成PCI-DSS/ISO27001合规报告
- 自动化修复:使用mutate规则自动修复非合规配置
Kyverno的声明式策略将安全融入开发流程,避免"事后审计"的被动局面。建议从镜像标签、特权容器等高危场景开始实施,逐步构建纵深防御体系。立即部署这些策略模板,让安全成为Kubernetes集群的默认配置!
收藏本文,下次面对安全审计时,你将拥有一套立即可用的策略库。关注后续文章,解锁Kyverno与GitOps的集成实战!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



