4. Kyverno策略语言基础
Kyverno 策略语言的设计哲学是“Kubernetes 原生”——策略本身就是一个 Kubernetes 资源(CRD),使用 YAML 声明式定义。理解策略的层级结构是编写安全基线核验策略的第一步。本章将拆解 Policy / ClusterPolicy、Rule、Match / Exclude 和 Any / All 条件四个核心概念。
4.1 策略顶层结构:Policy 与 ClusterPolicy
Kyverno 提供两种策略作用域:
| 类型 | 作用域 | 适用场景 | 示例 |
|---|---|---|---|
| Policy | 命名空间级别 | 多租户隔离、团队级安全基线 | 只允许特定命名空间使用 privileged: true |
| ClusterPolicy | 集群级别 | 全局安全基线、合规核验、平台级策略 | 所有命名空间禁止挂载 Docker Socket |
关键区别: ClusterPolicy 可以匹配集群范围的资源(Node、PV、ClusterRole),且
spec.rules.exclude.resources 支持按命名空间排除。在安全基线核验中,90% 的策略应定义为 ClusterPolicy,以确保覆盖所有工作负载。
4.2 规则(Rule):策略的执行单元
每个策略包含一个或多个 rules,每个规则由 匹配条件 + 执行动作 组成。规则结构如下:
spec:
rules:
- name: "require-readonly-rootfs"
match:
any:
- resources:
kinds: ["Pod"]
exclude:
any:
- resources:
namespaces: ["kube-system", "kyverno"]
validate:
message: "根文件系统必须设置为只读"
pattern:
spec:
containers:
- securityContext:
readOnlyRootFilesystem: true
规则的核心字段:
- name:规则唯一标识,用于审计日志和策略报告。
- match / exclude:定义资源选择器(见 4.3 节)。
- validate / mutate / generate:执行动作,安全基线核验主要使用
validate。
4.3 匹配与排除(Match / Exclude)
Match 和 Exclude 使用相同的选择器语法,支持按 资源类型、标签、命名空间、注解、用户信息 等维度过滤。两者都支持 any 和 all 条件块。
4.3.1 匹配(Match)
定义策略生效的目标资源。常用匹配维度:
- kinds:资源类型列表,如
["Pod", "Deployment"]。 - namespaces:目标命名空间列表。
- selector:标签选择器(matchLabels / matchExpressions)。
- annotations:注解键值对匹配。
4.3.2 排除(Exclude)
从匹配结果中移除特定资源。典型排除场景:
- 排除系统命名空间(
kube-system、kyverno)。 - 排除带有
security-baseline: exempt标签的命名空间。 - 排除特定用户或 ServiceAccount 创建的 Pod。
最佳实践: 在安全基线策略中,始终在
exclude 块中排除 kube-system 和 kyverno 命名空间,避免策略引擎自锁或影响集群核心组件。
4.4 条件块:Any 与 All
Kyverno 在 match/exclude 中引入 any 和 all 条件块,实现灵活的布尔逻辑组合。
| 条件块 | 逻辑语义 | 匹配行为 | 典型用途 |
|---|---|---|---|
| any | OR(或) | 满足任意一个条件即匹配 | 匹配多种资源类型或多种标签组合 |
| all | AND(与) | 必须满足所有条件才匹配 | 同时校验资源类型 + 标签 + 命名空间 |
4.4.1 Any 示例:匹配多种高危资源
match:
any:
- resources:
kinds: ["DaemonSet"]
- resources:
kinds: ["StatefulSet"]
namespaces: ["production"]
上述规则匹配 所有 DaemonSet 或 production 命名空间下的 StatefulSet。
4.4.2 All 示例:精确锁定目标
match:
all:
- resources:
kinds: ["Pod"]
- resources:
selector:
matchLabels:
app: critical
- resources:
namespaces: ["production"]
仅匹配 production 命名空间中带有 app: critical 标签的 Pod。
常见陷阱: 在
match 中同时使用 any 和 all 时,any 和 all 是平级关系,Kyverno 会先分别计算两个块的结果,然后取 OR。如果希望实现更复杂的嵌套逻辑,建议拆分为多个规则。
4.5 策略结构全景图
下图展示了 Kyverno 策略的完整层级关系,以及 Match/Exclude 与 Any/All 的协作方式:
4.6 安全基线核验中的策略结构设计模式
在云原生安全基线核验场景中,推荐采用以下策略结构模板:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: security-baseline-pod
spec:
validationFailureAction: Enforce # 核验模式:Enforce 或 Audit
background: true # 对存量资源进行扫描
rules:
- name: "disallow-privileged-containers"
match:
any:
- resources:
kinds: ["Pod"]
exclude:
any:
- resources:
namespaces: ["kube-system", "kyverno", "local-path-storage"]
validate:
message: "禁止使用特权容器"
pattern:
spec:
containers:
- securityContext:
privileged: false
设计要点:
- ClusterPolicy:确保策略覆盖所有命名空间。
- validationFailureAction: Enforce:在核验阶段直接拒绝违规资源。
- background: true:对集群中已有的资源进行扫描,生成策略报告。
- exclude 系统命名空间:避免策略引擎影响集群核心组件。
4.7 本章小结
Kyverno 策略语言的四个核心层级构成了安全基线核验的骨架:
- Policy / ClusterPolicy:决定策略的作用域(命名空间级 vs 集群级)。
- Rule:策略的执行单元,包含匹配条件和执行动作。
- Match / Exclude:精确控制策略的目标资源范围。
- Any / All:提供灵活的布尔逻辑组合,支持复杂场景的匹配需求。