Node.js 尽管服务帐户的角色正确,但机密管理器访问被拒绝
我正在Nodejs(10)中编写一个云函数,并尝试访问这样一个秘密: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
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
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