google-cloud-platform - 尽管 GOOGLE_APPLICATION_CREDENTIALS 已成功设置为服务帐户 json,但 Sops 无法 gcp kms 解密 Circleci 上的文件

标签 google-cloud-platform circleci service-accounts google-cloud-kms mozilla-sops

我正在尝试在我的本地 circleci 上配置一个作业(使用 docker 执行器,图像:google/cloud-sdk:latest),该作业需要解密 sops gcp kms 加密文件。我已经为 gcp kms 解密服务设置了一个谷歌服务帐户(我可以运行脚本,通过 circleci 作业运行,通过服务帐户解密 sops 文件在本地成功运行,所以我知道服务帐户设置是有效的) .以下是我的工作方式。

1- 我对 google 服务帐户 json 文件进行 base64 编码:base64 path/to/service_aacount_file.json

2- 我运行 circleci 作业,在 circleci 上设置 GCLOUD_SERVICE_KEY 环境变量,使用上一步的 base64 编码内容:circleci local execute --env GCLOUD_SERVICE_KEY='<Base64EncodedServiceAccountJsonFileContent>' --job '<MyJob>'

3- 这是我的 circleci 配置:

- run:
          name: <MyJob>
          command: |
            apt-get install -y docker
            apt-get install -y sudo
            cd $(pwd)/path/to/jobcode
            echo $GCLOUD_SERVICE_KEY | base64 -d > ${HOME}/<MyGoogleServiceAccountJsonFile.json>
            export GOOGLE_APPLICATION_CREDENTIALS="${HOME}/<MyGoogleServiceAccountJsonFile.json>" 
            gcloud auth activate-service-account --key-file ${HOME}/<MyGoogleServiceAccountJsonFile.json>
            echo $GOOGLE_APPLICATION_CREDENTIALS
            ls -halt $GOOGLE_APPLICATION_CREDENTIALS
            cat $GOOGLE_APPLICATION_CREDENTIALS
            sudo ./<RunJob.sh>

4- 执行作业时出现以下错误:

Failed to get the data key required to decrypt the SOPS file.

Group 0: FAILED
  projects/<MyProject>/locations/<MyLocation>/keyRings/<MySopsKeyring>/cryptoKeys/<MyKey>: FAILED
    - | Cannot create GCP KMS service: google: could not find
      | default credentials. See
      | https://developers.google.com/accounts/docs/application-default-credentials
      | for more information.

Recovery failed because no master key was able to decrypt the file. In
order for SOPS to recover the file, at least one key has to be successful,
but none were.

5- 此外,从控制台输出:

a- 我可以看到服务帐户已成功激活:Activated service account credentials for: [<MyServiceAccount>@<MyProject>.iam.gserviceaccount.com]

b- GOOGLE_APPLICATION_CREDENTIALS 环境变量设置为服务帐户 json 的路径:/path/to/service_account.json

c- 上面的文件已经正确base64解码并包含有效的json:

{
    "client_x509_cert_url": "<MyUrl>",
    "auth_uri": "<MyAuthUri>",
    "private_key": "<MyPrivateKey>",
    "client_email": "<ClientEmail>",
    "private_key_id": "<PrivateKeyId>",
    "client_id": "<ClientId>",
    "token_uri": "<TokenUri>",
    "project_id": "<ProjectId>",
    "type": "<ServiceAccount>",
    "auth_provider_x509_cert_url": "<AuthProviderCertUrl>"
}

6- 我尝试过的其他一些事情:

a- 尝试在环境变量中设置 google 项目名称,但仍然出现同样的错误。

b- 尝试将 GOOGLE_APPLICATION_CREDENTIALS 设置为文件内容,而不是文件路径,但结果还是一样。

c- 尝试通过提供不带引号或单引号的文件路径来设置 GOOGLE_APPLICATION_CREDENTIALS,但仍然没有区别。

d- 尝试通过执行 echo 'export GOOGLE_APPLICATION_CREDENTIALS=path/to/service_account.json' >> $BASH_ENV 来设置 $BASH_ENV , 但同样的错误

请帮忙。

最佳答案

五个可行的选项:

  1. 尝试运行以下命令:gcloud auth application-default login
  2. 尝试使用此命令设置环境变量:echo 'export GOOGLE_APPLICATION_CREDENTIALS=/tmp/service-account.json' >> $BASH_ENV
  3. 另一件事是我看到 runjob.sh 在 root 下运行。可能是 gcp 凭据默认情况下在 sudo 下不可见。要么在没有 sudo 的情况下运行脚本,要么在有 sudo 的情况下运行前面的命令。
  4. 作为最后的手段(这些选项对我有用,在你的场景中可能会有所不同):{ echo 1;回声 1;回声; } | gcloud 初始化
  5. gcloud components update 这有时会在 sdk 过时时起作用。
  6. 配置集项目 [PROJECT_NAME]

您还可以使用以下方式检查事件帐户:gcloud auth list

关于google-cloud-platform - 尽管 GOOGLE_APPLICATION_CREDENTIALS 已成功设置为服务帐户 json,但 Sops 无法 gcp kms 解密 Circleci 上的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60137075/

相关文章:

c# - 值不能为空。参数名称: baseUri

google-cloud-platform - Google 功能 HTTP 触发器 - 身份验证问题服务器到具有服务帐户的服务器

python-3.x - 为什么我们使用hadoop mapreduce进行数据处理?为什么不在本地计算机上呢?

nginx - 在没有 GCP 负载均衡器的情况下创建 kubernetes nginx ingress

automated-tests - 是否可以将 "ERROR No tests to run"转为警告?

node.js - CircleCI 中的多个 Node.js 版本

ruby-on-rails - 如何组合 simplecov coverage/index.html 文件

python - 将文件从 URL 传输到 Cloud Storage

docker - 将 Docker 镜像从 GKE 中运行的容器推送到 Google 容器注册表

google-cloud-platform - 获取谷歌服务帐户的 signedJwt token