在大型機構中,讓團隊獨立管理資源的允許政策可能很有幫助。不過,允許主體授予或撤銷所有 IAM 角色,可能會大幅增加安全風險。
您可以使用身分與存取權管理 (IAM) 條件和 iam.googleapis.com/modifiedGrantsByRole API 屬性,限制主體可授予及撤銷的角色。您可以透過這些限制建立受限的 IAM 管理員,讓他們管理自己團隊的允許政策,但只能在您設定的範圍內進行。
事前準備
- Enable the Resource Manager API. - Roles required to enable APIs - To enable APIs, you need the Service Usage Admin IAM role ( - roles/serviceusage.serviceUsageAdmin), which contains the- serviceusage.services.enablepermission. Learn how to grant roles.
- 熟悉允許政策的結構。 
- 瞭解 IAM 條件。 
所需權限
如要取得必要權限,為專案、資料夾或機構建立受限的 IAM 管理員,請管理員在您要建立受限 IAM 管理員的資源 (專案、資料夾或機構) 上,授予您下列 IAM 角色:
- 
            如要為專案建立有限的 IAM 管理員:
              
  
  
    
      專案 IAM 管理員   (roles/resourcemanager.projectIamAdmin)
- 
            如要為資料夾建立有限的 IAM 管理員:
              
  
  
    
      資料夾管理員   (roles/resourcemanager.folderAdmin)
- 
            如要為專案、資料夾或機構建立有限的 IAM 管理員:
              
  
  
    
      機構管理員  (roles/resourcemanager.organizationAdmin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義的角色具備為專案、資料夾或機構建立受限 IAM 管理員所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要為專案、資料夾或機構建立受限的 IAM 管理員,必須具備下列權限:
- 
                如要為專案建立有限的 IAM 管理員:
                - 
                      resourcemanager.projects.getIamPolicy
- 
                      resourcemanager.projects.setIamPolicy
 
- 
                      
- 
                如要為資料夾建立有限制的 IAM 管理員:
                - 
                      resourcemanager.folders.getIamPolicy
- 
                      resourcemanager.folders.setIamPolicy
 
- 
                      
- 
                如要為機構建立存取權受限的 IAM 管理員:
                - 
                      resourcemanager.organizations.getIamPolicy
- 
                      resourcemanager.organizations.setIamPolicy
 
- 
                      
常見用途
以下各節說明如何使用有限的角色授予功能,啟用允許政策的自助式管理。
建立受限的 IAM 管理員
假設您想讓使用者 Noam 擔任專案的 IAM 受限管理員,您希望 Noam 只能為專案授予和撤銷 App Engine 管理員 (roles/appengine.appAdmin) 和 App Engine 檢視者 (roles/appengine.appViewer) 角色。
如要授予這項有限的權限,請有條件地授予 Noam「專案 IAM 管理員」角色 (roles/resourcemanager.projectIamAdmin)。「專案 IAM 管理員」角色可讓 Noam 授予及撤銷 IAM 角色,而條件則會限制 Noam 可授予及撤銷的角色:
{ "version": 3, "etag": "BwWKmjvelug=", "bindings": [ { "members": [ "user:owner@example.com" ], "role": "roles/owner" }, { "members": [ "user:noam@example.com" ], "role": "roles/resourcemanager.projectIamAdmin", "condition": { "title": "only_appengine_admin_viewer_roles", "description": "Only allows changes to role bindings with the App Engine Admin or Viewer roles", "expression": "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/appengine.appAdmin', 'roles/appengine.appViewer'])" } } ] }
透過這個有條件的角色繫結,Noam 可以執行下列操作:
- 授予專案的 App Engine 管理員和 App Engine 檢視者角色。
- 撤銷專案的 App Engine 管理員和 App Engine 檢視者角色。
- 新增、移除或修改專案層級角色繫結的條件,授予 App Engine 管理員和 App Engine 檢視者角色。
- 執行專案 IAM 管理員角色允許的其他動作,但不得修改專案的允許政策。舉例來說,Noam 可以使用 projects.getIamPolicy方法取得專案的允許政策。
這個條件式角色繫結不會讓 Noam 執行下列任何操作:
- 修改專案以外資源的允許政策。
- 授予 App Engine 管理員或 App Engine 檢視者角色以外的角色。
- 撤銷 App Engine 管理員或 App Engine 檢視者角色以外的角色。
- 新增、移除或修改角色繫結的條件,這些繫結不會授予 App Engine 管理員或 App Engine 檢視者角色。
允許使用者管理受限的 IAM 管理員
假設您想將使用者 Lila 設為團隊的 IAM 受限管理員。您希望 Lila 只能授予及撤銷專案的 Compute 管理員角色 (roles/compute.admin)。不過,您也希望 Lila 能選取其他使用者擔任受限的 IAM 管理員。換句話說,您希望 Lila 允許其他使用者授予和撤銷的只有 Compute 管理員角色。
您可能會認為解決方法是授予 Lila「專案 IAM 管理員」角色 (roles/resourcemanager.projectIamAdmin),然後讓她有權授予或撤銷其他人的角色。不過,如果您授予 Lila 專案 IAM 管理員角色,她就能從自己的角色移除條件,並授予或撤銷任何 IAM 角色。
為避免權限遭到濫用,請建立 Google 群組 (iam-compute-admins),指派專案的 IAM 管理員。然後將 Lila 加入群組,並將她設為群組管理員。
建立群組後,您會視情況授予群組專案 IAM 管理員角色 (roles/resourcemanager.projectIamAdmin)。專案 IAM 管理員角色可讓群組成員授予及撤銷 IAM 角色,而條件會限制他們可授予及撤銷的角色:
{ "version": 3, "etag": "BwWKmjvelug=", "bindings": [ { "members": [ "user:owner@example.com" ], "role": "roles/owner" }, { "members": [ "group:iam-compute-admins@example.com" ], "role": "roles/resourcemanager.projectIamAdmin", "condition": { "title": "only_compute_admin_role", "description": "Only allows changes to role bindings for the Compute Admin role", "expression": "api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/compute.admin'])" } } ] }
身為 iam-compute-admins 群組的成員,Lila 可以執行下列操作:
- 新增角色的繫結,或將主體新增至角色的現有繫結,即可授予專案的 Compute 管理員角色。
- 如要撤銷「Compute 管理員」角色,請移除該角色的現有繫結,或是從該角色的現有繫結中移除主體。
- 修改 Compute Admin 角色的授權,方法是新增、移除或修改附加至角色繫結的條件。
- 執行專案 IAM 管理員角色允許的其他動作,但不得修改專案的允許政策。舉例來說,她可以使用 projects.getIamPolicy方法取得專案的允許政策。
Lila 是 iam-compute-admins 群組的管理員,她可以將其他使用者加入 iam-compute-admins 群組,允許他們授予或撤銷 Compute 管理員角色。
Lila 無法執行下列操作:
- 授予自己授予或撤銷其他角色的權限。
- 修改專案以外資源的允許政策。
- 授予 Compute 管理員以外的角色。
- 撤銷 Compute 管理員角色以外的角色。
- 為未授予 Compute Admin 角色的角色繫結新增、移除或修改條件。
限制角色授予
下列各節說明如何讓主體僅授予或撤銷特定角色。
撰寫條件運算式,限制角色授予作業
如要限制主體授予角色的能力,請編寫條件運算式,指定主體可授予或撤銷的角色。
條件運算式請使用下列格式:
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(roles)
這個運算式會執行下列操作:
- 使用 - api.getAttribute()函式取得 API 屬性- iam.googleapis.com/modifiedGrantsByRole。- 如要為資源設定允許政策,這項屬性會包含要求修改的繫結中的角色名稱。如果是其他類型的要求,則不會定義這個屬性。在這些情況下,函式會傳回預設值 ( - [])。
- 使用 - hasOnly()Common Expression Language (CEL) 函式定義及強制執行主體可授予或撤銷的角色。- hasOnly()函式的輸入內容是主體可授予或撤銷的角色清單。如果- iam.googleapis.com/modifiedGrantsByRole屬性中的角色包含在這個清單中,函式會傳回- true。如果不是,函式會傳回- false。- 如果 - iam.googleapis.com/modifiedGrantsByRole屬性包含預設值 (- []),函式會傳回- true,因為- []不包含清單中未列出的任何角色。
如要自訂這個運算式,請將 roles 替換為主體可授予或撤銷的角色清單。舉例來說,如要讓主體僅授予或撤銷 Pub/Sub 編輯者 (roles/pubsub.editor) 和 Pub/Sub 發布者 (roles/pubsub.publisher) 角色,請使用 ['roles/pubsub.editor', 'roles/pubsub.publisher'] 值。
您最多可以在允許的角色清單中加入 10 個值。這些值都必須是字串常數。
hasOnly() 陳述式的邏輯運算子
請勿使用 && 或 || 運算子,在單一條件中加入多個 hasOnly() 陳述式。如果這樣做,即使主體可以個別授予或撤銷這些角色,授予或撤銷多個角色的要求仍可能會失敗。
舉例來說,請參考以下條件:
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
    .hasOnly(['roles/pubsub.editor']) ||
api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', [])
    .hasOnly(['roles/pubsub.publisher'])
如果要求授予 roles/pubsub.editor 角色或 roles/pubsub.publisher 角色,這項條件的評估結果為 true;如果要求同時授予 roles/pubsub.editor 角色和 roles/pubsub.publisher 角色,這項條件的評估結果為 false。
使用條件式角色繫結限制角色授予
如要允許主體僅授予或撤銷特定角色,請使用上一節的條件運算式建立條件角色繫結。接著,將條件角色繫結新增至資源的允許政策。
- 選取代表範圍的資源,您要允許主體授予及撤銷該範圍的角色: - 如要讓主體授予及撤銷機構內所有資源的特定角色,請選取機構。
- 如要讓主體授予及撤銷資料夾內所有資源的特定角色,請選取資料夾。
- 如要允許主體為專案內的所有資源授予及撤銷特定角色,請選取專案。
 
- 選取可讓主體為所選資源類型 (專案、資料夾或機構) 設定允許政策的角色。如要遵循最低權限原則,請選擇下列其中一個預先定義的角色: - 專案:專案 IAM 管理員 (roles/resourcemanager.projectIamAdmin)
- 資料夾:資料夾 IAM 管理員 (roles/resourcemanager.folderIamAdmin)
- 機構:機構管理員 ( - roles/resourcemanager.organizationAdmin)。
 - 或者,選擇包含 - resourcemanager.resource-type.setIamPolicy和- resourcemanager.resource-type.getIamPolicy權限的自訂角色,其中- resource-type為- project、- folder或- organization。
- 專案:專案 IAM 管理員 (
- 有條件地將所選專案、資料夾或機構的指定角色授予主體。 - 系統會套用新的允許政策,且主體只能修改您允許的角色繫結。 - 控制台- 前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。 
- 確認頁面頂端的資源選取器中顯示了專案、資料夾或機構的名稱。資源選取器會指出您目前使用的專案、資料夾或機構。 - 如果沒有看到資源名稱,請按一下資源選取器,然後選取資源。 
- 在主體清單中,找出要授予和撤銷角色的主體,然後按一下 按鈕。 
- 在「編輯權限」面板中,選取先前選擇的角色。然後在「IAM condition (optional)」(IAM 條件 (選用)) 下方,按一下「Add IAM condition」(新增 IAM 條件)。 
- 在「編輯條件」面板中,輸入條件的標題和說明 (選填)。 
- 按一下「條件編輯器」分頁,然後輸入您在「撰寫條件運算式來限制角色授予」中撰寫的運算式。 這個運算式會限制主體可授予或撤銷的角色。 - 舉例來說,下列條件運算式會限制主體,只能授予及撤銷 Pub/Sub 編輯者 ( - roles/pubsub.editor) 和 Pub/Sub 發布者 (- roles/pubsub.publisher) 角色:- api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])- 警告:請勿在允許的角色清單中加入下列類型的角色: - 
    具有授予及撤銷 IAM 角色權限的角色 (也就是權限名稱結尾為 setIamPolicy的角色)。
- 
    受限 IAM 管理員可修改的自訂角色。舉例來說,如果受限的 IAM 管理員也擁有專案的「角色管理員」角色 (roles/iam.roleAdmin),請勿允許他們授予或撤銷專案層級的自訂角色。
 - 如果有限的 IAM 管理員可以授予及撤銷這類角色,他們就能授予及撤銷所有 IAM 角色。詳情請參閱「撰寫條件運算式,限制角色授予作業」。 
- 
    具有授予及撤銷 IAM 角色權限的角色 (也就是權限名稱結尾為 
- 按一下「儲存」即可套用條件。 
- 關閉「編輯條件」面板後,按一下「編輯權限」面板中的「儲存」,即可更新允許政策。 
 - gcloud- 首先,請詳閱資源的允許政策: - 執行 - get-iam-policy指令。這項指令會取得資源目前的允許政策。- 指令: - gcloud resource-type get-iam-policy resource-id --format=json > path - 替換下列值: - resource-type:您要讓主體授予或撤銷角色的資源類型。請使用下列其中一種:- projects、- resource-manager folders或- organizations。
- resource-id:您的 Google Cloud 專案、資料夾或機構 ID。
- path:要下載允許政策的檔案路徑。
 - 允許政策會以 JSON 格式儲存,例如: - { "bindings": [ { "members": [ "user:project-owner@example.com" ], "role": "roles/owner" } ], "etag": "BwWKmjvelug=", "version": 1 }- 接著,修改允許政策。 - 如要讓主體只能修改特定角色的繫結,請新增醒目顯示的條件式角色繫結: - { "bindings": [ { "members": [ "user:owner@example.com" ], "role": "roles/owner" }, { "members": [ "principal" ], "role": "role", "condition": { "title": "title", "description": "description", "expression": "expression" } } ], "etag": "BwWKmjvelug=", "version": 3 }- 替換下列值: - principal:將授予或撤銷特定角色的主體。例如,- user:my-user@example.com。如要查看各主要類型的格式,請參閱「主體 ID」。
- role:您在上一個步驟中選擇的角色。這個角色必須包含所選資源類型的- setIamPolicy權限。
- title:簡要說明情況的字串。例如:- only_pubsub_roles。
- description:選用。條件的額外說明。例如:- Only allows granting/revoking the Pub/Sub editor and publisher roles。
- expression:您在「撰寫條件運算式來限制角色授予作業」中撰寫的運算式。這個運算式會限制主體可授予或撤銷的角色。- 舉例來說,下列條件運算式會限制主體,只能授予及撤銷 Pub/Sub 編輯者 ( - roles/pubsub.editor) 和 Pub/Sub 發布者 (- roles/pubsub.publisher) 角色:- api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])- 警告:請勿在允許的角色清單中加入下列類型的角色: - 
    具有授予及撤銷 IAM 角色權限的角色 (也就是權限名稱結尾為 setIamPolicy的角色)。
- 
    受限 IAM 管理員可修改的自訂角色。舉例來說,如果受限的 IAM 管理員也擁有專案的「角色管理員」角色 (roles/iam.roleAdmin),請勿允許他們授予或撤銷專案層級的自訂角色。
 - 如果有限的 IAM 管理員可以授予及撤銷這類角色,他們就能授予及撤銷所有 IAM 角色。詳情請參閱「撰寫條件運算式,限制角色授予作業」。 
- 
    具有授予及撤銷 IAM 角色權限的角色 (也就是權限名稱結尾為 
 - 最後,請編寫更新後的允許政策: - 針對資源執行 - set-iam-policy指令,設定新的允許政策:- gcloud resource-type set-iam-policy resource-id path - 替換下列值: - resource-type:您要讓主體授予或撤銷角色的資源類型。請使用下列其中一種:- projects、- resource-manager folders或- organizations。
- resource-id:您的 Google Cloud 專案、資料夾或機構 ID。
- path:包含更新後允許政策的檔案路徑。
 - 系統會套用新的允許政策,主體只能修改您允許的角色繫結。 - REST- 首先,請詳閱資源的允許政策: - Resource Manager API 的 - getIamPolicy方法會取得專案、資料夾或機構的允許政策。- 使用任何要求資料之前,請先替換以下項目: - API_VERSION:要使用的 API 版本。如果是專案和機構,請使用- v1。如果是資料夾,請使用- v2。
- RESOURCE_TYPE:要管理的政策所屬資源類型。請使用- projects、- folders或- organizations值。
- RESOURCE_ID:您的 Google Cloud專案、機構或資料夾 ID。專案 ID 為英數字串,例如- my-project。資料夾和機構 ID 為數字,例如- 123456789012。
- POLICY_VERSION:要傳回的政策版本。要求應指定最新政策版本,即政策版本 3。詳情請參閱在取得政策時指定政策版本。
 - HTTP 方法和網址: - POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy - JSON 要求主體: - { "options": { "requestedPolicyVersion": POLICY_VERSION } }- 如要傳送要求,請展開以下其中一個選項: - 回覆會包含資源的允許政策。例如: - { "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/owner", "members": [ "user:my-user@example.com" ] } ] }- 接著,修改允許政策。 - 新增條件角色繫結,讓主體只能授予和撤銷特定角色。請務必將 - version欄位變更為- 3值:- { "version": 3, "etag": "BwWKmjvelug=", "bindings": [ { "members": [ "user:owner@example.com" ], "role": "roles/owner" }, { "members": [ "PRINCIPAL" ], "role": "ROLE", "condition": { "title": "TITLE", "description": "DESCRIPTION", "expression": "EXPRESSION" } } ] }- PRINCIPAL:將授予或撤銷特定角色的主體。例如,- user:my-user@example.com。如要查看各主要類型的格式,請參閱「主體 ID」。
- ROLE:您在上一個步驟中選擇的角色。這個角色必須包含所選資源類型的- setIamPolicy權限。
- TITLE:簡要說明情況的字串。例如:- only_pubsub_roles。
- DESCRIPTION:選用。條件的額外說明。例如:- Only allows granting/revoking the Pub/Sub editor and publisher roles。
- EXPRESSION:您在「撰寫條件運算式來限制角色授予作業」中撰寫的運算式。這個運算式會限制主體可授予或撤銷的角色。- 舉例來說,下列條件運算式會限制主體,只能授予及撤銷 Pub/Sub 編輯者 ( - roles/pubsub.editor) 和 Pub/Sub 發布者 (- roles/pubsub.publisher) 角色:- api.getAttribute('iam.googleapis.com/modifiedGrantsByRole', []).hasOnly(['roles/pubsub.editor', 'roles/pubsub.publisher'])- 警告:請勿在允許的角色清單中加入下列類型的角色: - 
    具有授予及撤銷 IAM 角色權限的角色 (也就是權限名稱結尾為 setIamPolicy的角色)。
- 
    受限 IAM 管理員可修改的自訂角色。舉例來說,如果受限的 IAM 管理員也擁有專案的「角色管理員」角色 (roles/iam.roleAdmin),請勿允許他們授予或撤銷專案層級的自訂角色。
 - 如果有限的 IAM 管理員可以授予及撤銷這類角色,他們就能授予及撤銷所有 IAM 角色。詳情請參閱「撰寫條件運算式,限制角色授予作業」。 
- 
    具有授予及撤銷 IAM 角色權限的角色 (也就是權限名稱結尾為 
 - 最後,請編寫更新後的允許政策: - Resource Manager API 的 - setIamPolicy方法會將要求中的允許政策設為專案、資料夾或機構的新允許政策。- 使用任何要求資料之前,請先替換以下項目: - API_VERSION:要使用的 API 版本。如果是專案和機構,請使用- v1。如果是資料夾,請使用- v2。
- RESOURCE_TYPE:要管理的政策所屬資源類型。請使用- projects、- folders或- organizations值。
- RESOURCE_ID:您的 Google Cloud專案、機構或資料夾 ID。專案 ID 為英數字串,例如- my-project。資料夾和機構 ID 為數字,例如- 123456789012。
- 
    POLICY:要設定的政策 JSON 表示法。如要進一步瞭解政策格式,請參閱政策參考資料。舉例來說,如要設定上一步驟中顯示的政策,請將 POLICY替換為下列內容:{ "version": 3, "etag": "BwWKmjvelug=", "bindings": [ { "members": [ "user:owner@example.com" ], "role": "roles/owner" }, { "members": [ "principal" ], "role": "role", "condition": { "title": "title", "description": "description", "expression": "expression" } } ] } 
 - HTTP 方法和網址: - POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy - JSON 要求主體: - { "policy": POLICY }- 如要傳送要求,請展開以下其中一個選項: - 回應會包含更新後的允許政策。