必须将Kyverno的validationFailureAction设为enforce才能拦截不合规资源;禁止特权容器需在ClusterPolicy中匹配Pod并校验securityContext.privileged为false;镜像仓库校验须用deny+NotIn而非pattern正则;Gatekeeper约束模板中requests字段是map而非数组,需正确编写rego路径。

在Kubernetes集群中强制执行镜像签名验证、禁止特权容器、要求资源配额等平台级合规策略,必须在API请求准入阶段拦截并决策,不能依赖事后扫描或人工检查。
安装Kyverno并启用强制校验模式
执行命令直接部署Kyverno最新稳定版:kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/master/definitions/release/install.yaml
确认Pod运行状态:kubectl get pods -n kyverno —watch,直到所有Pod显示Running且READY为1/1。
默认安装使用audit模式,【必须修改validationFailureAction为enforce】才能真正拦截不合规资源,否则仅记录事件而不阻止创建。
用Kyverno定义基础安全校验策略
方法一:禁止特权容器
创建ClusterPolicy文件,关键字段match.resources.kinds必须包含Pod,validate.deny.message需明确提示错误原因:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: block-privileged-pods
spec:
validationFailureAction: enforce
rules:
- name: validate-security-context
match:
resources:
kinds:
- Pod
validate:
message: "Privileged mode is not allowed"
pattern:
spec:
containers:
- securityContext:
privileged: false
应用该策略后,任何含privileged: true的Pod清单提交都会被拒绝,并返回清晰路径提示(如path /spec/containers/0/securityContext/privileged)。
方法二:强制镜像使用可信仓库域名
利用JMESPath提取镜像名并匹配正则:pattern.metadata.annotations.`image-registry` == "gcr.io|ghcr.io|harbor.example.com"这种写法无效——Kyverno不支持在pattern中直接写正则。正确做法是用validate.deny与JMESPath组合:
validate:
deny:
conditions:
- key: "{{ request.object.spec.containers[0].image }}"
operator: NotIn
value:
- "gcr.io/*"
- "ghcr.io/*"
- "harbor.example.com/*"
注意:此规则只检查第一个容器,若Deployment含多个容器需改用foreach循环语法,否则存在绕过风险。
OPA Gatekeeper替代方案:部署+约束模板
第一步:安装Gatekeeper CRD和控制器
运行helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts && helm install gatekeeper gatekeeper/gatekeeper --namespace gatekeeper-system --create-namespace
第二步:创建ConstraintTemplate定义“必须设置资源requests”规则
该模板声明一个名为k8srequiredresources的约束类型,其中rego代码需精确匹配Container对象路径,错误写成request.object.spec.containers[*].resources.requests.memory会导致匹配失败——因为Kubernetes API中requests字段是map结构,不是数组。
第三步:实例化Constraint约束
创建K8sRequiredResources资源,spec.match.kinds指定为[{"kind":"Pod"},{"kind":"Deployment"},{"kind":"StatefulSet"}],这样能覆盖控制器类资源及其生成的Pod。
第四步:验证约束生效
尝试kubectl run nginx --image=nginx --restart=Never,若未设resources.requests,会收到类似"container nginx has no resources requests"的拒绝响应。


















