尽管服务帐户的角色正确,但 Secret Manager 访问被拒绝
Secret manager access denied despite correct roles for service account
我正在用 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
角色。但是,我仍然每次都遇到同样的错误:
Error: 7 PERMISSION_DENIED: Permission 'secretmanager.versions.access' denied for resource 'projects/PROJECT_NUMBER/secrets/SECRET_NAME/versions/latest' (or it may not exist).
指定具体版本或仅使用最新版本都没有区别。
有点晚了,但也许这个答案对未来的用户有用。我只遇到了 Python 的相同行为。我尝试了很多方法,但唯一有效的方法是创建零角色的新服务帐户(如果我立即授予它 secretmanager.secretAccessor
角色,我会遇到同样的错误)。然后,当创建空服务帐户时,在 IAM
选项卡中,我按 +Add
,复制我的空服务帐户地址,然后才向其添加 secretmanager.secretAccessor
角色。然后我使用这个帐户作为将执行特定功能的帐户。您当然可能需要添加其他角色,具体取决于您的职能要完成的任务。
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);
};
部署:
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'
测试:
gcloud functions call testSecretManager --data '{}'
遇到和你一样的错误:
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).
解决方案:
您可以在云函数的部署详情中找到serviceAccountEmail: shadowsocks-218808@appspot.gserviceaccount.com
。
转到 IAM & Admin
网页 UI,单击 ADD ANOTHER ROLE
按钮,将 Secret Manager Secret Accessor
角色添加到此服务帐户。
再次测试:
> gcloud functions call testSecretManager --data '{}'
executionId: 1tsatxl6fndw
result: OK
读取 testSecretManager
云函数的日志:
gcloud functions logs read testSecretManager
您将看到秘密负载字符串的日志。
我遇到了同样的问题,要解决它,我只需要:
在我的 Google 云功能的常规下找到服务帐户。
看起来像<project-name>@appspot.gserviceaccount.com
在 IAM 管理员中,向此服务帐户添加 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
角色来使其工作,据我所知,documentation.
中并未对此进行描述
我在 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",
]
}
}
OAuth 范围在这里起着重要作用,请确保范围定义正确。
要在 Compute Engine 或 GKE 上将 Secret Manager 与工作负载 运行 结合使用,底层实例或节点必须具有云平台 OAuth 范围。如果您收到包含以下消息的错误,则表示未为实例或节点提供正确的 OAuth 范围。
Request had insufficient authentication scopes
使用 Secret Manager 所需的 OAuth 范围是:
https://www.googleapis.com/auth/cloud-platform
创建具有作用域的 dataproc 的示例 gcloud 命令
gcloud dataproc clusters create xyz-pqr --region asia-south1 --subnet projects/xyz-pqr/regions/asia-south1/subnetworks/abc-serverless-vpc --zone asia-south1-b --master-machine-type n1-standard-4 --master-boot-disk-size 100 --num-workers 2 --worker-machine-type n1-standard-4 --worker-boot-disk-size 100 --image-version 2.0-debian10 --project xyz-development -scopes https://www.googleapis.com/auth/cloud-platform
我正在用 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
角色。但是,我仍然每次都遇到同样的错误:
Error: 7 PERMISSION_DENIED: Permission 'secretmanager.versions.access' denied for resource 'projects/PROJECT_NUMBER/secrets/SECRET_NAME/versions/latest' (or it may not exist).
指定具体版本或仅使用最新版本都没有区别。
有点晚了,但也许这个答案对未来的用户有用。我只遇到了 Python 的相同行为。我尝试了很多方法,但唯一有效的方法是创建零角色的新服务帐户(如果我立即授予它 secretmanager.secretAccessor
角色,我会遇到同样的错误)。然后,当创建空服务帐户时,在 IAM
选项卡中,我按 +Add
,复制我的空服务帐户地址,然后才向其添加 secretmanager.secretAccessor
角色。然后我使用这个帐户作为将执行特定功能的帐户。您当然可能需要添加其他角色,具体取决于您的职能要完成的任务。
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);
};
部署:
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'
测试:
gcloud functions call testSecretManager --data '{}'
遇到和你一样的错误:
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).
解决方案:
您可以在云函数的部署详情中找到serviceAccountEmail: shadowsocks-218808@appspot.gserviceaccount.com
。
转到 IAM & Admin
网页 UI,单击 ADD ANOTHER ROLE
按钮,将 Secret Manager Secret Accessor
角色添加到此服务帐户。
再次测试:
> gcloud functions call testSecretManager --data '{}'
executionId: 1tsatxl6fndw
result: OK
读取 testSecretManager
云函数的日志:
gcloud functions logs read testSecretManager
您将看到秘密负载字符串的日志。
我遇到了同样的问题,要解决它,我只需要:
在我的 Google 云功能的常规下找到服务帐户。
看起来像
<project-name>@appspot.gserviceaccount.com
在 IAM 管理员中,向此服务帐户添加
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
角色来使其工作,据我所知,documentation.
我在 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",
]
}
}
OAuth 范围在这里起着重要作用,请确保范围定义正确。
要在 Compute Engine 或 GKE 上将 Secret Manager 与工作负载 运行 结合使用,底层实例或节点必须具有云平台 OAuth 范围。如果您收到包含以下消息的错误,则表示未为实例或节点提供正确的 OAuth 范围。
Request had insufficient authentication scopes
使用 Secret Manager 所需的 OAuth 范围是:
https://www.googleapis.com/auth/cloud-platform
创建具有作用域的 dataproc 的示例 gcloud 命令
gcloud dataproc clusters create xyz-pqr --region asia-south1 --subnet projects/xyz-pqr/regions/asia-south1/subnetworks/abc-serverless-vpc --zone asia-south1-b --master-machine-type n1-standard-4 --master-boot-disk-size 100 --num-workers 2 --worker-machine-type n1-standard-4 --worker-boot-disk-size 100 --image-version 2.0-debian10 --project xyz-development -scopes https://www.googleapis.com/auth/cloud-platform