使用政策评估服务

本页面介绍了如何使用政策评估服务 Google Cloud CLI 命令快速评估映像或 Kubernetes 资源是否符合持续验证基于检查的平台政策。

概览

政策评估服务是 Binary Authorization 的一项功能,可与持续验证 (CV) 基于检查的平台政策搭配使用。政策评估服务会按需评估您指定的容器映像是否符合 CV 平台政策。政策评估服务作为 gcloud CLI 命令和 projects.platforms.gke.policies.evaluate 方法提供。

CV 至少每 24 小时检查一次是否存在违反政策的情况。因此,在启用 CV 或部署 Kubernetes 资源后,CV 事件最长可能需要 24 小时才能显示在 Logging 中。此外,CV 在检测到违反政策的情况时会生成日志条目。当 Kubernetes 资源符合政策时,CV 不会生成日志条目。

政策评估服务会输出判定结果,指示映像是否符合政策或映像是否违反政策。

通过使用政策评估服务,您可以快速确定您的映像是否符合政策。

使用该服务时,您可以直接或在 Kubernetes 资源中指定映像网址,并指定 GKE CV 基于检查的政策的名称。

这样,政策评估服务可以帮助您在使用 CV 之前制定政策并调试不符合政策的 Kubernetes 资源。

此功能仅支持基于 GKE CV 检查的政策。

映像还必须指定 IMAGE_URL@IMAGE_DIGEST 格式的映像摘要,但以下情况除外:

  • 可信目录检查:如果映像位于您指定的目录中,则检查通过。
  • 豁免映像许可名单:所有其他检查都需要 IMAGE_URL@IMAGE_DIGEST 格式的映像摘要。

准备工作

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init

所需的角色

如需获得使用政策评估服务所需的权限,请让您的管理员为您授予政策项目的 Policy Evaluator (roles/binaryauthorization.policyEvaluator) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

如果您的政策使用特定检查,您可能需要让您的管理员授予以下特定于检查的所需角色:

评估基于检查的平台政策

政策评估服务可以评估单个映像网址或在 JSON 格式或 YAML 格式的 Kubernetes 资源中指定的映像。

使用 Kubernetes 资源评估基于检查的平台政策

如需使用 gcloud CLI 通过 Kubernetes 资源评估政策,请运行以下命令:

在使用下面的命令数据之前,请先进行以下替换:

  • POLICY_ID:平台政策的 ID。如果政策位于其他项目中,您可以使用完整的资源名称:projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID
  • POD_SPECIFICATION_PATH:Pod 规范的路径。

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud beta container binauthz policy evaluate POLICY_ID \
    --resource=POD_SPECIFICATION_PATH

Windows (PowerShell)

gcloud beta container binauthz policy evaluate POLICY_ID `
    --resource=POD_SPECIFICATION_PATH

Windows (cmd.exe)

gcloud beta container binauthz policy evaluate POLICY_ID ^
    --resource=POD_SPECIFICATION_PATH

如需评估指定平台(必须设置为 gke)的政策,请运行以下命令:

在使用下面的命令数据之前,请先进行以下替换:

  • POLICY_ID:平台政策的 ID。如果政策位于其他项目中,您可以使用完整的资源名称:projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID
  • POD_SPECIFICATION_PATH:Pod 规范的路径。

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud beta container binauthz policy evaluate POLICY_ID \
    --platform=gke \
    --resource=POD_SPECIFICATION_PATH

Windows (PowerShell)

gcloud beta container binauthz policy evaluate POLICY_ID `
    --platform=gke `
    --resource=POD_SPECIFICATION_PATH

Windows (cmd.exe)

gcloud beta container binauthz policy evaluate POLICY_ID ^
    --platform=gke ^
    --resource=POD_SPECIFICATION_PATH

使用映像网址评估基于检查的平台政策

如需使用映像网址评估政策,请运行以下命令:

在使用下面的命令数据之前,请先进行以下替换:

  • POLICY_ID:平台政策的 ID。如果政策位于其他项目中,您可以使用完整的资源名称:projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID
  • IMAGE_URL:Pod 规范的路径。

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud beta container binauthz policy evaluate POLICY_ID \
    --image=IMAGE_URL

Windows (PowerShell)

gcloud beta container binauthz policy evaluate POLICY_ID `
    --image=IMAGE_URL

Windows (cmd.exe)

gcloud beta container binauthz policy evaluate POLICY_ID ^
    --image=IMAGE_URL

使用 --image 标志时,系统会默认命名空间和服务账号为空。如果您要评估的政策使用范围限定为 kubernetesNamespacekubernetesServiceAccount 的检查集,则返回的结果可能不准确。

查看命令输出

命令输出包含指示 Pod 的符合性状态的顶级判定结果。系统可能会返回以下符合性状态:

  • CONFORMANT:Kubernetes 资源符合平台政策。
  • NON_CONFORMANT:Kubernetes 资源不符合平台政策。
  • ERROR:评估因错误而结束。

响应还包含嵌套结果,其中包含有关针对 Kubernetes 资源中包含的每个映像评估的所有检查的符合性状态的详细信息。

每个 ImageResults 块都包含一个人类可读的 explanation 字段,用于描述允许或禁止映像的原因。

为方便写脚本,当 Pod 规范不符合政策或评估失败时,该命令会返回非零退出代码。

以下输出示例演示了两种情况。在第一种情况下,Kubernetes 资源符合政策。在第二种情况下,资源不符合政策。

查看符合政策的结果

本部分介绍了 Pod 符合平台政策的政策评估服务检查的输出。

results:
- imageResults:
  - checkSetResult:
      checkResults:
        results:
        - displayName: My trusted directory check
          evaluationResult:
            verdict: CONFORMANT
          explanation: Image is in a trusted directory
          type: TrustedDirectoryCheck
      displayName: Default check set
      scope: {}
    imageUri: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    verdict: CONFORMANT
  kubernetesNamespace: default
  kubernetesServiceAccount: default
  podName: my-pod
  verdict: CONFORMANT
verdict: CONFORMANT

在输出中,系统会针对以下类型的评估返回判定结果 CONFORMANT

  • 检查:映像符合个别检查(在本例中为可信目录检查)。
  • 检查集:映像符合检查集中的每项检查。
  • 政策:映像符合政策。

由于映像符合政策,因此该命令会返回零退出代码。

查看不符合政策的结果

本部分介绍了 Pod 不符合平台政策的政策评估服务检查的输出。

results:
- imageResults:
  - checkSetResult:
      checkResults:
        results:
        - displayName: My trusted directory check
          evaluationResult:
            verdict: NON_CONFORMANT
          explanation: Image isn't in a trusted directory
          type: TrustedDirectoryCheck
      displayName: Default check set
      scope: {}
    imageUri: us-docker.pkg.dev/untrusted-directory/containers/gke/hello-app:1.0
    verdict: NON_CONFORMANT
  kubernetesNamespace: default
  kubernetesServiceAccount: default
  podName: my-pod
  verdict: NON_CONFORMANT
verdict: NON_CONFORMANT

在输出中,由于映像不符合个别检查(在本例中为可信目录检查,因而是所有检查集),因此顶级判定结果为 NON_CONFORMANT,该命令会返回非零退出代码。

测试政策评估服务

本部分介绍了如何测试政策评估服务。请创建一个基于检查的平台政策,其中包含可信目录检查。在第一个测试中,您可以评估符合政策的 Pod 规范。在第二个测试中,您可以评估不符合政策的 Pod 规范。

如需创建包含可信目录检查的政策,请运行以下命令:

  1. 创建平台政策文件:

    cat << EOF > my-policy.yaml
    gkePolicy:
      checkSets:
      - checks:
        - displayName: "My trusted directory check"
          trustedDirectoryCheck:
            trustedDirPatterns:
            - "us-docker.pkg.dev/google-samples/containers/gke/"
        displayName: "My default check set"
    EOF
    
  2. 创建政策:

    在使用下面的命令数据之前,请先进行以下替换:

    • POLICY_ID:您选择的平台政策 ID。如果政策位于其他项目中,您可以使用完整的资源名称:projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID
    • POLICY_PATH:政策文件的路径。
    • POLICY_PROJECT_ID:政策项目 ID。

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud beta container binauthz policy create POLICY_ID \
        --platform=gke \
        --policy-file=POLICY_PATH \
        --project=POLICY_PROJECT_ID

    Windows (PowerShell)

    gcloud beta container binauthz policy create POLICY_ID `
        --platform=gke `
        --policy-file=POLICY_PATH `
        --project=POLICY_PROJECT_ID

    Windows (cmd.exe)

    gcloud beta container binauthz policy create POLICY_ID ^
        --platform=gke ^
        --policy-file=POLICY_PATH ^
        --project=POLICY_PROJECT_ID

    gcloud beta container binauthz policy create POLICY_ID \
    --platform=gke \
    --policy-file=my-policy.yaml
    

评估符合政策的映像

在本部分中,您将评符合您在本指南前面部分中创建的政策的 Pod 规范。评估会生成指示 Pod 规范为 CONFORMANT 的判定结果,因为 Pod 规范引用了位于可信目录检查的 trustedDirPatterns 中指定的目录内的映像。

  1. 创建 Pod 规范:

    cat << EOF > my-conforming-pod.json
    {
      "apiVersion": "v1",
      "kind": "Pod",
      "metadata": {
        "name": ""
      },
      "spec": {
        "containers": [
          {
            "image": "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
          }
          ]
      }
    }
    EOF
    
  2. 运行以下命令以使用政策评估服务:

    在使用下面的命令数据之前,请先进行以下替换:

    • POLICY_ID:平台政策的 ID。如果政策位于其他项目中,您可以使用完整的资源名称:projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID
    • my-conforming-pod.json:Pod 规范的路径。

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud beta container binauthz policy evaluate POLICY_ID \
        --image=my-conforming-pod.json

    Windows (PowerShell)

    gcloud beta container binauthz policy evaluate POLICY_ID `
        --image=my-conforming-pod.json

    Windows (cmd.exe)

    gcloud beta container binauthz policy evaluate POLICY_ID ^
        --image=my-conforming-pod.json

评估不符合政策的映像

在本部分中,您将评估不符合您在本指南前面部分中创建的政策的 Pod 规范。此评估会生成指示 Pod 规范为 NON_CONFORMANT 的判定结果,因为 Pod 规范引用了位于可信目录检查的 trustedDirPatterns 中指定的目录之外的映像。

如需评估不符合政策的映像,请运行以下命令:

  1. 创建 Pod 规范:

    cat << EOF > my-non-conforming-pod.json
    {
      "apiVersion": "v1",
      "kind": "Pod",
      "metadata": {
        "name": ""
      },
      "spec": {
        "containers": [
          {
            "image": "us-docker.pkg.dev/untrusted-directory/containers/gke/hello-app:1.0"
          }
        ]
      }
    }
    EOF
    
  2. 运行以下命令以使用政策评估服务:

    在使用下面的命令数据之前,请先进行以下替换:

    • POLICY_ID:平台政策的 ID。如果政策位于其他项目中,您可以使用完整的资源名称:projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID
    • my-non-conforming-pod.json:Pod 规范的路径。

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud beta container binauthz policy evaluate POLICY_ID \
        --image=my-non-conforming-pod.json

    Windows (PowerShell)

    gcloud beta container binauthz policy evaluate POLICY_ID `
        --image=my-non-conforming-pod.json

    Windows (cmd.exe)

    gcloud beta container binauthz policy evaluate POLICY_ID ^
        --image=my-non-conforming-pod.json

后续步骤