使用 Sigstore 签名检查

本页面介绍如何使用 Binary Authorization 持续验证 (CV) Sigstore 签名检查。此检查会验证与启用了 CV 的 Google Kubernetes Engine (GKE) 集群中运行的 Pod 关联的容器映像的 Sigstore 生成的签名。此检查与简单签名证明检查之间的主要区别在于 Sigstore 签名工作流不使用 Artifact Analysis 备注来将签名关联到映像。所有签名都会随其签名的映像一起存储。

此检查仅支持 Artifact Registry 仓库。

费用

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

  • Binary Authorization,但 CV 在预览阶段可免费使用
  • GKE
  • Cloud Key Management Service
  • Artifact Registry

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

须知事项

  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

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

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

  6. Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:

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

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

    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      PROJECT_ID 替换为您的 Google Cloud 项目 名称。

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

  11. Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:

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

所需的角色

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

概览

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

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

  • 如果集群项目与政策项目不同:向集群项目 Binary Authorization 服务代理授予 Binary Authorization Policy Evaluator (roles/binaryauthorization.policyEvaluator) 角色
  • 如果映像仓库项目与政策项目不同:向政策项目 Binary Authorization 服务代理授予 Artifact Registry Reader (roles/artifactregistry.reader) 角色

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

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

使用 gcloud CLI 授予角色

为确保每个项目中的 Binary Authorization 服务代理都有评估 CV Sigstore 签名检查所需的权限,请为每个项目中的 Binary Authorization 服务代理授予以下 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. 允许政策项目 Binary Authorization 服务代理访问仓库中的签名:

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

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

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

    2. 授予角色:

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

      REPOSITORY_PROJECT_ID 替换为包含仓库的项目的 ID。

创建密钥对

在本部分中,您将创建一个椭圆曲线数字签名算法 (ECDSA) 非对称密钥对。

使用私钥为映像签名,从而创建证明。在平台政策中添加公钥。在 CV 检查证明时,它会使用公钥来验证证明。

您可以使用 Cloud Key Management Service (Cloud KMS) 或本地密钥,但我们建议将 Cloud KMS 密钥用于生产。

PKIX Cloud KMS Cosign

  1. 设置创建密钥对所需的环境变量。为此,我们建议您在以下命令中填写占位符,然后运行该命令。

    KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID
    KMS_KEYRING_NAME=KMS_KEYRING_NAME
    KMS_KEY_NAME=KMS_KEY_NAME
    KMS_KEY_LOCATION=global
    KMS_KEY_PURPOSE=asymmetric-signing
    KMS_KEY_ALGORITHM=ec-sign-p256-sha256
    KMS_PROTECTION_LEVEL=software
    KMS_KEY_VERSION=1
    

    请替换以下内容:

    • KMS_KEY_PROJECT_ID:您的项目 ID
    • KMS_KEYRING_NAME:Cloud KMS 密钥环的名称
    • KMS_KEY_NAME:Cloud KMS 密钥的名称
  2. 使用 Cosign CLI 生成密钥:

    cosign generate-key-pair \
      --kms gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}
    
  3. 记录公钥的位置:

    Cosign 会自动在运行 generate-key-pair 命令的目录中将生成的公钥保存为 cosign.pub。将此文件位置保存在变量中,以供将来的命令使用。

    PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
    

PKIX Cloud KMS gcloud

如需在 Cloud KMS 中创建密钥对,请执行以下操作:

  1. 设置创建密钥对所需的环境变量。为此,我们建议您在以下命令中填写占位符,然后运行该命令。

    KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID
    KMS_KEYRING_NAME=KMS_KEYRING_NAME
    KMS_KEY_NAME=KMS_KEY_NAME
    KMS_KEY_LOCATION=global
    KMS_KEY_PURPOSE=asymmetric-signing
    KMS_KEY_ALGORITHM=ec-sign-p256-sha256
    KMS_PROTECTION_LEVEL=software
    KMS_KEY_VERSION=1
    

    请替换以下内容:

    • KMS_KEY_PROJECT_ID:您的项目 ID
    • KMS_KEYRING_NAME:Cloud KMS 密钥环的名称
    • KMS_KEY_NAME:Cloud KMS 密钥的名称
  2. 创建密钥环:

    gcloud kms keyrings create ${KMS_KEYRING_NAME} \
        --location=${KMS_KEY_LOCATION} \
        --project=${KMS_KEY_PROJECT_ID}
    
  3. 创建密钥:

    gcloud kms keys create ${KMS_KEY_NAME} \
        --location=${KMS_KEY_LOCATION} \
        --keyring=${KMS_KEYRING_NAME}  \
        --purpose=${KMS_KEY_PURPOSE} \
        --default-algorithm=${KMS_KEY_ALGORITHM} \
        --protection-level=${KMS_PROTECTION_LEVEL} \
        --project=${KMS_KEY_PROJECT_ID}
    
  4. 将公钥资料导出到文件中:

    PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
    gcloud kms keys versions get-public-key 1 \
        --key=${KMS_KEY_NAME} \
        --keyring=${KMS_KEYRING_NAME} \
        --location=${KMS_KEY_LOCATION} \
        --output-file=${PUBLIC_KEY_FILE} \
        --project=${KMS_KEY_PROJECT_ID}
    

本地密钥

如需在本地创建密钥对,请执行以下操作:

  cosign generate-key-pair
  PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
  PRIVATE_KEY_FILE="$(pwd)/cosign.key"

创建平台政策

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

  1. 创建 Sigstore 签名检查平台政策文件:

    cat > POLICY_PATH <<EOF
    gkePolicy:
      checkSets:
      - checks:
        - displayName: sigstore-signature-check
          sigstoreSignatureCheck:
            sigstoreAuthorities:
            - displayName: sigstore-authority
              publicKeySet:
                publicKeys:
                  publicKeyPem: |
    $(awk '{printf "                %s\n", $0}' ${PUBLIC_KEY_FILE})
    EOF
    

    POLICY_PATH 替换为政策文件的路径。

  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。在这种情况下,CV Sigstore 签名检查会验证签名,并且不会生成日志条目。

然后,您需要尝试部署其他未签名的映像。在这种情况下,CV 检查无法找到有效的签名,并将违规行为记录到 Cloud Logging。

为映像签名

为了符合检查,映像需要有效的签名。如需创建签名,请执行以下操作:

  1. 创建用于为映像签名的变量:

    IMAGE_PATH=IMAGE_PATH
    IMAGE_DIGEST=sha256:IMAGE_DIGEST_SHA
    IMAGE_TO_SIGN="${IMAGE_PATH}@${IMAGE_DIGEST}"
    

    替换以下内容:

    • IMAGE_PATH:映像的路径
    • IMAGE_DIGEST_SHA:映像摘要的 SHA 哈希
  2. 为映像签名并将签名推送到 Artifact Registry:

    PKIX Cloud KMS

    使用 Cloud KMS 中托管的密钥为映像签名,并将签名推送到 Artifact Registry:

    cosign sign \
        --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \
        ${IMAGE_TO_SIGN}
    

    本地密钥

    使用本地私钥为映像签名,并将签名推送到 Artifact Registry。

    cosign sign --key ${PRIVATE_KEY_FILE} ${IMAGE_TO_SIGN}
    
  3. 回复 Cosign 提示:

    运行 cosign sign 命令后,Cosign 会询问您是否要将签名上传到透明度日志 Rekor。针对提示回复 yn。如需详细了解 Rekor,请参阅 Rekor 文档

手动验证签名

如需手动验证签名,请执行以下操作:

  1. 确保 Artifact Registry 中存在该签名:

    Google Cloud 控制台

    1. 进入 Google Cloud 控制台中的 Artifact Registry 页面。

      转到 Artifact Registry

    2. 在仓库列表中,点击包含您的映像的代码库的名称。

    3. 点击您签名的映像的名称。

    4. 找到包含签名的项。此项带有标记 sha256-[image digest].sig。应只有一项带有此标记。

    5. 点击清单

    6. 您应该会看到包含各种字段的 JSON 格式文件。每个签名都位于 annotations 映射中的 layers 列表的一个元素中。签名位于键 dev.cosignproject.cosign/signature 处。

      以下是一个示例清单:

      {
            "schemaVersion": 2,
            "mediaType": "application/vnd.oci.image.manifest.v1+json",
            "config": {
                "mediaType": "application/vnd.oci.image.config.v1+json",
                "size": SIZE_OF_LAYERS,
                "digest": "DIGEST_OF_LAYERS"
            },
            "layers": [
                {
                    "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json",
                    "size": SIZE_OF_ANNOTATIONS,
                    "digest": "DIGEST_OF_ANNOTATIONS",
                    "annotations": {
                        "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE",
                        "dev.sigstore.cosign/bundle": "BUNDLE"
                    }
                }
            ]
      }
    

    示例清单包含以下字段:

    • SIZE_OF_LAYERSlayers 数组的大小,以字节为单位
    • DIGEST_OF_LAYERSlayers 数组的摘要
    • SIZE_OF_ANNOTATIONSannotations 字典的大小,以字节为单位
    • DIGEST_OF_ANNOTATIONSannotations 字典的摘要
    • BASE64_SIGNATURE:以 base64 格式编码的原始签名。这是将用于验证的签名
    • BUNDLE:Sigstore 特定元数据

    如需详细了解清单格式,请参阅 Sigstore 的 cosign 签名规范

    命令行

    1. 找到正确的工件:

      列出与映像一起存储的项:

      gcloud artifacts docker tags list ${IMAGE_PATH}
      

      输出示例如下所示:

      Listing items under project PROJECT_ID, location REPOSITORY_LOCATION, repository REPOSITORY_NAME.
      TAG                         IMAGE                                                         DIGEST
      latest                      us-east1-docker.pkg.dev/my-project/my-repo/my-image           sha256:abc123
      sha256-abc123.sig           us-east1-docker.pkg.dev/my-project/my-repo/my-image           sha256:def456
      

      在输出中,带有 sha256-abc123.sig 标记的工件在其清单中包含签名。

    2. 获取清单

      如需获取带有 sha256-IMAGE_DIGEST_SHA.sig 标记的工件清单,请运行以下命令:

      curl -X GET -H "Content-Type: application/json" \
                  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
                  -H "X-Goog-User-Project: REPOSITORY_PROJECT_ID" \
                  "https://REPOSITORY_LOCATION-docker.pkg.dev/v2/REPOSITORY_PROJECT_ID/REPOSITORY_NAME/IMAGE_NAME/manifests/sha256-IMAGE_DIGEST_SHA.sig"
      

      替换以下内容:

      • REPOSITORY_PROJECT_ID:包含仓库的项目的 ID
      • REPOSITORY_LOCATION:仓库的位置
      • REPOSITORY_NAME:代码库的名称
      • IMAGE_NAME:映像的名称

      您应该会看到包含各种字段的 JSON 格式文件。每个签名都位于 annotations 映射中的 layers 列表的一个元素中。签名位于键 dev.cosignproject.cosign/signature 处。

      示例清单如下所示:

      {
          "schemaVersion": 2,
          "mediaType": "application/vnd.oci.image.manifest.v1+json",
          "config": {
              "mediaType": "application/vnd.oci.image.config.v1+json",
              "size": SIZE_OF_LAYERS,
              "digest": "DIGEST_OF_LAYERS"
          },
          "layers": [
              {
                  "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json",
                  "size": SIZE_OF_ANNOTATIONS,
                  "digest": "DIGEST_OF_ANNOTATIONS",
                  "annotations": {
                      "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE",
                      "dev.sigstore.cosign/bundle": "BUNDLE"
                  }
              }
          ]
      }
      

    示例清单包含以下字段:

    • SIZE_OF_LAYERSlayers 数组的大小,以字节为单位
    • DIGEST_OF_LAYERSlayers 数组的摘要
    • SIZE_OF_ANNOTATIONSannotations 字典的大小,以字节为单位
    • DIGEST_OF_ANNOTATIONSannotations 字典的摘要
    • BASE64_SIGNATURE:以 base64 格式编码的原始签名。这是将用于验证的签名
    • BUNDLE:Sigstore 特定元数据

    如需详细了解清单格式,请参阅 Sigstore 的 cosign 签名规范

  2. 手动验证签名:

    使用 cosign verify 验证上传的签名:

    PKIX Cloud KMS

    cosign verify --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \
          ${IMAGE_PATH}@${IMAGE_DIGEST}
    

    本地密钥

    cosign verify --key {PUBLIC_KEY_FILE} ${IMAGE_PATH}@${IMAGE_DIGEST}
    

    如果验证成功,则命令输出会显示 The signatures were verified against the specified public key

部署已签名的映像

如需部署签名映像,请执行以下操作:

  1. 配置 kubectl

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

    请替换以下内容:

    • CLUSTER_NAME:您的集群的名称
    • LOCATION:集群位置
    • CLUSTER_PROJECT_ID:集群项目 ID
  2. 部署映像并根据 Binary Authorization 政策检查部署:

    kubectl run hello-app-signed --image=${IMAGE_PATH}@${IMAGE_DIGEST}
    

    Pod 已部署。由于映像已签名,因此 CV 不会生成与此 Pod 相关的日志条目。

部署未签名的映像

在本部分中,您将部署未签名的映像。

由于政策要求提供签名,而此映像没有签名,因此 CV 会在容器运行时定期记录违规行为。

如需部署映像,请运行以下命令:

  kubectl run hello-app-unsigned \
      --image=UNSIGNED_IMAGE_PATH@UNSIGNED_IMAGE_DIGEST

Pod 已部署。由于映像没有证明,因此 CV 会在 Pod 运行时生成日志条目

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

后续步骤