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

Node.js 尽管服务帐户的角色正确,但机密管理器访问被拒绝,node.js,google-cloud-platform,google-secret-manager,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` }) 我在web控制台中创建了这个秘密,代码中使用的名称与现有秘密的名称匹配。在云功能详细信息页面上,它声明服务帐户是PROJE

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

const [secret] = await new SecretManagerServiceClient().accessSecretVersion({
    name: `projects/PROJECT_NUMBER/secrets/SECRET_NAME/versions/latest`
})
我在web控制台中创建了这个秘密,代码中使用的名称与现有秘密的名称匹配。在云功能详细信息页面上,它声明服务帐户是
PROJECT_ID@appspot.gserviceaccount,com
,因此我将
secretmanager.secretAccessor
角色添加到它。但是,每次我都会遇到同样的错误:

错误:7权限\u被拒绝:权限“secretmanager.versions.access”资源“projects/PROJECT\u NUMBER/secrets/SECRET\u NAME/versions/latest”(或它可能不存在)。


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

有点晚了,但是这个答案可能对未来的用户有用。我只在Python中遇到了相同的行为。我尝试了很多方法,但唯一有效的方法是创建一个零角色的新服务帐户(如果我立即授予它
secretmanager.secretAccessor
角色,我会得到同样的错误)。然后,当创建空的服务帐户时,在
IAM
选项卡中,我按
+Add
,复制我的空服务帐户地址,然后才向其添加
secretmanager.secretAccessor
角色。然后我使用这个帐户作为执行特定功能的帐户。当然,您可能需要添加其他角色,具体取决于您的功能要完成的任务。

HTTP云功能代码:

const{SecretManagerServiceClient}=require('@googlecloud/secretmanager');
const secretManagerServiceClient=新的secretManagerServiceClient();
const name='projects/shadowsocks-218808/secrets/workflow/versions/latest';
exports.testSecretManager=async(req,res)=>{
const[version]=wait secretManagerServiceClient.accessSecretVersion({name});
const payload=version.payload.data.toString();
调试(`Payload:${Payload}`);
res.sendStatus(200);
};
部署:

gcloud函数部署testSecretManager——运行时节点JS10——触发http——允许未经身份验证
部署功能(可能需要一段时间-最多2分钟)…完成。
可用邮箱:256
入口点:testSecretManager
httpsTrigger:
网址:https://us-central1-shadowsocks-218808.cloudfunctions.net/testSecretManager
入口设置:允许所有
标签:
部署工具:cli gcloud
名称:projects/shadowsocks-218808/locations/us-central1/functions/testSecretManager
运行时: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=KBLW5TEN8EOYMJ4FEWEKKIAAKXCRHLUG2GGHV4JWJJVMEEFXEPPRNON9YZ2LN%2Fba0UqM9qdJMXujs5afBk%2BVBMYWPPEIPTAZE2QGMLDPR%2BsYejFu0woNgsPHVqtJ0NoWDo6W2dq4CuNNwO%2BaQ89mnhahUUQTInkJ55Y3wCIe9smk%2BqWtcvta3zICiToA7RQvPKY5MS6NViyj5mLxuJtDlTY9IKPL%2bqg6jaaqjsfyyyvyb6jfirxk8q7%2fmvpplhlhvsblqbf6jdfpefp2hyw4%2fsiqyprfwkv3leqyqlz5j9yf83%2bqpxdph%2bqpqpqpqpqc5xqc5xqpwkpw3w3w3w3w3w3jj3
状态:活动
超时时间:60秒
更新时间:“2020-08-04T03:34:32.665Z”
版本ID:'2'
测试:

gcloud函数调用testSecretManager--data'{}
获得与您相同的错误:

错误:|-
错误:函数终止。建议的操作:检查日志以了解终止原因。细节:
7权限被拒绝:资源项目/shadowsocks-218808/secrets/workflow/versions/latest的权限“secretmanager.versions.access”被拒绝(或者它可能不存在)。
解决方案:

您可以找到
serviceAccountEmail:shadowsocks-218808@appspot.gserviceaccount.com
来自云功能的部署详细信息

转到
IAM&Admin
web界面,单击
ADD other ROLE
按钮,将
Secret Manager Secret Accessor
角色添加到此服务帐户

再次测试:

gcloud函数调用testSecretManager--data“{}” 执行ID:1tsatxl6fndw 结果:好的 阅读
testSecretManager
cloud函数的日志:

gcloud函数日志读取testSecretManager

您将看到机密负载字符串的日志。

我也遇到了同样的问题,要解决它,我必须:

  • 在“我的谷歌云”功能的“常规”下查找服务帐户

    它看起来像
    @appspot.gserviceaccount.com

  • 在IAM Admin中,向此服务帐户添加
    Secret Manager Secret Accessor
    角色


  • 在这之后,一切顺利

    我在使用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)."
    

    我只能通过在项目级别添加
    secretmanager.viewer
    角色来实现这一点,据我所知,这个角色在gitlab下使用terraform时也遇到了类似的问题。 我必须向运行管道的服务帐户添加两个授权:

    resource "google_project_iam_policy" "gitlab" {
      project     = "secret_owner_project_id"
      policy_data = data.google_iam_policy.iam.policy_data
    }
    
    data "google_iam_policy" "iam" {
      binding {
        role = "roles/secretmanager.secretAccessor"
        members = [
          "serviceAccount:project_accessing_secret@XYZ.iam.gserviceaccount.com",
        ]
      }
      binding {
        role = "roles/viewer"
        members = [
          "serviceAccount:project_accessing_secret@XYZ.iam.gserviceaccount.com",
        ]
      }
    }
    

    应该可以工作,请仔细检查机密名称和服务帐户名称,然后尝试删除secretAccessor角色并将其添加回。如果这没有帮助,请尝试重新部署该功能。只是为了确定:您使用的项目编号是什么?代码在我看来很好,我认为我在测试容器上添加的唯一附加权限是secretmanagersecr