在大型機構中,讓團隊獨立管理資源的允許政策可能很有幫助。不過,允許主體授予或撤銷所有 IAM 角色,可能會大幅增加安全風險。
您可以使用身分與存取權管理 (IAM) 條件和 iam.googleapis.com/modifiedGrantsByRole
API 屬性,限制主體可授予及撤銷的角色。您可以透過這些限制建立受限的 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頁面。
確認頁面頂端的資源選取器中顯示了專案、資料夾或機構的名稱。資源選取器會指出您目前使用的專案、資料夾或機構。
如果沒有看到資源名稱,請按一下資源選取器,然後選取資源。
在主體清單中,找出要授予和撤銷角色的主體,然後按一下
按鈕。在「編輯權限」面板中,選取先前選擇的角色。然後在「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 }
如要傳送要求,請展開以下其中一個選項:
回應會包含更新後的允許政策。
後續步驟
- 依據角色建議強制執行最低權限原則。
- 瞭解如何使用 IAM 條件設定暫時存取權,以及設定依據資源的存取權。