LabHub
学习 学习路径 课程

KCA — Kyverno 认证助理

晋级流程,以及不用策略也能做到的事

在 LabHub 中继续学习

目标

通过清单和脚本实现将策略从观察模式提升为强制模式的流程,并仅使用 PSA 标签、而不依赖策略引擎建立同类控制,从而理解这两种方法的边界。

为什么重要

善用策略工具与做好策略运维是两种不同的能力。在生产环境中,重要的不是规则有多精巧,而是判断“现在是否可以把这条规则提升为强制执行”的流程。判断依据来自报告,流程则必须固化为脚本,才能在人员更替后继续保持。同时还要从反方向提问:像 Pod 安全级别这样已标准化的检查,只需两行命名空间标签即可完成;如果连这类检查也放进策略引擎,只会增加需要运维的组件。在本实验中并排建立两种方案,可以清楚看到它们的边界。

步骤

  1. 创建 /root/kca-ops/ 目录,在 policy-baseline.yaml 中填写 kind ClusterPolicymetadata.name kca-baseline。将 spec.validationFailureAction 设为 Audit,并在 spec.validationFailureActionOverrides 中加入两项:以 Enforce 对待 kca-prod,以 Audit 对待 kca-dev。还必须至少包含一条规则。
  2. 在同一文件中,将 spec.webhookConfiguration.timeoutSeconds 设为 20,将 spec.webhookConfiguration.failurePolicy 设为 Ignore。不要使用已弃用的 spec.webhookTimeoutSecondsspec.failurePolicy
  3. 在同一文件中,将 spec.background 设为 truespec.admission 设为 truespec.applyRules 设为 All,并创建至少两条规则。
  4. /root/kca-ops/policyexception.yaml 中填写 apiVersion kyverno.io/v2beta1、kind PolicyExceptionmetadata.name kca-allow-monitoring。将 spec.exceptions[0].policyName 设为 kca-baseline,在 ruleNames 中加入第 1 步创建的规则名称,在 spec.match.any[0].resources.namespaces 中加入 kca-monitoring,在 names 中加入 prometheus-*
  5. /root/kca-ops/promote.sh 创建为具有执行权限的 Shell 脚本。其中必须包含使用 kyverno apply--resource 的本地验证、检查 PolicyReport、检查 Webhook 注册或 UpdateRequest、提升到 Enforce 的步骤,以及失败时以非零代码退出的处理。
  6. 在集群中创建命名空间 kca-prod,并添加标签 pod-security.kubernetes.io/enforce=restrictedpod-security.kubernetes.io/enforce-version。命名空间 kca-dev 只添加 pod-security.kubernetes.io/warn=baseline,不要添加 enforce 标签。
  7. 在命名空间 kca-prod 中实际创建 Deployment kca-hello。Pod 级 securityContext.runAsNonRoot 必须为 truesecurityContext.seccompProfile.type 必须为 RuntimeDefault;容器级 securityContext.allowPrivilegeEscalation 必须为 falsecapabilities.drop 中必须包含 ALL。另外,创建命名空间 kca-monitoring 并添加标签 pod-security.kubernetes.io/enforce=privileged

参考

按命名空间差异化应用

创建 /root/kca-ops/ 目录,在 policy-baseline.yaml 中填写 kind ClusterPolicymetadata.name kca-baseline。将 spec.validationFailureAction 设为 Audit,并在 spec.validationFailureActionOverrides 中加入两项:以 Enforce 对待 kca-prod,以 Audit 对待 kca-dev。还必须至少包含一条规则。

策略整体默认采用观察模式,再在覆盖数组中按命名空间指定不同动作。action 和 namespaces 两个字段共同组成一个条目。

迁移到 webhookConfiguration

在同一文件中,将 spec.webhookConfiguration.timeoutSeconds 设为 20,将 spec.webhookConfiguration.failurePolicy 设为 Ignore。不要使用已弃用的 spec.webhookTimeoutSecondsspec.failurePolicy

从 1.13 开始,超时和失败策略移到了同一个块下。旧位置的字段不能保留;还请思考为了不让观察阶段的策略阻塞集群,应选择哪种失败策略。

设置 background、admission、applyRules

在同一文件中,将 spec.background 设为 truespec.admission 设为 truespec.applyRules 设为 All,并创建至少两条规则。

这三个标志分别决定是否扫描现有资源、是否应用于准入,以及应用多少条规则。最后一个字段会导致列出多条规则后,后面的规则却不执行。

用 PolicyException 建立合理例外

/root/kca-ops/policyexception.yaml 中填写 apiVersion kyverno.io/v2beta1、kind PolicyExceptionmetadata.name kca-allow-monitoring。将 spec.exceptions[0].policyName 设为 kca-baseline,在 ruleNames 中加入第 1 步创建的规则名称,在 spec.match.any[0].resources.namespaces 中加入 kca-monitoring,在 names 中加入 prometheus-*

例外需要同时指明策略名称和规则名称。不要只写命名空间并将其整体排除,还要通过名称模式进一步缩小范围。

编写提升检查清单脚本

/root/kca-ops/promote.sh 创建为具有执行权限的 Shell 脚本。其中必须包含使用 kyverno apply--resource 的本地验证、检查 PolicyReport、检查 Webhook 注册或 UpdateRequest、提升到 Enforce 的步骤,以及失败时以非零代码退出的处理。

只有同时包含本地验证、报告检查、诊断和失败时的非零退出,才能作为 CI 门禁使用。也不要忘记执行权限。

用 PSA 标签建立两个等级

在集群中创建命名空间 kca-prod,并添加标签 pod-security.kubernetes.io/enforce=restrictedpod-security.kubernetes.io/enforce-version。命名空间 kca-dev 只添加 pod-security.kubernetes.io/warn=baseline,不要添加 enforce 标签。

从这里开始操作真实集群。Pod Security Admission 通过命名空间标签工作,有 enforce、audit、warn 三种模式。也请思考为何需要同时固定版本标签。

创建可通过 restricted 的工作负载

在命名空间 kca-prod 中实际创建 Deployment kca-hello。Pod 级 securityContext.runAsNonRoot 必须为 truesecurityContext.seccompProfile.type 必须为 RuntimeDefault;容器级 securityContext.allowPrivilegeEscalation 必须为 falsecapabilities.drop 中必须包含 ALL。另外,创建命名空间 kca-monitoring 并添加标签 pod-security.kubernetes.io/enforce=privileged

restricted 等级要求四项:非 root 运行、禁止权限提升、移除全部 capability,以及设置 seccomp 配置。还要一并创建作为例外目标的命名空间。