资源...密钥的权限“cloudkms.cryptoKeyVersions.useToDecrypt”被拒绝

Posted

技术标签:

【中文标题】资源...密钥的权限“cloudkms.cryptoKeyVersions.useToDecrypt”被拒绝【英文标题】:Permission 'cloudkms.cryptoKeyVersions.useToDecrypt' denied for resource ...key 【发布时间】:2020-01-11 15:24:58 【问题描述】:

我正在使用 Google Cloud Functions 构建一个 http 端点。我有一个加密的秘密存储为一个文件,该文件在函数中加载和解密,以防止我的秘密存储在代码中。通常我会从 Google Cloud Storage 动态加载某些内容,但似乎 KMS 更适合此目的。

使用 KMS 的代码如下所示:

getCredentials: async function () 
    const kms = require('@google-cloud/kms');
    const client = new kms.KeyManagementServiceClient();
    const fs = require('fs');
    let ciphertext = (fs.readFileSync('secret.enc')).toString('base64')
    const name = client.cryptoKeyPath(
      '[project]',
      'global',
      '[keyring]',
      '[key]'
    );

一切都在本地运行良好,但当使用 http 触发器调用时,我似乎无法让该函数工作。检查日志我看到了这个:

textPayload:  "Error: Permission 'cloudkms.cryptoKeyVersions.useToDecrypt' denied for resource 'projects/[projectname]/locations/global/keyRings/[keyring]/cryptoKeys/[key]'.
    at Http2CallStream.call.on (/srv/functions/node_modules/@grpc/grpc-js/build/src/client.js:96:45)
    at Http2CallStream.emit (events.js:194:15)
    at Http2CallStream.EventEmitter.emit (domain.js:459:23)
    at process.nextTick (/srv/functions/node_modules/@grpc/grpc-js/build/src/call-stream.js:71:22)
    at process._tickCallback (internal/process/next_tick.js:61:11)" 

我已经尝试了各种可用的 IAM 权限(包括所有者),所以看来我一定有更深的误解。

这可能与我无法让 Google Cloud Build 部署该功能的另一个问题有关。它在没有帮助的情况下出错:

starting build "b2321cdb-bd4c-4828-8d38-80a86f4fe808"

FETCHSOURCE
Initialized empty Git repository in /workspace/.git/
From https://source.developers.google.com/p/[projectname]/r/[repo]
* branch 314691d6e63199caf867c74bcd0090bc70386a0e -> FETCH_HEAD
HEAD is now at 314691d Merge pull request #2 from [repo]/tristans/update-deploy-cloudbuild
BUILD
Already have image (with digest): gcr.io/cloud-builders/gcloud
Deploying function (may take a while - up to 2 minutes)...
...............failed.
ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Build failed: Build error details not available
ERROR
ERROR: build step 0 "gcr.io/cloud-builders/gcloud" failed: exit status 1

您似乎不需要任何 KMS 权限来部署 functions deploy name --trigger-http --runtime=nodejs10 --entry-point=fname --project=project,就像我说的那样,当我在本地运行 gcloud deploy 时它工作正常,所以我不确定为什么会失败。我们有几个云功能设置了类似的部署过程,所以似乎有一些关于 KMS 工作方式的不明显或破坏的东西对我有用,但也许这是一个红鲱鱼。

如果有更好的方法来为此目的使用 KMS,我会全力以赴!

【问题讨论】:

你能分享你的代码吗?你运行了什么命令?您将哪个服务帐号附加到 Cloud Build/Run? @sethvargo 我在 sn-p 中添加了 KMS 的东西,就像我说的代码在本地调用时运行良好。我一直在为我的默认 Google Cloud Functions Service Agent Cloud Build Service Account 调整 IAM 权限。您是否建议创建新的服务帐户?我不确定如何在任意服务帐户上随意运行云功能。 我正在寻找gcloud functions deploy 电话或其他什么。你有没有偶然看过github.com/sethvargo/secrets-in-serverless和github.com/GoogleCloudPlatform/berglas? @sethvargo 创建一个具有解密 IAM 权限的新服务帐户并将其添加到部署脚本中就可以了。非常感谢您的帮助! 我在 CI 工作中遇到了同样的问题,并仔细检查了所有内容,但均未成功。最后,创建一个具有相同设置的新服务帐户使设置最终起作用。但是当仔细观察时,我意识到我在此过程中改变了一些东西,经过验证,这对我来说是真正的罪魁祸首:将 GOOGLE_APPLICATION_CREDENTIALS 设置为我的服务帐户凭据 json 的路径,一切都不同了。我希望此评论可以帮助处于类似情况的人。 【参考方案1】:

根据Google Functions docs,函数的运行时服务帐户是PROJECT_ID@appspot.gserviceaccount.com 您需要为此帐户授予 KMS 解密权限。 这可以在谷歌云网络控制台的“IAM & Admin / IAM”部分完成

【讨论】:

以上是关于资源...密钥的权限“cloudkms.cryptoKeyVersions.useToDecrypt”被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

REST API 服务器上资源的细粒度权限

k8s创建指定用户只对指定namesapce下的资源有操作权限

在用VMware虚拟机安装Ubuntu的时候又是要密钥还要啥管理员权限、应该怎么办、紧急啊、求帮忙、

命令帮助手册的使用

有人可以通过分析我的 CLR DLL 来破解我的密钥许可系统吗?

权限错误 github(ssh 密钥无法识别)