使用可信目录检查

本页面介绍了如何使用 Binary Authorization 持续验证 (CV) 可信目录检查来检查与启用了 CV 的 Google Kubernetes Engine (GKE) 集群上运行的 Pod 相关联的映像是否是从可信目录部署的。

费用

本指南使用以下 Google Cloud 服务:

  • Binary Authorization,但 CV 在预览阶段可免费使用
  • GKE

如需根据您的预计使用量来估算费用,请使用价格计算器

须知事项

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. Enable the Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com container.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. 确保您的 Google Cloud 项目已启用结算功能

  11. Enable the Artifact Registry, Binary Authorization, Google Kubernetes Engine APIs:

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com container.googleapis.com
  12. 确保 gcloud CLI 已更新到最新版本。
  13. 安装 kubectl 命令行工具
  14. 如果您的 Binary Authorization 政策和 GKE 集群位于不同的项目中,请确保两个项目中都启用了 Binary Authorization。

所需的角色

本部分介绍如何为此检查设置角色。

概览

如果您在同一项目中运行本指南中提到的所有产品,则无需设置任何权限。启用 Binary Authorization 后,它会正确配置这些角色。如果您在不同项目中运行产品,则必须按照本部分中的说明设置角色。

如需确保集群项目的 Binary Authorization 服务代理具有评估 CV 可信目录检查所需的权限,请让您的管理员向集群项目的 Binary Authorization 服务代理就该项目授予以下 IAM 角色:

  • 如果您的集群项目与政策项目不同:针对集群项目 Binary Authorization Service Agent 授予 Binary Authorization Policy Evaluator (roles/binaryauthorization.policyEvaluator) 角色,以便其访问政策项目

如需详细了解如何授予角色,请参阅管理访问权限

您的管理员还可以通过自定义角色或其他预定义角色向集群项目的 Binary Authorization 服务代理授予所需的权限。

使用 gcloud CLI 授予角色

如果运行集群的项目与政策所在的项目不同,请执行以下操作,向集群项目的 Binary Authorization 服务代理授权访问政策项目中的政策。

  1. 获取集群项目的 Binary Authorization 服务代理:

    PROJECT_NUMBER=$(gcloud projects list --filter="projectId:CLUSTER_PROJECT_ID" \
      --format="value(PROJECT_NUMBER)")
    CLUSTER_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
    

    CLUSTER_PROJECT_ID 替换为集群的项目 ID。

  2. 允许 CV 评估集群上的政策:

    gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \
        --member="serviceAccount:$CLUSTER_SERVICE_ACCOUNT" \
        --role='roles/binaryauthorization.policyEvaluator'
    

    POLICY_PROJECT_ID 替换为包含政策的项目的 ID。

创建平台政策

如需创建包含可信目录检查的 CV 平台政策,请执行以下操作:

  1. 创建可信目录政策 YAML 文件:

    cat > /tmp/my-policy.yaml <<EOF
    gkePolicy:
      checkSets:
        checks:
          trustedDirectoryCheck:
            trustedDirPatterns:
            - PATTERN1
            - PATTERN2
          displayName: CHECK_DISPLAY_NAME
        displayName: CHECK_SET_DISPLAY_NAME
    EOF
    

    替换以下内容:

    • PATTERN1:采用目录格式的列表项
    • PATTERN2:采用目录格式的列表项
    • CHECK_DISPLAY_NAME:可信目录检查的可选显示名称
    • CHECK_SET_DISPLAY_NAME:可信目录检查的可选显示名称

    以下是一些格式示例:

    • asia-east1-docker.pkg.dev/my-project/my-repo:仅信任此代码库
    • europe-central1-docker.pkg.dev/my-project/my-repo/test*:仅信任此代码库及此代码库下一级以 test 开头的代码库
    • us-central1-docker.pkg.dev/my-project/my-repo/**:仅信任此代码库及其下的所有代码库
  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
    

启用 CV

您可以创建新集群或更新现有集群,以将 CV 监控与基于检查的平台政策结合使用。

创建使用 CV 监控的集群

在本部分中,您将创建一个集群,该集群仅将 CV 监控与基于检查的平台政策结合使用。

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

  • CLUSTER_NAME:集群名称。
  • LOCATION:位置,例如 us-central1asia-south1
  • POLICY_PROJECT_ID:存储政策的项目的 ID。
  • POLICY_ID:政策 ID。
  • CLUSTER_PROJECT_ID:集群项目 ID。

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters create CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters create CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

创建使用强制执行和 CV 监控的集群

在本部分中,您将创建一个集群,它将 project-singleton 政策强制执行和 CV 监控与基于检查的平台政策结合使用:

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

  • CLUSTER_NAME:集群名称。
  • LOCATION:位置,例如 us-central1asia-south1
  • POLICY_PROJECT_ID:存储政策的项目的 ID。
  • POLICY_ID:政策 ID。
  • CLUSTER_PROJECT_ID:集群项目 ID。

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud beta container clusters create CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters create CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters create CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

更新集群以使用 CV 监控

在本部分中,您将更新集群以将 CV 监控仅与基于检查的平台政策结合使用。如果集群已启用项目单例政策强制执行,运行此命令会停用该功能。请考虑改为更新启用了强制执行和 CV 监控的集群。

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

  • CLUSTER_NAME:集群名称
  • LOCATION:位置,例如:us-central1asia-south1
  • POLICY_PROJECT_ID:存储政策的项目的 ID
  • POLICY_ID:政策 ID
  • CLUSTER_PROJECT_ID:集群项目 ID

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters update CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters update CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

更新集群以使用强制执行和 CV 监控

在本部分中,您将更新集群以将项目单例政策强制执行和 CV 监控与基于检查的平台政策结合使用。

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

  • CLUSTER_NAME:集群名称
  • LOCATION:位置,例如:us-central1asia-south1
  • POLICY_PROJECT_ID:存储政策的项目的 ID
  • POLICY_ID:政策 ID
  • CLUSTER_PROJECT_ID:集群项目 ID

执行以下命令:

Linux、macOS 或 Cloud Shell

gcloud beta container clusters update CLUSTER_NAME \
    --location=LOCATION \
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
    --project=CLUSTER_PROJECT_ID

Windows (PowerShell)

gcloud beta container clusters update CLUSTER_NAME `
    --location=LOCATION `
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE `
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID `
    --project=CLUSTER_PROJECT_ID

Windows (cmd.exe)

gcloud beta container clusters update CLUSTER_NAME ^
    --location=LOCATION ^
    --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^
    --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^
    --project=CLUSTER_PROJECT_ID

查看 CV 条目的日志

您可以搜索 Cloud Logging 条目,以查找 CV 配置错误CV 平台政策验证违规

CV 会在 24 小时内将错误和违规行为记录到 Cloud Logging。您通常会在几个小时内看到这些条目。

查看 CV 配置错误日志

如需查看 CV 配置错误日志,请运行以下命令:

gcloud logging read \
     --order="desc" \
     --freshness=7d \
     --project=CLUSTER_PROJECT_ID \
    'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "configErrorEvent"'

以下输出显示了配置错误,其中找不到 CV 平台政策:

{
  "insertId": "141d4f10-72ea-4a43-b3ec-a03da623de42",
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent",
    "configErrorEvent": {
      "description": "Cannot monitor cluster 'us-central1-c.my-cluster': Resource projects/123456789/platforms/gke/policies/my-policy does not exist."
    }
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "cluster_name": "my-cluster",
      "location": "us-central1-c",
      "project_id": "my-project"
    }
  },
  "timestamp": "2024-05-28T15:31:03.999566Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2024-05-28T16:30:56.304108670Z"
}

查看 CV 平台政策验证违规情况

如果没有映像违反了您启用的平台政策,则日志中不会显示任何条目。

如需查看过去 7 天的 CV 日志条目,请运行以下命令:

gcloud logging read \
     --order="desc" \
     --freshness=7d \
     --project=CLUSTER_PROJECT_ID \
    'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "policyName"'

CLUSTER_PROJECT_ID 替换为集群项目 ID。

检查类型

CV 日志会将违规信息记录到 checkResults。在该条目中,值 checkType 表示检查。每项检查的值如下所示:

  • ImageFreshnessCheck
  • SigstoreSignatureCheck
  • SimpleSigningAttestationCheck
  • SlsaCheck
  • TrustedDirectoryCheck
  • VulnerabilityCheck

日志示例

以下 CV Logging 条目示例描述了违反可信目录检查的不符合规则的映像:

{
  "insertId": "637c2de7-0000-2b64-b671-24058876bb74",
  "jsonPayload": {
    "podEvent": {
      "endTime": "2022-11-22T01:14:30.430151Z",
      "policyName": "projects/123456789/platforms/gke/policies/my-policy",
      "images": [
        {
          "result": "DENY",
          "checkResults": [
            {
              "explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
              "checkSetName": "My check set",
              "checkSetIndex": "0",
              "checkName": "My trusted directory check",
              "verdict": "NON_CONFORMANT",
              "checkType": "TrustedDirectoryCheck",
              "checkIndex": "0"
            }
          ],
          "image": "gcr.io/my-project/hello-app:latest"
        }
      ],
      "verdict": "VIOLATES_POLICY",
      "podNamespace": "default",
      "deployTime": "2022-11-22T01:06:53Z",
      "pod": "hello-app"
    },
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "project_id": "my-project",
      "location": "us-central1-a",
      "cluster_name": "my-test-cluster"
    }
  },
  "timestamp": "2022-11-22T01:44:28.729881832Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}

清理

本部分介绍了如何清理本指南前面部分配置的 CV 监控。

您可以在集群中停用 CV 监控或 Binary Authorization 和 CV。

在集群中停用 Binary Authorization

如需在集群中同时停用 CV 和 Binary Authorization 强制执行,请运行以下命令:

gcloud beta container clusters update CLUSTER_NAME \
    --binauthz-evaluation-mode=DISABLED \
    --location=LOCATION \
    --project=CLUSTER_PROJECT_ID

请替换以下内容:

  • CLUSTER_NAME:集群的名称
  • LOCATION:集群位置
  • CLUSTER_PROJECT_ID:集群项目 ID

在集群中停用基于检查的政策监控

如需在集群中停用使用基于检查的政策的 CV,并使用 Binary Authorization 强制执行政策重新启用强制执行,请运行以下命令:

gcloud beta container clusters update CLUSTER_NAME  \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --location=LOCATION \
    --project="CLUSTER_PROJECT_ID"

请替换以下内容:

  • CLUSTER_NAME:集群的名称
  • LOCATION:集群位置
  • CLUSTER_PROJECT_ID:集群项目 ID

请注意,--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE 等效于旧标志 --enable-binauthz

删除政策

如需删除政策,请运行以下命令。无需删除基于检查的平台政策即可停用基于检查的政策审核。

gcloud beta container binauthz policy delete POLICY_ID \
    --platform=gke \
    --project="POLICY_PROJECT_ID"

请替换以下内容:

  • POLICY_ID:政策的 ID
  • POLICY_PROJECT_ID:政策项目 ID

后续步骤