晋级流程,以及不用策略也能做到的事
目标
通过清单和脚本实现将策略从观察模式提升为强制模式的流程,并仅使用 PSA 标签、而不依赖策略引擎建立同类控制,从而理解这两种方法的边界。
为什么重要
善用策略工具与做好策略运维是两种不同的能力。在生产环境中,重要的不是规则有多精巧,而是判断“现在是否可以把这条规则提升为强制执行”的流程。判断依据来自报告,流程则必须固化为脚本,才能在人员更替后继续保持。同时还要从反方向提问:像 Pod 安全级别这样已标准化的检查,只需两行命名空间标签即可完成;如果连这类检查也放进策略引擎,只会增加需要运维的组件。在本实验中并排建立两种方案,可以清楚看到它们的边界。
步骤
- 创建
/root/kca-ops/目录,在policy-baseline.yaml中填写 kindClusterPolicy、metadata.namekca-baseline。将spec.validationFailureAction设为Audit,并在spec.validationFailureActionOverrides中加入两项:以Enforce对待kca-prod,以Audit对待kca-dev。还必须至少包含一条规则。 - 在同一文件中,将
spec.webhookConfiguration.timeoutSeconds设为20,将spec.webhookConfiguration.failurePolicy设为Ignore。不要使用已弃用的spec.webhookTimeoutSeconds和spec.failurePolicy。 - 在同一文件中,将
spec.background设为true、spec.admission设为true、spec.applyRules设为All,并创建至少两条规则。 - 在
/root/kca-ops/policyexception.yaml中填写 apiVersionkyverno.io/v2beta1、kindPolicyException、metadata.namekca-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的步骤,以及失败时以非零代码退出的处理。 - 在集群中创建命名空间
kca-prod,并添加标签pod-security.kubernetes.io/enforce=restricted和pod-security.kubernetes.io/enforce-version。命名空间kca-dev只添加pod-security.kubernetes.io/warn=baseline,不要添加 enforce 标签。 - 在命名空间
kca-prod中实际创建 Deploymentkca-hello。Pod 级securityContext.runAsNonRoot必须为true,securityContext.seccompProfile.type必须为RuntimeDefault;容器级securityContext.allowPrivilegeEscalation必须为false,capabilities.drop中必须包含ALL。另外,创建命名空间kca-monitoring并添加标签pod-security.kubernetes.io/enforce=privileged。
参考
- 可以用
kubectl label ns kca-prod pod-security.kubernetes.io/enforce=restricted pod-security.kubernetes.io/enforce-version=latest一次添加两个标签。 - 可先用
bash -n /root/kca-ops/promote.sh检查脚本。 - 常见错误 1:将 PolicyException 宽泛地开放给整个命名空间。必须进一步缩小到名称模式,例外才能保持为例外。
- 常见错误 2:不固定 PSA 标签的版本。这样集群升级会改变策略内容。
按命名空间差异化应用
创建 /root/kca-ops/ 目录,在 policy-baseline.yaml 中填写 kind ClusterPolicy、metadata.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.webhookTimeoutSeconds 和 spec.failurePolicy。
从 1.13 开始,超时和失败策略移到了同一个块下。旧位置的字段不能保留;还请思考为了不让观察阶段的策略阻塞集群,应选择哪种失败策略。
设置 background、admission、applyRules
在同一文件中,将 spec.background 设为 true、spec.admission 设为 true、spec.applyRules 设为 All,并创建至少两条规则。
这三个标志分别决定是否扫描现有资源、是否应用于准入,以及应用多少条规则。最后一个字段会导致列出多条规则后,后面的规则却不执行。
用 PolicyException 建立合理例外
在 /root/kca-ops/policyexception.yaml 中填写 apiVersion kyverno.io/v2beta1、kind PolicyException、metadata.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=restricted 和 pod-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 必须为 true,securityContext.seccompProfile.type 必须为 RuntimeDefault;容器级 securityContext.allowPrivilegeEscalation 必须为 false,capabilities.drop 中必须包含 ALL。另外,创建命名空间 kca-monitoring 并添加标签 pod-security.kubernetes.io/enforce=privileged。
restricted 等级要求四项:非 root 运行、禁止权限提升、移除全部 capability,以及设置 seccomp 配置。还要一并创建作为例外目标的命名空间。