使用 Policy Essentials v2022 政策限制条件

政策控制器附带默认的限制条件模板库,您可以将该库与 Policy Essentials v2022 包搭配使用,将 Google 推荐的最佳实践应用于您的集群资源。

本页面包含有关手动应用政策包的说明。或者,您也可以直接应用政策包

本页面适用于想要提供并维护自动化以进行审核或强制执行,从而确保云平台中运行的所有资源满足组织合规性要求的 IT 管理员和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

此限制条件软件包在以下网域中处理并强制执行政策:

  • RBAC 和服务账号
  • Pod 安全政策
  • 容器网络接口 (CNI)
  • 密文管理
  • 常规政策

Policy Essentials 政策包限制条件

限制条件名称 限制条件说明
policy-essentials-v2022-no-secrets-as-env-vars 优先将 Secret 用作文件而不是用作环境变量
policy-essentials-v2022-pods-require-security-context 将安全上下文应用到您的 Pod 和容器
policy-essentials-v2022-prohibit-role-wildcard-access 尽可能减少在 Roles 和 ClusterRoles 中使用通配符。
policy-essentials-v2022-psp-allow-privilege-escalation-container 尽可能减少具有 allowPrivilegeEscalation 的容器的准许
policy-essentials-v2022-psp-capabilities 容器必须删除“NET_RAW”功能,且不得重新添加任何功能。
policy-essentials-v2022-psp-host-namespace 通过将 `hostPID` 或 `hostIPC` 设置为 `true`,尽可能减少容器的准许。
policy-essentials-v2022-psp-host-network-ports 尽可能减少希望共享主机网络命名空间的容器的准许
policy-essentials-v2022-psp-privileged-container 尽可能减少特权容器的准许
policy-essentials-v2022-psp-pods-must-run-as-nonroot 尽可能减少根容器的准许
policy-essentials-v2022-psp-seccomp-default 确保在 Pod 定义中将 seccomp 配置文件设置为 `runtime/default` 或 `docker/default`
policy-essentials-v2022-restrict-clusteradmin-rolebindings 尽量减少使用“cluster-admin”角色。

准备工作

  1. 安装并初始化 Google Cloud CLI,它提供了以下说明中使用的 gcloudkubectl 命令。如果您使用 Cloud Shell,则系统会预安装 Google Cloud CLI。
  2. 在集群上安装 Policy Controller v1.14.3 或更高版本以及默认的限制条件模板库。

审核 Policy Essentials 政策包

政策控制器允许您为 Kubernetes 集群强制执行政策。为了帮助测试您的工作负载及其对上表中列出的 Google 推荐最佳实践的合规性,您可以在“审核”模式下部署这些限制条件以发现违规行为,更重要的是让您有机会在 Kubernetes 集群上强制执行之前处理这些违规行为。

您可以在 spec.enforcementAction 设置为 dryrun 的情况下,使用 kubectl、kptConfig Sync 应用这些政策。

kubectl

  1. (可选)使用 kubectl 预览政策限制条件:

     kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 
  2. 使用 kubectl 应用政策限制条件:

     kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 

    输出如下所示:

     k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars created k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation created k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot created k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities created k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace created k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports created k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container created k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default created k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context created k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access created k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings created 
  3. 验证政策限制条件是否已安装,并检查集群中是否存在违规行为:

     kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 

    输出类似于以下内容:

     NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars   dryrun               0  NAME                                                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation   dryrun               0  NAME                                                                                                ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot   dryrun               0  NAME                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities   dryrun               0  NAME                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace   dryrun               0  NAME                                                                                                 ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports   dryrun               0  NAME                                                                                                   ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container   dryrun               0  NAME                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default   dryrun               0  NAME                                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context   dryrun               0  NAME                                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access   dryrun               0  NAME                                                                                                           ENFORCEMENT-ACTION   TOTAL-VIOLATIONS k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings   dryrun               0 

kpt

  1. 安装并设置 kpt。在这些说明中,kpt 用于自定义和部署 Kubernetes 资源。

  2. 使用 kpt 从 GitHub 下载 Policy Essentials v2022 政策包:

     kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 
  3. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 dryrun

     kpt fn eval policy-essentials-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \   -- enforcementAction=dryrun 
  4. 使用 kpt 初始化工作目录,此操作会创建一个资源来跟踪更改:

     cd policy-essentials-v2022 kpt live init 
  5. 使用 kpt 应用政策限制条件:

     kpt live apply 

    输出如下所示:

     k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-docker-default created k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context created k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access created k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars created k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation-container created k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot created k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports created k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings created k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities created k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace created k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container created 11 resource(s) applied. 11 created, 0 unchanged, 0 configured, 0 failed 
  6. 验证政策限制条件是否已安装,并检查集群中是否存在违规行为:

     kpt live status --output table --poll-until current 

    状态为 CURRENT,即确认限制条件成功安装。

Config Sync

  1. 安装并设置 kpt。在这些说明中,kpt 用于自定义和部署 Kubernetes 资源。

使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:

  1. 更改为 Config Sync 的同步目录:

     cd SYNC_ROOT_DIR 

    创建 resourcegroup.yaml 或将其附加到 .gitignore

     echo resourcegroup.yaml >> .gitignore 

  2. 创建一个专用的 policies 目录:

     mkdir -p policies 
  3. 使用 kpt 从 GitHub 下载 Policy Essentials v2022 政策包:

     kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/policy-essentials-v2022 policies/policy-essentials-v2022 
  4. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 dryrun

     kpt fn eval policies/policy-essentials-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun 
  5. (可选)预览待创建的政策限制条件:

     kpt live init policies/policy-essentials-v2022 kpt live apply --dry-run policies/policy-essentials-v2022 

    输出如下所示:

     Dry-run strategy: client inventory update started inventory update finished apply phase started k8snoenvvarsecrets.constraints.gatekeeper.sh/policy-essentials-v2022-no-secrets-as-env-vars apply successful k8spspallowprivilegeescalationcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-allow-privilege-escalation apply successful k8spspallowedusers.constraints.gatekeeper.sh/policy-essentials-v2022-psp-pods-must-run-as-nonroot apply successful k8spspcapabilities.constraints.gatekeeper.sh/policy-essentials-v2022-psp-capabilities apply successful k8spsphostnamespace.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-namespace apply successful k8spsphostnetworkingports.constraints.gatekeeper.sh/policy-essentials-v2022-psp-host-network-ports apply successful k8spspprivilegedcontainer.constraints.gatekeeper.sh/policy-essentials-v2022-psp-privileged-container apply successful k8spspseccomp.constraints.gatekeeper.sh/policy-essentials-v2022-psp-seccomp-default apply successful k8spodsrequiresecuritycontext.constraints.gatekeeper.sh/policy-essentials-v2022-pods-require-security-context apply successful k8sprohibitrolewildcardaccess.constraints.gatekeeper.sh/policy-essentials-v2022-prohibit-role-wildcard-access apply successful k8srestrictrolebindings.constraints.gatekeeper.sh/policy-essentials-v2022-restrict-clusteradmin-rolebindings apply successful apply phase finished inventory update started inventory update finished apply result: 11 attempted, 11 successful, 0 skipped, 0 failed 
  6. 如果 Config Sync 的同步目录使用 Kustomize,请将 policies/policy-essentials-v2022 添加到根 kustomization.yaml。 否则,请移除 policies/policy-essentials-v2022/kustomization.yaml 文件:

     rm SYNC_ROOT_DIR/policies/policy-essentials-v2022/kustomization.yaml 
  7. 将更改推送到 Config Sync 代码库:

     git add SYNC_ROOT_DIR/policy-essentials-v2022 git commit -m 'Adding Policy Essentials v2022 policy audit enforcement' git push 
  8. 验证安装状态:

     watch gcloud beta container fleet config-management status --project PROJECT_ID 

    状态 SYNCED 用于确认政策的安装情况。

查看违规问题

在审核模式下安装政策限制条件后,您可以使用 Policy Controller 信息中心在界面中查看集群的违规问题。

您还可以使用 kubectl 来通过以下命令查看针对集群的违规行为:

 kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]' 

如果存在违规行为,您可以使用以下命令查看每个限制条件的违规消息列表:

 kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]' 

更改 Policy Essentials 政策包强制执行操作

查看集群上的政策违规情况后,您可以考虑更改强制执行模式,以便准入控制器发出 warn,甚至 deny 屏蔽不合规资源应用于集群。

kubectl

  1. 使用 kubectl 将政策的强制执行操作设置为 warn

     kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]' 
  2. 验证政策限制条件强制执行措施是否已更新:

     kubectl get constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 

kpt

  1. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 warn

     kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
  2. 应用政策限制条件:

     kpt live apply 

Config Sync

使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:

  1. 更改为 Config Sync 的同步目录:

     cd SYNC_ROOT_DIR 
  2. 运行 set-enforcement-action kpt 函数将政策的强制执行操作设置为 warn

     kpt fn eval policies/policy-essentials-v2022 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn 
  3. 将更改推送到 Config Sync 代码库:

     git add SYNC_ROOT_DIR/policies/policy-essentials-v2022 git commit -m 'Adding Policy Essentials policy bundle warn enforcement' git push 
  4. 验证安装状态:

     nomos status 

    集群应显示状态为 SYNCED,并显示已安装的政策。

测试政策执行情况

使用以下命令在集群上创建不合规的资源:

cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata:   namespace: default   name: wp-non-compliant   labels:     app: wordpress spec:   containers:     - image: wordpress       name: wordpress       ports:       - containerPort: 80         name: wordpress EOF 

准入控制器应生成一个警告列表,其中列出了此资源违反政策的行为,如以下示例所示:

 Warning: [policy-essentials-v2022-psp-capabilities] container <wordpress> is not dropping all required capabilities. Container must drop all of ["NET_RAW"] or "ALL" pod/wp-non-compliant created 

移除 Policy Essentials 政策包

如果需要,您可以从集群中移除 Policy Essentials 政策包。

kubectl

  • 使用 kubectl 移除政策:

     kubectl delete constraint -l policycontroller.gke.io/bundleName=policy-essentials-v2022 

kpt

  • 移除政策:

     kpt live destroy 

Config Sync

使用 Config Sync 将政策部署到其集群的运维人员可以按照以下说明操作:

  1. 将更改推送到 Config Sync 代码库:

     git rm -r SYNC_ROOT_DIR/policies/policy-essentials-v2022 git commit -m 'Removing Policy Essentials v2022 policies' git push 
  2. 验证状态:

     nomos status 

    集群应显示状态为 SYNCED,且资源已移除。