使用映像新鲜度检查

本页面介绍了如何使用 Binary Authorization 持续验证 (CV) 映像新鲜度检查来检查与启用了 CV 的 Google Kubernetes Engine (GKE) 集群上运行的 Pod 相关联的映像的新鲜度。为此,CV 会检查映像何时上传到映像注册表。

此检查仅支持 Artifact Registry 和 Container Registry 代码库。

费用

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

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

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

须知事项

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 安装 Google Cloud CLI。
  3. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  4. 创建或选择 Google Cloud 项目。

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID
    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID
  5. 确保您的 Google Cloud 项目已启用结算功能

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

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com
  7. 安装 Google Cloud CLI。
  8. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  9. 创建或选择 Google Cloud 项目。

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID
    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID
  10. 确保您的 Google Cloud 项目已启用结算功能

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

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

所需的角色

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

概览

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

为了确保政策项目的 Binary Authorization Service Agent 具有评估 CV 映像新鲜度检查所需的必要权限,请让您的管理员向该政策项目的 Binary Authorization Service Agent 授予以下 IAM 角色:

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

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

您的管理员还可以通过自定义角色或其他预定义角色向政策项目的 Binary Authorization Service Agent 授予所需的权限。

使用 gcloud CLI 授予角色

为确保每个项目中的 Binary Authorization Service Agent 都有评估此检查所需的权限,请为每个项目中的 Binary Authorization Service Agent 授予以下 IAM 角色:

  1. 如需向集群项目的 Binary Authorization Service Agent 授权访问政策项目中的政策,请执行以下操作:

    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。

  2. 如需使政策项目的 Google Cloud 项目服务代理能够访问工件项目中的映像元数据,请执行以下操作:

    1. 获取与政策项目关联的 Binary Authorization 服务代理:

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

      POLICY_PROJECT_ID 替换为政策项目 ID。

    2. 授予权限:

      gcloud projects add-iam-policy-binding ARTIFACT_PROJECT_ID \
        --member="serviceAccount:$POLICY_PROJECT_SERVICE_ACCOUNT" \
        --role='roles/artifactregistry.reader'
      

      POLCY_PROJECT_ID 替换为包含平台政策的集群项目的 ID。

创建平台政策

如需使用映像新鲜度检查创建 CV 平台政策,请执行以下操作:

  1. 创建一个包含平台政策的文件:

    cat << EOF > /tmp/my-policy.yaml
    gkePolicy:
      checkSets:
      - checks:
        - imageFreshnessCheck:
            maxUploadAgeDays: MAX_UPLOAD_AGE_DAYS
          displayName: CHECK_DISPLAY_NAME
        displayName: CHECK_SET_DISPLAY_NAME
    EOF
    

    请替换以下内容:

    • MAX_UPLOAD_AGE_DAYS:自映像上传到注册表以来经过的最长时间(以天为单位)。
    • CHECK_SET_DISPLAY_NAME:您为检查集选择的可选显示名称
    • CHECK_DISPLAY_NAME:您为检查选择的可选显示名称
  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 条目的日志

CV 会在 24 小时内将平台违反政策的行为记录到 Cloud Logging。您通常会在几个小时内看到这些条目。

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

如需查看过去 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
  • 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

后续步骤