GCP 服务帐号无法使用权​​限访问 IAM 操作

The*_*ege 3 google-cloud-platform terraform

我正在使用 Terraform 来自动化我的许多 GCP 管理,因为点击很糟糕。我有一个“共享服务”项目,我试图用它来管理其他项目。我正在尝试在另一个项目中设置新环境,并且需要共享服务项目中的服务帐户来管理那里的资源。(我不想为每个项目手动创建一个新的服务帐户)

我正在尝试使用共享服务服务帐户在新项目中创建服务帐户。共享服务帐户具有组织级权限,但我一直在尝试添加项目级权限来解决该问题。

gcloud projects get-iam-policy newproject这是(删除不相关信息,重命名)的输出:

bindings:
- members:
  - serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
  role: roles/editor
- members:
  - serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
  role: roles/iam.serviceAccountAdmin
- members:
  - serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
  role: roles/iam.serviceAccountKeyAdmin
- members:
  - serviceAccount:terraform@shared-services-####.iam.gserviceaccount.com
  role: roles/resourcemanager.projectIamAdmin
etag: BwWGI28ti_w=
version: 1
Run Code Online (Sandbox Code Playgroud)

这是我尝试运行测试命令时得到的输出:

> gcloud iam service-accounts get-iam-policy new-service-account@newproject.iam.gserviceaccount.com --project=newproject --impersonate-service-account=terraform@shared-services-####.iam.gserviceaccount.com
WARNING: This command is using service account impersonation. All API calls will be executed as [terraform@shared-services-####.iam.gserviceaccount.com].
ERROR: (gcloud.iam.service-accounts.get-iam-policy) PERMISSION_DENIED: The caller does not have permission
Run Code Online (Sandbox Code Playgroud)

权限参考声明roles/iam.serviceAccountAdmin提供此权限。

这是 Terraform 给我的输出(我知道这是一个不同的操作):

Error 403: Permission iam.serviceAccounts.get is required to perform this operation on service account projects/-/serviceAccounts/new-service-account@newproject.iam.gserviceaccount.com., forbidden
Run Code Online (Sandbox Code Playgroud)

我确实针对这个特定情况手动创建了新的服务帐户,因为我还没有设置基础设施的其余部分(这将创建帐户作为其过程的一部分)。我想确保这有效。

有任何想法吗?据我所知,我已经授予了它告诉我我需要的权限。帮助?

编辑:哦,我尝试了API,我得到了 403 作为我的用户帐户,该帐户应该有组织管理员:

{
  "error": {
    "code": 403,
    "message": "Permission iam.serviceAccounts.get is required to perform this operation on service account projects/-/serviceAccounts/new-service-account@newproject.iam.gserviceaccount.com.",
    "status": "PERMISSION_DENIED"
  }
}
Run Code Online (Sandbox Code Playgroud)

我彻底困惑了

Cra*_*nch 5

您可能google_project_iam_policy错误地使用了资源,并使用错误的策略覆盖了项目的默认 IAM 策略配置(不要问我是怎么知道的......)

google_project_iam_policy是Terraform 中非常危险的资源,文档没有充分强调它的危险程度。问题在于,设置 IAM 策略会将项目​​的整个IAM 配置替换为您定义的 IAM 策略。所有默认的、自动创建的服务帐户权限都会被清除,除非您专门将它们包含在策略定义中。

修复您的项目是可能的,但并不容易。您需要找到您的项目需要的所有服务帐户,并添加正确的权限。错误输出TF_LOG=TRACE terraform apply可以指导您。默认项目 IAM 政策应类似于以下政策,但它会根据您启用的 API 以及正在使用的 Google Cloud 功能而有所不同。(政策已清理,用 xxxxx 替换项目 ID)

bindings:
- members:
  - serviceAccount:service-xxxxxxxxxxx@compute-system.iam.gserviceaccount.com
  role: roles/compute.serviceAgent
- members:
  - serviceAccount:xxxxxxxxxxx-compute@developer.gserviceaccount.com
  - serviceAccount:xxxxxxxxxxx@cloudservices.gserviceaccount.com
  - serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
  role: roles/editor
- members:
  - user:owner@example.com
  role: roles/owner
- members:
  - serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
  role: roles/servicenetworking.networksAdmin
- members:
  - serviceAccount:service-xxxxxxxxxxx@service-networking.iam.gserviceaccount.com
  role: roles/servicenetworking.serviceAgent
etag: BwWc0THMaHA=
version: 1
Run Code Online (Sandbox Code Playgroud)

如果您收到此错误,请运行gcloud projects get-iam-policy your-project-name并查看缺少什么。策略更改很可能消除了您的所有者角色以及默认服务帐户的角色(名称中包含您的项目 ID 的角色)。

摘要:如果您使用 Terraform 来管理 Google Cloud Platform 中的 IAM,通常不应使用资源,除非您是手写 Google IAM 策略的google_project_iam_policy专家。如果您必须使用它,请在开始之前运行并保存结果,以便您可以查看 IAM 策略在破坏之前的情况。gcloud projects get-iam-policy your-project-name