使用 Google Cloud 控制台创建证明者

本页面介绍了如何使用 Google Cloud 控制台在 Binary Authorization 中创建自定义证明者。作为替代方案,您还可以使用 Google Cloud CLIREST API 来执行这些步骤。此任务是设置 Binary Authorization 的一部分。

Cloud Build 用户:您可以改用 built-by-cloud-build 证明者仅部署由 Cloud Build 构建的映像

准备工作

在创建证明者之前,请执行以下操作:

  1. 启用 Binary Authorization。

  2. 为您的平台设置 Binary Authorization。

概览

证明者是一种 Google Cloud 资源,供 Binary Authorization 用于验证证明。 如需详细了解 Binary Authorization,请参阅 Binary Authorization 概览

如需创建证明者,请执行以下操作:

  • 设置密钥对,用于先对映像进行签名,创建证明,然后在映像部署时对其进行验证。PKIX 密钥对是指由 Cloud Key Management Service (Cloud KMS) 生成的、采用与 PKIX 兼容的格式的密钥对。
  • 在 Binary Authorization 中创建证明者本身,并将您创建的公钥关联起来

单项目设置中,您可以在配置了 Binary Authorization 政策的那个项目中创建证明者。在多项目设置中,您很可能有一个部署者项目,其中配置了您的政策;还有一个单独的证明者项目,用于存储证明者。

设置加密密钥

借助 Binary Authorization,您可以使用 PKIX 密钥安全地对映像进行签名,然后在以后验证该映像。这样可以确保只有经过验证的各方才能对容器映像进行授权。如需使用认证,您需要设置非对称密钥(例如公钥基础架构 [X.509] [PKIX] 密钥),以安全地验证证明者的身份。部署映像时,Binary Authorization 会使用证明者中的公钥检查使用私钥签名的映像证明。

在本指南中,我们使用了推荐的椭圆曲线数字签名算法 (ECDSA) 来生成 PKIX 密钥对。您也可以使用 RSA 或 PGP 密钥进行签名。如需详细了解如何对算法签名,请参阅密钥用途和算法

创建 PKIX 密钥对

借助 Binary Authorization,您可以使用非对称 PKIX 密钥对为映像签名和验证映像。

PKIX 密钥对包含一个私钥(供签名者用于对证明进行数字签名)和一个公钥(您会将其添加到证明者)。在部署时,Binary Authorization 会使用此公钥来验证由私钥签名的证明。

Cloud KMS 中生成和存储的非对称密钥对符合 PKIX 格式的要求。如需创建 Cloud KMS 密钥以用于 Binary Authorization,请参阅创建非对称密钥。创建密钥时,请务必选择非对称签名作为密钥用途。

PKIX (Cloud KMS)

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

  1. 设置创建密钥对所需的环境变量。

    KMS_KEY_PROJECT_ID=${PROJECT_ID}
    KMS_KEYRING_NAME=my-binauthz-keyring
    KMS_KEY_NAME=my-binauthz-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
    
  2. 创建密钥环。

    gcloud kms keyrings create ${KMS_KEYRING_NAME} \
      --location ${KMS_KEY_LOCATION}
    
  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}
    

PKIX(本地密钥)

如需生成新的本地非对称 PKIX 密钥对并将其存储在文件中,请执行以下操作:

  1. 生成密钥:

    PRIVATE_KEY_FILE="/tmp/ec_private.pem"
    openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}
    
  2. 由于此文件既包含公钥,又包含私钥,因此您需要将公钥提取到单独的文件中,以便将其添加到证明者中:

    PUBLIC_KEY_FILE="/tmp/ec_public.pem"
    openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
    

创建证明者

下一步是创建证明者本身并关联 Artifact Analysis 备注和公钥。

Binary Authorization 使用 Artifact Analysis 来存储在授权过程中使用的可信元数据。对于您创建的每个证明者,您都必须创建一个 Artifact Analysis 备注。每个证明都存储为此备注的一个发生实例。

如需创建证明者,请执行以下操作:

  1. 转到证明者项目的“Binary Authorization”页面。

    转到 Binary Authorization

  2. 证明者标签页中,点击创建

  3. 点击创建新的证明者 (Create New Attestor)。

  4. 证明者名称中,输入证明者名称(例如 build-secureprod-qa)。

  5. 如需将公钥添加到证明者,请执行以下操作:

    PKIX(本地密钥)

    1. 点击添加 PKIX 密钥 (Add a PKIX Key)。
    2. 点击从文件导入
    3. 导航至您之前保存的 PKIX 密钥文件,并选择它。注意:您还可以粘贴 PEM 格式的公钥。
    4. 选择签名算法。本指南中的示例密钥采用 Elliptic Curve P256 - SHA Digest 算法生成。

    PKIX (Cloud KMS)

    1. 点击添加 PKIX 密钥 (Add a PKIX Key)。
    2. 点击从 Cloud KMS 导入
    3. 在打开的窗口中输入密钥版本的资源 ID。资源 ID 的格式为:

      projects/KMS_KEY_PROJECT_ID/locations/KMS_KEY_LOCATION/keyRings/KMS_KEYRING_NAME/cryptoKeys/KMS_KEY_NAME/cryptoKeyVersions/KMS_KEY_VERSION
      

      其中:

      • KMS_KEY_PROJECT_ID 是存储了密钥的项目的 ID
      • KMS_KEY_LOCATION 是密钥的位置(默认为 global
      • KMS_KEYRING_NAME 是密钥环的名称
      • KMS_KEY_NAME 是密钥的名称
      • KMS_KEY_VERSION 是密钥版本

      如果您使用此页面中的环境变量创建了 Cloud KMS 密钥对,则可以使用以下命令查看资源 ID:

      echo projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}
      
    4. 点击提交

  6. 如果您要使用之前创建的现有备注,请展开高级设置部分。

    1. 取消选择自动生成 Artifact Analysis 备注

    2. Artifact Analysis 备注 ID 字段中输入完全限定名称。名称的格式为 projects/PROJECT_ID/notes/NOTE_ID

  7. 点击创建

验证证明者是否已创建

如需验证证明者是否已创建,请执行以下操作:

  1. 返回 Google Cloud 控制台中的 Binary Authorization 页面。

  2. 打开证明者标签页。

多项目设置

如果您使用的是多项目设置,您在其中拥有单独的部署者项目和证明者项目,则需要针对证明者资源设置其他权限,以便部署者项目在部署期间能够使用其创建的证明。

添加部署者项目的 IAM 角色绑定

您必须向证明者添加部署者项目服务账号的 IAM 角色绑定。Binary Authorization 在评估政策以确定该账号是否有权访问证明者时,会用到此角色绑定。

您必须在命令行中添加 IAM 角色绑定,因为 Google Cloud 控制台不支持此步骤。

如需添加 IAM 角色绑定,请执行以下操作:

  1. 设置环境变量以存储项目名称和编号:

    DEPLOYER_PROJECT_ID=PROJECT_ID
    DEPLOYER_PROJECT_NUMBER="$(
        gcloud projects describe "${DEPLOYER_PROJECT_ID}" \
          --format="value(projectNumber)"
    )"
    
  2. 设置环境变量以存储项目的服务账号名称:

    DEPLOYER_SERVICE_ACCOUNT="service-${DEPLOYER_PROJECT_NUMBER}@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
    
  3. 添加 IAM 角色绑定:

    gcloud --project ATTESTOR_PROJECT_ID \
        beta container binauthz attestors add-iam-policy-binding \
        "projects/ATTESTOR_PROJECT_ID/attestors/ATTESTOR" \
        --member="serviceAccount:${DEPLOYER_SERVICE_ACCOUNT}" \
        --role=roles/binaryauthorization.attestorsVerifier
    

添加设置了 Binary Authorization 的用户的 IAM 角色绑定

您必须添加在部署者项目中将证明者添加到 Binary Authorization 政策的用户的 IAM 角色绑定,因为该用户必须有权查看要添加的证明者。如果需要,可以在添加证明者后安全撤消此权限。

您还必须在命令行中添加 IAM 角色绑定,因为 Google Cloud 控制台不支持此步骤。

如需添加 IAM 角色绑定,请执行以下操作:

gcloud --project ATTESTOR_PROJECT_ID \
    beta container binauthz attestors add-iam-policy-binding \
    "projects/ATTESTOR_PROJECT_ID/attestors/ATTESTOR" \
    --member=ADMIN_EMAIL_ACCOUNT \
    --role=roles/binaryauthorization.attestorsViewer

如需在添加证明者后移除 IAM 角色绑定,请运行以下命令:

gcloud --project ATTESTOR_PROJECT_ID \
    beta container binauthz attestors remove-iam-policy-binding \
    "projects/ATTESTOR_PROJECT_ID/attestors/ATTESTOR" \
    --member=ADMIN_EMAIL_ACCOUNT \
    --role=roles/binaryauthorization.attestorsViewer

后续步骤