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 的协作方式:

Kyverno 策略结构全景图 Policy / ClusterPolicy 顶层容器:定义策略名称、背景、是否强制执行 Rule(规则) name + match + exclude + validate/mutate/generate Match(匹配) Exclude(排除) any(OR) all(AND) any(OR) all 资源选择器(Resource Selectors) kinds | namespaces | selector (labels) | annotations | userInfo 支持多个选择器组合,在 any/all 块内嵌套使用 执行动作:validate / mutate / generate 安全基线核验主要使用 validate(验证)模式

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:提供灵活的布尔逻辑组合,支持复杂场景的匹配需求。