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 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 策略的樣子。