尽管服务帐户的角色正确,但机密管理器访问被拒绝

Ale*_*uer 19 node.js google-cloud-platform google-secret-manager

我正在 Nodejs (10) 中编写一个云函数,并尝试访问一个像这样的秘密:

const [secret] = await new SecretManagerServiceClient().accessSecretVersion({
    name: `projects/PROJECT_NUMBER/secrets/SECRET_NAME/versions/latest`
})
Run Code Online (Sandbox Code Playgroud)

我在 Web 控制台中创建了密钥,代码中使用的名称与现有密钥的名称相匹配。云功能详情页面上写着服务账号是PROJECT_ID@appspot.gserviceaccount,com,所以我加了secretmanager.secretAccessor角色。但是,我每次仍然遇到相同的错误:

Error: 7 PERMISSION_DENIED: Permission 'secretmanager.versions.access' denied for resource 'projects/PROJECT_NUMBER/secrets/SECRET_NAME/versions/latest' (or it may not exist).

如果我指定一个具体版本或只使用最新版本,这没有区别。

sli*_*wp2 20

HTTP云功能代码:

const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');

const secretManagerServiceClient = new SecretManagerServiceClient();
const name = 'projects/shadowsocks-218808/secrets/workflow/versions/latest';

exports.testSecretManager = async (req, res) => {
  const [version] = await secretManagerServiceClient.accessSecretVersion({ name });
  const payload = version.payload.data.toString();
  console.debug(`Payload: ${payload}`);
  res.sendStatus(200);
};
Run Code Online (Sandbox Code Playgroud)

部署:

gcloud functions deploy testSecretManager --runtime nodejs10 --trigger-http --allow-unauthenticated

Deploying function (may take a while - up to 2 minutes)...done.                                                                                                                                                                                                                        
availableMemoryMb: 256
entryPoint: testSecretManager
httpsTrigger:
  url: https://us-central1-shadowsocks-218808.cloudfunctions.net/testSecretManager
ingressSettings: ALLOW_ALL
labels:
  deployment-tool: cli-gcloud
name: projects/shadowsocks-218808/locations/us-central1/functions/testSecretManager
runtime: nodejs10
serviceAccountEmail: shadowsocks-218808@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/gcf-upload-us-central1-43476143-b555-4cb2-8f6f-1b2d1952a2d7/42c4cda4-98a8-4994-a3be-d2203b9e646a.zip?GoogleAccessId=service-16536262744@gcf-admin-robot.iam.gserviceaccount.com&Expires=1596513795&Signature=kbLw5teN8EoYmj4fEweKKiIaakxcrhlUg2GGHV4jWJjvmeEfXePpRNOn9yz2zLn%2Fba0UqM9qdJMXujs5afBk%2BVBmywPEiptAZe2qgmldpr%2BsYejFu0woNgsPHVqtJ0NoWDo6W2dq4CuNNwO%2BaQ89mnhahUUQTInkJ55Y3wCIe9smk%2BqWtcvta3zICiToA7RQvPKY5MS6NViyj5mLxuJtDlTY9IKPL%2BqG6JAaQJSFYKYVgLyb6JfirXk8Q7%2FMvnHPpXPlhvsBLQksbF6jDPeefp2HyW4%2FSIQYprfpwKV3hlEIQyRQllz5J9yF83%2FxDPh%2BQPc5QmswKP5XAvYaszJPEw%3D%3D
status: ACTIVE
timeout: 60s
updateTime: '2020-08-04T03:34:32.665Z'
versionId: '2'
Run Code Online (Sandbox Code Playgroud)

测试:

gcloud functions call testSecretManager --data '{}'
Run Code Online (Sandbox Code Playgroud)

有和你一样的错误:

error: |-
  Error: function terminated. Recommended action: inspect logs for termination reason. Details:
  7 PERMISSION_DENIED: Permission 'secretmanager.versions.access' denied for resource 'projects/shadowsocks-218808/secrets/workflow/versions/latest' (or it may not exist).
Run Code Online (Sandbox Code Playgroud)

解决方案:

You can find the serviceAccountEmail: shadowsocks-218808@appspot.gserviceaccount.com from the deployment details of cloud function.

go to IAM & Admin web UI, click ADD ANOTHER ROLE button, add Secret Manager Secret Accessor role to this service account.

在此处输入图片说明

Test again:

> gcloud functions call testSecretManager --data '{}'

executionId: 1tsatxl6fndw
result: OK
Run Code Online (Sandbox Code Playgroud)

Read the logs for testSecretManager cloud function:

gcloud functions logs read testSecretManager
Run Code Online (Sandbox Code Playgroud)

You will see the logs for the secret payload string.

  • 对于今天查看的人,您必须进入“IAM 和管理”>“IAM”,而不是“服务帐户”部分。浪费了大量的时间尝试从服务帐户部分添加权限......他们真的应该让这一点更清楚。 (6认同)

Pas*_*nge 16

我在使用 Secretmanager 和 python google-cloud-secretmanager 库 (2.4) 时遇到了类似的问题。具体来说,在创建一个秘密并赋予我的服务帐户该秘密的secretmanager.secretAccessor角色(没有其他任何东西,遵循最小特权原则)后,我在尝试访问它时收到以下错误:

details = "Permission 'secretmanager.versions.access' denied for resource 'projects/projectid/secrets/keyname/versions/latest' (or it may not exist)."
Run Code Online (Sandbox Code Playgroud)

我只能通过secretmanager.viewer在项目级别添加角色来使其工作,据我所知,文档中没有描述这一点。

  • 天啊,谢谢你,最后,我花了这么长时间才发现访问器角色还不够 (7认同)
  • 在 GCP 中添加角色时,您通常可以将它们添加到整个项目中(您可以通过转到项目 IAM 页面并向用户/服务帐户授予权限来执行此操作),或者在资源级别上更精细地添加它们(您可以这样做通过访问相关资源的页面(这里是秘密管理器秘密),并在那里设置权限)。有时,这有点令人困惑,您需要混合使用项目范围和资源级别的权限才能使其工作 - 正如此处的情况。 (3认同)
  • 我也在为同样的事情而苦苦挣扎。您是如何在“项目级别”添加角色的? (2认同)

bin*_*ils 9

我遇到了同样的问题并要解决它,我只需要:

  1. 在我的 Google Cloud Function 的 General 下找到 Service Account。

    它看起来像 <project-name>@appspot.gserviceaccount.com

  2. 在 IAM Admin 中,将Secret Manager Secret Accessor角色添加到此服务帐户。

在此之后,一切正常!