設定角色授予限制

在大型機構中,讓團隊獨立管理資源的允許政策可能很有幫助。不過,允許主體授予或撤銷所有 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

使用條件式角色繫結限制角色授予

如要允許主體僅授予或撤銷特定角色,請使用上一節的條件運算式建立條件角色繫結。接著,將條件角色繫結新增至資源的允許政策。

  1. 選取代表範圍的資源,您要允許主體授予及撤銷該範圍的角色:

    • 如要讓主體授予及撤銷機構內所有資源的特定角色,請選取機構。
    • 如要讓主體授予及撤銷資料夾內所有資源的特定角色,請選取資料夾。
    • 如要允許主體為專案內的所有資源授予及撤銷特定角色,請選取專案。
  2. 選取可讓主體為所選資源類型 (專案、資料夾或機構) 設定允許政策的角色。如要遵循最低權限原則,請選擇下列其中一個預先定義的角色:

    • 專案:專案 IAM 管理員 (roles/resourcemanager.projectIamAdmin)
    • 資料夾:資料夾 IAM 管理員 (roles/resourcemanager.folderIamAdmin)
    • 機構:機構管理員 (roles/resourcemanager.organizationAdmin)。

    或者,選擇包含 resourcemanager.resource-type.setIamPolicyresourcemanager.resource-type.getIamPolicy 權限的自訂角色,其中 resource-typeprojectfolderorganization

  3. 有條件地將所選專案、資料夾或機構的指定角色授予主體。

    系統會套用新的允許政策,且主體只能修改您允許的角色繫結。

    控制台

    1. 前往 Google Cloud 控制台的「IAM」IAM頁面。

      前往「IAM」頁面

    2. 確認頁面頂端的資源選取器中顯示了專案、資料夾或機構的名稱。資源選取器會指出您目前使用的專案、資料夾或機構。

      如果沒有看到資源名稱,請按一下資源選取器,然後選取資源。

    3. 在主體清單中,找出要授予和撤銷角色的主體,然後按一下 按鈕。

    4. 在「編輯權限」面板中,選取先前選擇的角色。然後在「IAM condition (optional)」(IAM 條件 (選用)) 下方,按一下「Add IAM condition」(新增 IAM 條件)

    5. 在「編輯條件」面板中,輸入條件的標題和說明 (選填)。

    6. 按一下「條件編輯器」分頁,然後輸入您在「撰寫條件運算式來限制角色授予」中編寫的運算式。這個運算式會限制主體可授予或撤銷的角色。

      舉例來說,下列條件運算式會限制主體,只能授予和撤銷 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 角色。詳情請參閱「撰寫條件運算式,限制角色授予作業」。

    7. 按一下「儲存」即可套用條件。

    8. 關閉「編輯條件」面板後,按一下「編輯權限」面板中的「儲存」,即可更新允許政策。

    gcloud

    允許政策是使用「讀取 - 修改 - 寫入」模式設定。

    首先,請詳閱資源的允許政策:

    執行 get-iam-policy 指令。這項指令會取得資源目前的允許政策。

    指令:

    gcloud resource-type get-iam-policy resource-id --format=json > path

    替換下列值:

    • resource-type:您要讓主體授予或撤銷角色的資源類型。請使用下列其中一種:projectsresource-manager foldersorganizations
    • 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 角色。詳情請參閱「撰寫條件運算式,限制角色授予作業」。

    最後,請編寫更新後的允許政策:

    針對資源執行 set-iam-policy 指令,設定新的允許政策:

    gcloud resource-type set-iam-policy resource-id path

    替換下列值:

    • resource-type:您要讓主體授予或撤銷角色的資源類型。請使用下列其中一種:projectsresource-manager foldersorganizations
    • resource-id:您的 Google Cloud 專案、資料夾或機構 ID。
    • path:包含更新後允許政策的檔案路徑。

    系統會套用新的允許政策,主體只能修改您允許的角色繫結。

    REST

    允許政策是使用「讀取 - 修改 - 寫入」模式設定。

    首先,請詳閱資源的允許政策:

    Resource Manager API 的 getIamPolicy 方法會取得專案、資料夾或機構的允許政策。

    使用任何要求資料之前,請先替換以下項目:

    • API_VERSION:要使用的 API 版本。如果是專案和機構,請使用 v1。如果是資料夾,請使用 v2
    • RESOURCE_TYPE:您要管理的政策所屬資源類型。請使用 projectsfoldersorganizations 值。
    • 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 角色。詳情請參閱「撰寫條件運算式,限制角色授予作業」。

    最後,請編寫更新後的允許政策:

    Resource Manager API 的 setIamPolicy 方法會將要求中的允許政策設為專案、資料夾或機構的新允許政策。

    使用任何要求資料之前,請先替換以下項目:

    • API_VERSION:要使用的 API 版本。如果是專案和機構,請使用 v1。如果是資料夾,請使用 v2
    • RESOURCE_TYPE:您要管理的政策所屬資源類型。請使用 projectsfoldersorganizations 值。
    • 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
    }
    

    如要傳送要求,請展開以下其中一個選項:

    回應會包含更新後的允許政策。

後續步驟