使用密钥和凭据

本页面介绍如何在 Cloud Build 中添加密码和 API 密钥等敏感信息。

在将敏感信息添加到构建中之前,您必须将其存储在 Secret Manager 中,或用 Cloud Key Management Service 加密,请确保仅在 Cloud Build 中添加加密信息。Secret Manager 是使用 Cloud Build 管理敏感数据的推荐方法。对于现有项目,您可以继续使用 Cloud KMS,但对于新项目,请使用 Secret Manager。

准备工作

如要运行本页中所述的 gcloud 命令,请安装 gcloud 命令行工具

  • 如果您之前已经安装了 Cloud SDK,请运行 gcloud components update 以确保您拥有最新版本。

使用 Secret Manager

Secret Manager 是 Google Cloud 服务,可安全存储 API 密钥、密码和其他敏感数据。

如要在 Secret Manager 中存储数据并在 Cloud Build 中使用这些数据,请执行以下操作:

  1. 启用 Secret Manager API:

    启用 Secret Manager API

  2. Secret Accessor IAM 角色授予 Cloud Build 服务帐号:

    1. 在 Cloud Console 中打开 IAM 页面。

      打开 IAM 页面

    2. 选择您的项目,然后点击打开

    3. 在权限表中,找到以 @cloudbuild.gserviceaccount.com 结尾的电子邮件,然后点击铅笔图标。

    4. 添加 Secret Manager Secret Accessor 角色

    5. 点击保存

  3. 将数据存储在 Secret Manager 中:

    1. 转到 Cloud Console 中的 Secret Manager 页面:

      转到 Secret Manager 页面

    2. Secret Manager 页面上,点击创建密钥

    3. 创建密钥页面的名称下,输入 secret-name

    4. 密钥值字段中,输入您的数据。

    5. 保持区域部分不变。

    6. 点击创建密钥按钮。

    如需了解如何通过gcloud命令行工具使用 Secret Manager,请参阅 Secret Manager 快速入门。 如需了解如何授予特定密钥的访问权限,请参阅管理对密钥的访问

  4. 在构建配置文件中,添加构建步骤以访问 Secret Manager 中的密钥版本并将其存储在文件中。执行以下构建步骤可访问 secret-name 并将其存储在名为 decrypted-data.txt 的文件中:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt"
        ]
      }
      ]
    }
    
  5. 在构建步骤中使用包含解密后数据的文件。以下代码段使用 decrypted-data.txt 登录到私有 Docker 注册表:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    - name: gcr.io/cloud-builders/docker
      entrypoint: 'bash'
      args: [ '-c', 'docker login --username=my-user --password-stdin < decrypted-data.txt']
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > password.txt"
         ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=my-user --password-stdin < decrypted-data.txt"
         ]
      }
      ]
    }
    
  1. 使用构建配置文件手动启动构建使用触发器自动执行构建

使用 Cloud KMS

Cloud KMS 是 Google Cloud 服务,可让您管理和使用加密密钥。

要使用 Cloud KMS 加密敏感数据并在构建配置文件中使用该数据,请执行以下操作:

  1. 启用 Cloud KMS API:

    启用 Cloud KMS API

  2. Cloud KMS CryptoKey Decrypter IAM 角色授予 Cloud Build 服务帐号:

    1. 在 Cloud Console 中,转到 Cloud Build“设置”页面:

      打开“设置”页面

    2. 找到具有 Cloud KMS CryptoKey Decrypter 角色的行,并将其状态设置为已启用

  3. 打开一个终端窗口。

  4. 创建名为 keyring-name 的新 Cloud KMS key-ring

      gcloud kms keyrings create keyring-name --location global
    
  5. key-ring keyring-name 创建一个新的 Cloud KMS key key-name

      gcloud kms keys create key-name \
          --location global --keyring keyring-name \
          --purpose encryption
    
  6. 配置 Cloud Build 以使用加密数据:

    • 要使用加密变量,请执行以下操作:

      1. 使用 key-namekeyring-name 加密 secret-name。加密值是一个 base64 编码的字符串。确保 secret-name 中不包含任何无关的字符,例如空格或换行符。-n 标志指示echo不包含终止换行符:

         echo -n secret-name | gcloud kms encrypt --plaintext-file=- \
             --ciphertext-file=- --location=global --keyring=keyring-name \
             --key=key-name | base64
        
      2. 在构建配置文件中,添加 secrets 字段以指定加密值,并添加 CryptoKey 用于解密该值。然后,在要使用加密变量的构建步骤中,添加 secretEnv 字段将变量指定为环境变量。在 secretEnv 字段中添加变量名称。如果您指定变量值或具有相同名称的非密钥环境变量,则 Cloud Build 会抛出错误。

        YAML

         steps:
         - name: 'gcr.io/cloud-builders/docker'
           entrypoint: 'bash'
           args: ['-c', 'docker login --username=user-name --password=$$PASSWORD']
           secretEnv: ['PASSWORD']
         - name: 'gcr.io/cloud-builders/docker'
           args: ['push', 'user-name/myubuntu']
         secrets:
         - kmsKeyName: projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name
           secretEnv:
             PASSWORD: 'encrypted-password'
        

        JSON

         {
           "steps": [
            {
              "name": "gcr.io/cloud-builders/docker",
              "entrypoint": "bash",
              "args": [
                "-c",
                "docker login --username=user-name --password=$$PASSWORD"
               ],
               "secretEnv": [
                 "PASSWORD"
                ]
            },
            {
              "name": "gcr.io/cloud-builders/docker",
              "args": [
                "push",
                "user-name/myubuntu"
               ]
            }
            ],
            "secrets": [
             {
               "kmsKeyName": "projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name",
               "secretEnv": {
                 "PASSWORD": "encrypted-password"
                }
             }
             ]
         }
        
    • 要使用加密文件,请执行以下操作:

      1. 使用 keyring-namekeyring-name 加密名为 secrets.json 的文件。这样会生成一个名为 secrets.json.enc 的加密文件。secrets.json 不得大于 64 KiB。

         gcloud kms encrypt --plaintext-file=secrets.json \
             --ciphertext-file=secrets.json.enc \
             --location=global --keyring=keyring-name\
             --key=key-name
        
      2. 在您的构建配置文件中,可在与加密 secrets.json 文件交互的任何构建步骤之前添加一个构建步骤,用来调用 gcloud Cloud Build 以使用加密密钥解密 secrets.json.enc。此构建步骤类似于用于加密文件的命令。

        YAML

         steps:
         - name: gcr.io/cloud-builders/gcloud
           args:
           - kms
           - decrypt
           - --ciphertext-file=secrets.json.enc
           - --plaintext-file=secrets.json
           - --location=global
           - --keyring=keyring-name
           - --key=key-name
           # more steps here
        

        JSON

         {
           "steps": [
            {
              "name": "gcr.io/cloud-builders/gcloud",
              "args": [
                "kms",
                "decrypt",
                "--ciphertext-file=secrets.json.enc",
                "--plaintext-file=secrets.json",
                "--location=global",
                "--keyring=keyring-name",
                "--key=key-name"
              ]
            }
            ]
         }
        

        完成此步骤后,任何后续步骤都可以使用解密后的 secrets.json 文件。例如,您可以使用此文件中的机密来获取外部依赖项或在您构建的 Docker 容器映像中包含机密令牌。

  7. 使用构建配置文件手动启动构建使用触发器自动执行构建

后续步骤