使用 SLSA 检查

本页面介绍了如何使用 Binary Authorization 持续验证 (CV) SLSA 检查,该检查可以检查与启用了 CV 的 GKE 集群上运行的 Pod 相关联的容器映像的来源是否符合 SLSA。

如需使用此检查,您必须使用 Cloud Build 构建映像,从而生成符合 SLSA 的来源

本指南中的示例对源代码库使用 Cloud Source Repositories,对映像注册表使用 Artifact Registry,并使用 Cloud Build 构建映像和生成来源。

SLSA 检查支持的唯一可信构建器是 Cloud Build。

费用

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

  • Artifact Registry
  • Binary Authorization,但 CV 在预览阶段可免费使用
  • Cloud Build
  • Cloud Source Repositories
  • GKE

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

须知事项

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  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. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Binary Authorization, Cloud Build, GKE, Cloud Source Repositories APIs:

    gcloud services enable artifactregistry.googleapis.com binaryauthorization.googleapis.com cloudbuild.googleapis.com container.googleapis.com sourcerepo.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. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Artifact Registry, Binary Authorization, Cloud Build, GKE, Cloud Source Repositories APIs:

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

所需的角色

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

概览

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

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

  • 对集群项目 Compute Engine 服务账号授予 Artifact Registry Reader (roles/artifactregistry.reader) 角色
  • 如果您的集群项目与政策项目不同:针对集群项目 Binary Authorization Service Agent 授予 Binary Authorization Policy Evaluator (roles/binaryauthorization.policyEvaluator) 角色,以便其访问政策项目
  • 如果您的证明项目与政策项目不同:针对政策项目 Binary Authorization Service Agent 授予 Container Analysis Occurrences Viewer (roles/containeranalysis.occurrences.viewer) 角色,以便其访问证明项目

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

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

使用 gcloud CLI 授予角色

为了确保每个项目中的服务账号都具有评估此检查所需的权限,请为每个项目中的服务账号授予以下 IAM 角色:

  1. 如果运行集群的项目与政策所在的项目不同,您必须向集群项目的 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。

  2. 允许政策项目服务代理访问证明:

    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 ATTESTATION_PROJECT_ID \
          --member="serviceAccount:$POLICY_PROJECT_SERVICE_ACCOUNT" \
          --role='roles/containeranalysis.occurrences.viewer'
      

      ATTESTATION_PROJECT_ID 替换为包含证明的项目的 ID。

  3. 允许从代码库中拉取映像的默认 Compute Engine 服务账号权限:

    1. 获取与集群项目关联的 Compute Engine 服务账号:

      PROJECT_NUMBER=$(gcloud projects list \
        --filter="projectId:CLUSTER_PROJECT_ID" \
        --format="value(PROJECT_NUMBER)")
      COMPUTE_ENGINE_SERVICE_ACCOUNT="$PROJECT_NUMBER-compute@developer.gserviceaccount.com"
      

      CLUSTER_PROJECT_ID 替换为包含政策的集群项目的 ID。

    2. 授予角色:

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

      ARTIFACT_PROJECT_ID 替换为存储要部署的映像的 Artifact Registry 项目的 ID。

可选:构建并上传示例映像

本部分仅供说明之用,介绍如何构建包含符合 SLSA 的来源的示例映像。来源稍后将在本指南中用于演示这项检查。详细了解 Cloud Build 来源

创建示例代码库

要在 Cloud Source Repositories 中创建代码库,请执行以下操作:

  1. 创建代码库并在本地克隆:

    gcloud source repos create SOURCE_REPO_NAME \
        --project=SOURCE_REPO_PROJECT_ID && \
    gcloud source repos clone SOURCE_REPO_NAME \
        --project=SOURCE_REPO_PROJECT_ID && \
    cd SOURCE_REPO_NAME
    

    请替换以下内容:

    • SOURCE_REPO_NAME:源代码库的名称,例如:slsa-check-test-repo
    • SOURCE_REPO_PROJECT_ID:代码库项目 ID
  2. 要创建源代码、配置和构建文件,请执行以下操作:

    1. 创建映像来源:

      cat > quickstart.sh <<EOF
      #!/bin/sh
      echo "Hello, world! The time is $(date)."
      sleep infinity
      EOF
      
    2. 让该文件可执行:

      chmod +x quickstart.sh
      
    3. 创建 Dockerfile 配置文件:

      cat > Dockerfile <<EOF
      FROM alpine
      COPY quickstart.sh /
      CMD ["/quickstart.sh"]
      EOF
      
    4. 创建 Cloud Build cloudbuild.yaml 文件,该文件会将映像推送到 Artifact Registry:

      cat > cloudbuild.yaml <<EOF
      steps:
      - name: 'gcr.io/cloud-builders/docker'
        args: [ 'build', '-t', 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE', '.' ]
      options:
        requestedVerifyOption: VERIFIED
      images:
      - 'LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE'
      EOF
      

      请替换以下内容:

      • LOCATION:Artifact Registry 位置,例如:us-west2europe-central2asia-east1
      • ARTIFACT_PROJECT_ID:存储 Artifact Registry 工件的项目的 ID
      • ARTIFACT_REPO_NAME:Artifact Registry 代码库名称,例如:slsa-check-test-repo
      • DIRECTORY:目录,例如:slsa-check
      • IMAGE:映像的路径,例如:slsa-check-image
    5. 将文件提交到 Cloud Source Repositories:

      git add .
      git commit -a
      

构建并上传示例映像

为了简化本指南的使用,我们建议您对 SOURCE_REPO_PROJECT_IDARTIFACT_PROJECT_ID 使用同一项目。如果您使用其他项目,则可能需要设置其他 IAM 权限。详细了解 Artifact Registry 访问权限控制。 如需详细了解 Cloud Build,请参阅 Cloud Build 概览

如需创建代码库,请执行以下操作:

  1. 创建 Artifact Registry 代码库:

    gcloud artifacts repositories create ARTIFACT_REPO_NAME \
        --project=ARTIFACT_PROJECT_ID \
        --repository-format=docker \
        --location=LOCATION \
        --description="Docker repository"
    

    请替换以下内容:

    • ARTIFACT_REPO_NAME:代码库的名称
    • ARTIFACT_PROJECT_ID:工件项目 ID
    • LOCATION:Artifact Registry 位置,例如:us-west2europe-central2asia-east1
  2. 创建 Cloud Build 构建触发器:

    gcloud beta builds triggers create cloud-source-repositories \
        --project=SOURCE_REPO_PROJECT_ID \
        --repo=SOURCE_REPO_NAME \
        --region=LOCATION \
        --branch-pattern=.* \
        --build-config=cloudbuild.yaml
    

    请替换以下内容:

    • SOURCE_REPO_NAME:源代码库名称
    • SOURCE_REPO_PROJECT_ID:Cloud Build 项目 ID
    • LOCATION:位置
  3. 通过推送您在本指南前面部分创建的文件触发构建。

    git push
    

    成功构建映像后,Cloud Build 会生成来源并将映像上传到您的 Artifact Registry 代码库。

  4. 如需检查最新映像并获取摘要,请执行以下操作:

    1. 确保 Cloud Build 已构建映像:

      gcloud artifacts docker images list LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/REPO_NAME/DIRECTORY \
          --project=ARTIFACT_PROJECT_ID \
          --sort-by=create_time
      

      请替换以下内容:

      • LOCATION:Artifact Registry 位置
      • ARTIFACT_PROJECT_ID:工件的项目 ID
      • ARTIFACT_REPO_NAME:代码库名称
      • DIRECTORY:目录
    2. 复制最新映像的摘要。摘要类似于以下内容:sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59

  5. 可选:查看映像的来源:

    gcloud artifacts docker images describe \
      LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST \
        --project=ARTIFACT_PROJECT_ID \
        --show-provenance
    

    请替换以下内容:

    • ARTIFACT_PROJECT_ID:工件的项目 ID
    • LOCATION:Artifact Registry 位置
    • ARTIFACT_REPO_NAME:工件代码库名称
    • DIRECTORY:目录
    • IMAGE:映像的路径
    • DIGEST:与映像关联的摘要

    命令输出类似于以下内容:

    image_summary:
      digest: sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
      fully_qualified_digest: us-west2-docker.pkg.dev/my-project/slsa-check-repo/slsa-check-image@sha256:9432f747bd058b33de33bb5314d6eec1ac357d664e04c76824bb7072a9218d59
      registry: us-west2-docker.pkg.dev
      repository: slsa-check-repo
      slsa_build_level: 3
    provenance_summary:
      provenance:
      - build:
          intotoStatement:
            _type: https://in-toto.io/Statement/v0.1
            predicateType: https://slsa.dev/provenance/v0.1
            slsaProvenance:
              builder:
                id: https://cloudbuild.googleapis.com/GoogleHostedWorker
              materials:
              - digest:
                  sha1: de4e4227fff1d00d6f7785a827608627e4a369ea
                uri: git+https://source.cloud.google.com/my-project/slsa-check-source-repo
              metadata:
                ...
    envelope:
      payload: eyJfdHlwZSI6I ... taW1hZ2U6dGFnMSJ9XX0=
      payloadType: application/vnd.in-toto+json
      signatures:
      - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/provenanceSigner/cryptoKeyVersions/1
        sig: MEQCIBCCkho_re4EfAT-NBSSmAXOZlv4lU_vWzEru97tU8KmAiAKcAa99umWngzNQADmPixqYjbKjLOKQEUvrI5chSrf7g==
      - keyid: projects/verified-builder/locations/global/keyRings/attestor/cryptoKeys/builtByGCB/cryptoKeyVersions/1
        sig: MEUCIFOEq_7RpiZAB4vUlit3hkZ2yI0n37-5Y87l0JbU-EZSAiEA9TNZZcv_MnzKffTnswHWZR2DSLmYiklr5twWfIec-zo=
    

    输出必须包含 provenance_summary 块,以便 SLSA 检查正常运行。如果输出不包含块,请检查构建触发器是否调用了 Cloud Build。 Cloud Build 在手动触发时不会生成来源信息。

创建平台政策

如需生成来源,您必须使用 Cloud Build 触发器来构建映像,如构建和上传示例映像中所述。

如需创建包含 SLSA 检查的平台政策,请执行以下操作:

  1. 创建平台政策 YAML 文件:

    cat > POLICY_PATH <<EOF
    gkePolicy:
      checkSets:
      - checks:
        - displayName: My SLSA check
          imageAllowlist:
            # This policy exempts images that are in the following artifact registry
            allowPattern:
            - ARTIFACT_LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/EXEMPT_IMAGE_PATH/**
          slsaCheck:
            rules:
            - attestationSource:
                containerAnalysisAttestationProjects:
                - projects/ATTESTATION_PROJECT_ID
              configBasedBuildRequired: true
              trustedBuilder: GOOGLE_CLOUD_BUILD
              trustedSourceRepoPatterns:
              - source.cloud.google.com/SOURCE_REPO_PROJECT_ID/SOURCE_REPO_NAME
              customConstraints:
              - CEL_EXPRESSION
        displayName: My check set
    EOF
    

    替换以下内容:

    • POLICY_PATH:政策文件的路径。
    • ARTIFACT_LOCATION:您的代码库在 Artifact Registry 中的位置。
    • ARTIFACT_PROJECT_ID:包含工件的项目的 ID。
    • ARTIFACT_REPO_NAME:包含映像的代码库。
    • EXEMPT_IMAGE_PATH:一个或多个豁免映像的可选路径,例如 not-built-by-cloud-buildimageAllowlist 块包含在此平台政策中,因此您可以豁免没有来源的映像,以免其违反平台政策。如需改为记录这些映像中的违规行为,请省略此块。
    • ATTESTATION_PROJECT_ID:用于存储 Cloud Build 创建的证明的项目 ID。
    • SOURCE_REPO_PROJECT_ID:包含您的源代码的项目的 ID。
    • SOURCE_REPO_NAME:包含映像的代码库。为便于说明,如需强制违反此检查,请将 SOURCE_REPO_NAME 设置为映像所在的源代码库之外的源代码库。
    • POLICY_PROJECT_ID:包含 CV 政策的项目的 ID。
    • POLICY_ID:此政策的 ID。
    • CEL_EXPRESSION:针对 SLSA 政策提供其他限制条件的 CEL 表达式。例如,如需添加进一步要求映像来自特定目录路径的自定义限制条件,请将 CEL_EXPRESSION 替换为以下表达式:

      payload.predicate.externalParameters.buildConfigSource.path != "" && payload.predicate.externalParameters.buildConfigSource.repository.contains("github.com/my-repo/my-production-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

部署映像

  1. 配置 kubectl

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=LOCATION \
        --project=CLUSTER_PROJECT_ID
    

    请替换以下内容:

    • CLUSTER_NAME:您的集群的名称
    • LOCATION:集群位置
    • CLUSTER_PROJECT_ID:集群项目 ID
  2. 部署 Pod:

    kubectl run hello-app \
        --image='LOCATION-docker.pkg.dev/ARTIFACT_PROJECT_ID/ARTIFACT_REPO_NAME/DIRECTORY/IMAGE@DIGEST'
    

    Pod 已部署。由于映像是基于来源以及可信源代码库构建的,因此它不会违反 CV SLSA 检查,也不会生成日志条目。

    如需强制违反 SLSA 检查,您可以将 SOURCE_REPO_NAME 设置为映像所在的源代码库之外的源代码库。您也可以手动触发构建,这样可以跳过生成来源。然后检查日志条目

查看 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

后续步骤