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

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

我正在使用 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

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

> gcloud iam service-accounts get-iam-policy [email protected] --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

权限参考规定roles/iam.serviceAccountAdmin了此项许可。

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

Error 403: Permission iam.serviceAccounts.get is required to perform this operation on service account projects/-/serviceAccounts/[email protected]., forbidden

我确实为这个特定案例手动创建了新的服务帐户,因为我尚未设置其余的基础设施(这将作为其流程的一部分创建帐户)。我想确保这能正常工作。

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

编辑:哦,我查看过了尝试 API,我的用户帐户显示 403,而我的用户帐户应该有组织管理员:

{
  "error": {
    "code": 403,
    "message": "Permission iam.serviceAccounts.get is required to perform this operation on service account projects/-/serviceAccounts/[email protected].",
    "status": "PERMISSION_DENIED"
  }
}

我彻底糊涂了

答案1

你可能使用了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:[email protected]
  role: roles/compute.serviceAgent
- members:
  - serviceAccount:[email protected]
  - serviceAccount:[email protected]
  - serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
  role: roles/editor
- members:
  - user:[email protected]
  role: roles/owner
- members:
  - serviceAccount:terraform-service-account@your-terraform-project.iam.gserviceaccount.com
  role: roles/servicenetworking.networksAdmin
- members:
  - serviceAccount:[email protected]
  role: roles/servicenetworking.serviceAgent
etag: BwWc0THMaHA=
version: 1

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

概括:如果你使用 Terraform 来管理 Google Cloud Platform 中的 IAM,你通常不应该使用资源google_project_iam_policy,除非你是这方面的专家手写 Google IAM 政策如果必须使用它,那么在开始之前,请运行gcloud projects get-iam-policy your-project-name并保存结果,以便您可以在破坏它之前看到您的 IAM 策略是什么样的。

答案2

同意之前的回答,只是请注意,您可以在 IAM -> 查看资源中查看已删除的所有角色。到达那里后,检查您意外删除的项目,单击“活动”,然后逐一进行更改,直到找到超级破坏性的更改。应该更容易通过那里并重新添加更改。

相关内容