Google-Cloud-Platform

GCP 服務帳號無法訪問具有權限的 IAM 操作

  • July 4, 2020

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

權限參考說明提供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

我確實為這種特定情況手動創建了新的服務帳戶,因為我還沒有設置其餘的基礎設施(這將創建帳戶作為其過程的一部分)。我想確保這有效。

有任何想法嗎?據我所知,我已經授予了它告訴我我需要的權限。幫助?

編輯:哦,我檢查了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"
 }
}

我徹底糊塗了

您可能錯誤地使用了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

如果您收到此錯誤,請執行gcloud projects get-iam-policy your-project-name並查看缺少的內容。政策更改很可能會消除您的所有者角色以及預設服務帳戶(名稱中包含您的項目 ID)的角色。

摘要:如果您在 Google Cloud Platform 中使用 Terraform 管理 IAM,則通常不應該使用 resource google_project_iam_policy,除非您是手寫 Google IAM 政策的專家。如果您必須使用它,請在開始之前執行gcloud projects get-iam-policy your-project-name並保存結果,這樣您就可以在破壞之前查看您的 IAM 策略的樣子。

引用自:https://serverfault.com/questions/962347