如何授予服务帐户访问特定机密的权限?

Mat*_*ice 6 google-cloud-platform terraform google-secret-manager

我想授予服务帐户访问 Google Secrets Manager 中的机密的权限。

可以像这样访问秘密:

gcloud beta secrets versions access 1 --secret="thesecret" --project="myproject"
Run Code Online (Sandbox Code Playgroud)

但是当我的服务帐户尝试相同的命令时,gcloud 会发出以下错误:

错误:(gcloud.beta.secrets.versions.access)PERMISSION_DENIED:请求的身份验证范围不足。

主要问题是:我还需要做什么来确保服务帐户可以访问机密?


我已在 Terraform 中授予该服务帐户“roles/secretmanager.secretAccessor”,如下所示:

resource google_project_iam_binding the-binding {
  project = myproject
  role = "roles/secretmanager.secretAccessor"
  members = [
    "serviceAccount:theserviceaccount@someotherproject.iam.gserviceaccount.com",
  ]
}

Run Code Online (Sandbox Code Playgroud)

我可以验证它在 gcp 控制台中是否具有该角色,如下所示:

gcloud projects get-iam-policy myproject  \
--flatten="bindings[].members" \                         
--format='table(bindings.role)' \
--filter="bindings.members:theserviceaccount@someotherproject.iam.gserviceaccount.com"

    ROLE
    roles/secretmanager.secretAccessor
Run Code Online (Sandbox Code Playgroud)

但是文档中有这个概念:

如果成员只需要访问单个机密的值,则不要授予该成员访问所有机密的能力。例如,您可以针对单个密钥授予服务帐户 Secret Accessor 角色 (roles/secretmanager.secretAccessor)。

因此,就像 iam-policy-binding 可以对特定秘密具有亲和力,但我不确定我可以使用哪些 gcloud 命令或 terraform 资源来创建这种亲和力。

Mat*_*ice 5

第一个问题是我弄错了我的环境被配置为使用哪个服务帐户。所以我已经授予了对服务帐户的访问权限,但我毕竟没有使用它(显然在我的情况下它们的初始化不一致)。我通过在尝试访问机密之前运行此命令来解决此问题:

gcloud config set account theserviceaccount@someotherproject.iam.gserviceaccount.com
Run Code Online (Sandbox Code Playgroud)

此外,我没有意识到有不止一个顶级 gcloud 命令可以让您修改 iam 策略绑定。我一直在探索gcloud iam ...,当我需要的是:

gcloud beta secrets add-iam-policy-binding projects/myproject/secrets/mysecret --member serviceAccount:theserviceaccount@someotherproject.iam.gserviceaccount.com --role roles/secretmanager.secretAccessor
Run Code Online (Sandbox Code Playgroud)