7

我正在尝试创建一个 Cloud Build 触发器,其中秘密环境变量使用云 KMS 加密并存储为 Cloud Build 中的替换变量。这样,我的云构建 yaml 相当通用,并且在我们部署到的所有环境中都是相同的。

此云构建 yaml 工作正常:

steps:
- name: 'ubuntu'
  entrypoint: 'bash'
  args: ['-c', 'echo "$$APP_NAME HAS A VALUE $$HELLO_WORLD"']
  env:
    - 'APP_NAME=${_APP_NAME}'
  secretEnv:
    - 'HELLO_WORLD'
secrets:
- kmsKeyName: 'projects/my-first-cicd-project/locations/europe-west1/keyRings/keyring-dev/cryptoKeys/key-backend'
  secretEnv:
    HELLO_WORLD: xxxxxxxxxxx

构建步骤生成此日志行:

My App Name HAS A VALUE Hello there world!

完全符合预期。

现在对于那些不起作用的东西,或者至少我不能去工作。假设我想让密钥环名称动态化。然后,我将该 yaml 中的“keyring-dev”替换为${_KMS_KEYRING_NAME}. 这将产生如下错误:

invalid build: failed to check access to "projects/my-first-cicd-project/locations/europe-west1/keyRings/${_KMS_KEYRING_NAME}/cryptoKeys/key-backend"

如果我将 YAML 中的 base64 字符串(以“CiQAH ...”开头)更改为 ${_KMS_VAR_HELLO_WORLD} 之类的替换变量,我将收到此错误:

failed unmarshalling build config cloudbuild.yaml: illegal base64 data at input byte 0

仅供参考:base64 字符串的值不超过变量值的最大字符数 255。

所以我的猜测是,Cloud Build 不会替代 cloudbuild.yaml 的机密部分中的任何内容。有谁知道解决这个问题?

4

3 回答 3

4

这是 API 的一个已知限制。

  • 替换适用于“字符串”字段,尽管秘密值使用“字节”字段。因此,我们不能对它们应用替换值。
  • 关于 Keyring 名称和项目,更改它们会更改加密内容,并且内容不可替代。
于 2019-07-11T08:37:35.617 回答
2

这是 cloudbuild secrets api 的一个限制,但我使用了一种解决方法,涉及在构建步骤中解密秘密,如下所示:

steps:
- name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args:
    - -c
    - |
      export HELLO_WORLD=$(echo -n $_ENC_HELLO_WORLD | \
        base64 -d - | \
        gcloud kms decrypt \
          --ciphertext-file - \
          --plaintext-file - \
          --project $PROJECT_ID \
          --location global \
          --keyring $_KMS_KEYRING_NAME \
          --key key-backend \
      )

      echo "$_APP_NAME has a value $$HELLO_WORLD"
于 2020-03-19T08:20:16.830 回答
1

对于它的价值,我发现自动解密的值似乎是作为 bash 变量隐式注入的。

例如,如果我有以下脚本:

entrypoint: 'bash'
args: ['bin/hello.sh']
secretEnv:
- foo

其中hello.sh定义为:

#!/usr/bin/env bash
echo $foo

假设解密后的值是"bar"——我发现通过不显式传入 CLI 参数,args它实际上是有效的,哈哈。

于 2021-07-07T01:39:34.987 回答