创建 GCP 服务帐户密钥时权限被拒绝

Permission denied when creating GCP Service Account Key

我创建了 Service Account A 并授予了角色 Service Account AdminService Account Key Admin。我在 GCP 控制台中完成了这项工作。

Service Account A 的功能是使用 GCP Java SDK 以编程方式创建其他服务帐户。它成功创建了新的服务帐户,但是当它为新创建的服务帐户创建密钥时,我得到以下响应:

{
  "code": 403,
  "errors": [
    {
      "domain": "global",
      "message": "Permission iam.serviceAccountKeys.create is required to perform this operation on service account projects/-/serviceAccounts/<new_service_account_name>@<project_id>.iam.gserviceaccount.com.",
      "reason": "forbidden"
    }
  ],
  "message": "Permission iam.serviceAccountKeys.create is required to perform this operation on service account projects/-/serviceAccounts/<new_service_account_name>@<project_id>.iam.gserviceaccount.com.",
  "status": "PERMISSION_DENIED"
}

我试过等待,看看我是否在创建服务帐户后过早尝试创建密钥,但等待时间没有任何变化。

Service Account A 可以为自己成功创建密钥,只是不能为它创建的其他服务帐户创建密钥。

我该如何解决?

您遇到以下三个问题之一:

  1. Service Account A 在项目中实际上没有IAM角色Service Account Key Admin。使用 CLI 命令 gcloud projects get-iam-policy 并仔细检查。

  2. 您的代码使用了错误的标识。您认为您使用的是服务帐户,但 ADC(应用程序默认凭据)正在加载另一个身份,或者您的代码有误。

  3. 您分配了正确的角色,但分配的是服务帐户而不是项目。使用 CLI 命令 gcloud iam service-accounts get-iam-policy。如果您找到输出中列出的角色,则说明您在错误的位置分配了角色。请改用 CLI 命令 gcloud projects add-iam-policy-binding

注意:还有第四种方法可以防止您创建服务帐户密钥。约束可能已启用:

Restricting service account usage