針對 Azure RBAC 限制進行疑難排解

本文說明當您超過 Azure 角色型存取控制 (Azure RBAC) 的限制時,一些常見的解決方案。

必要條件

注意

本文中使用的查詢只會傳回您有權讀取的角色指派或自定義角色。 例如,如果您只有許可權可讀取資源群組範圍的角色指派,則不會傳回訂用帳戶範圍的角色指派。

徵兆 - 無法建立更多角色指派

當您嘗試指派角色時,會收到下列錯誤訊息:

No more role assignments can be created (code: RoleAssignmentLimitExceeded)

原因

Azure 支援每個訂閱最多 5000 個角色指派。 此限制包括訂用帳戶、資源群組和資源範圍的角色指派,但不包括管理群組範圍的角色指派。 合格的角色指派以及排定在未來的角色指派不計入此限制。 您應該嘗試減少訂用帳戶中的角色指派數目。

注意

每個訂閱的 5000 個角色分配上限是固定的,且無法增加。

若要取得角色指派的數目,您可以在 Azure 入口網站 的訪問控制 (IAM) 頁面上檢視表。 您也可以使用下列 Azure PowerShell 命令:

$scope = "/subscriptions/<subscriptionId>"
$ras = Get-AzRoleAssignment -Scope $scope | Where-Object {$_.scope.StartsWith($scope)}
$ras.Count

解決方案 1 - 以群組型角色指派取代主體型角色指派

若要減少訂用帳戶中的角色指派數目,請將主體(使用者、服務主體和受控識別)新增至群組,並改為將角色指派給群組。 請依照下列步驟,找出可將指派給主體的多個角色指派改為指派給群組的單一角色指派之處。

  1. 登入 Azure 入口網站 並開啟 Azure Resource Graph 總管。

  2. 選取 [範圍] 並設定查詢的範圍。

    您通常會將範圍設為 Directory,以查詢整個租用戶,但也可以將範圍縮小為特定的訂用帳戶。

    顯示 [範圍] 選取的 [Azure 資源圖形總管] 螢幕擷取畫面。

  3. 選取 設定授權範圍,並將授權範圍設為 在、上層和下層,以查詢指定範圍中的所有資源。

    [Azure Resource Graph 總管] 的螢幕擷取畫面,其中顯示 [設定授權範圍] 窗格。

  4. 執行下列查詢,以取得具有相同角色和相同範圍的角色指派,但針對不同的主體。

    此查詢會檢查使用中的角色指派,且不會考慮 Microsoft Entra Privileged Identity Management 中符合資格的角色指派。 若要列出合格的角色指派,您可以使用 Microsoft Entra 系統管理中心、PowerShell 或 REST API。 如需詳細資訊,請參閱 Get-AzRoleEligibilityScheduleInstance 或 角色資格排程實例 - 範圍清單。

    如果您使用 角色指派條件 或 委派具有條件的角色指派管理,則應該使用 [條件] 查詢。 否則,請使用預設查詢。

    authorizationresources
    | where type =~ "microsoft.authorization/roleassignments"
    | where id startswith "/subscriptions"
    | extend RoleId = tolower(tostring(properties.roleDefinitionId))
    | join kind = leftouter (
      authorizationresources
      | where type =~ "microsoft.authorization/roledefinitions"
      | extend RoleDefinitionName = tostring(properties.roleName)
      | extend RoleId = tolower(id)
      | project RoleDefinitionName, RoleId
    ) on $left.RoleId == $right.RoleId
    | extend principalId = tostring(properties.principalId)
    | extend principal_to_ra = pack(principalId, id)
    | summarize count_ = count(), AllPrincipals = make_set(principal_to_ra) by RoleDefinitionId = RoleId, Scope = tolower(properties.scope), RoleDefinitionName
    | where count_ > 1
    | order by count_ desc
    

    以下顯示結果範例。 count_ 資料行表示在相同範圍內被指派相同角色的主體數目。 計數會依遞減順序排序。

    Azure Resource Graph Explorer 的螢幕擷取畫面,顯示具有相同角色且位於相同範圍的角色指派,但其主體身分不同。

  5. 識別您想要將多個角色指派取代為群組單一角色指派的資料列。

  6. 在數據列中,選取 [查看詳細數據] 以開啟 [詳細數據] 窗格。

    [詳細數據] 窗格的螢幕快照,其中顯示具有相同角色和相同範圍的角色指派,但適用於不同的主體。

    欄 描述
    RoleDefinitionId 目前指派角色的標識碼 。
    Scope 角色指派的範圍,可為訂用帳戶、資源群組或資源。
    RoleDefinitionName 目前指派的角色名稱 。
    計數_ 被指派相同角色且位於相同範圍的主體數量。
    AllPrincipals 被指派相同角色且位於相同範圍的主體識別碼清單。
  7. 使用 RoleDefinitionId、 RoleDefinitionName 和 Scope 來取得角色和範圍。

  8. 使用 AllPrincipals 取得具有相同角色指派的主體標識碼清單。

  9. 建立Microsoft Entra 群組。 如需詳細資訊,請參閱管理 Microsoft Entra 群組和群組成員資格。

  10. 將 AllPrincipals 中的主體新增到群組中。

    如需了解如何大量新增主體的相關資訊,請參閱 在 Microsoft Entra ID 中大量新增群組成員。

  11. 將角色指派給您在相同範圍內建立的群組。 如需詳細資訊,請參閱使用 Azure 入口網站指派 Azure 角色。

    現在,您可以尋找並移除以主體為基礎的角色指派。

  12. 從主體識別碼取得主體名稱。

  13. 在與角色指派相同的範圍開啟 存取控制 (IAM) 頁面。

  14. 選取 [角色指派] 索引標籤。

  15. 若要篩選角色指派,請選取 [角色 篩選],然後選取角色名稱。

  16. 找出以主體為基礎的角色指派。

    您也應該會看到以群組為基礎的角色指派。

    [訪問控制 (IAM)] 頁面的螢幕快照,其中顯示具有相同角色和相同範圍的角色指派,但針對不同的主體。

  17. 選取並移除以主體為基礎的角色指派。 如需相關資訊,請參閱移除 Azure 角色指派。

解決方案 2 - 移除備援角色指派

若要減少訂用帳戶中的角色指派數目,請移除備援角色指派。 請遵循下列步驟,找出在較低範圍內多餘的角色指派可於何處移除,因為較高範圍層級的角色指派已授與存取權。

  1. 登入 Azure 入口網站 並開啟 Azure Resource Graph 總管。

  2. 選取 [範圍] 並設定查詢的範圍。

    您通常會將範圍設為 Directory,以查詢整個租用戶,但也可以將範圍縮小為特定的訂用帳戶。

    顯示 [範圍] 選取的 [Azure 資源圖形總管] 螢幕擷取畫面。

  3. 選取 設定授權範圍,並將授權範圍設為 在、上層和下層,以查詢指定範圍中的所有資源。

    [Azure Resource Graph 總管] 的螢幕擷取畫面,其中顯示 [設定授權範圍] 窗格。

  4. 執行下列查詢,以取得角色和主體皆相同、但範圍不同的角色指派。

    此查詢會檢查使用中的角色指派,且不會考慮 Microsoft Entra Privileged Identity Management 中符合資格的角色指派。 若要列出合格的角色指派,您可以使用 Microsoft Entra 系統管理中心、PowerShell 或 REST API。 如需詳細資訊,請參閱 Get-AzRoleEligibilityScheduleInstance 或 角色資格排程實例 - 範圍清單。

    如果您使用 角色指派條件 或 委派具有條件的角色指派管理,則應該使用 [條件] 查詢。 否則,請使用預設查詢。

    authorizationresources
    | where type =~ "microsoft.authorization/roleassignments"
    | where id startswith "/subscriptions"
    | extend RoleDefinitionId = tolower(tostring(properties.roleDefinitionId))
    | extend PrincipalId = tolower(properties.principalId)
    | extend RoleDefinitionId_PrincipalId = strcat(RoleDefinitionId, "_", PrincipalId)
    | join kind = leftouter (
      authorizationresources
      | where type =~ "microsoft.authorization/roledefinitions"
      | extend RoleDefinitionName = tostring(properties.roleName)
      | extend rdId = tolower(id)
      | project RoleDefinitionName, rdId
    ) on $left.RoleDefinitionId == $right.rdId
    | summarize count_ = count(), Scopes = make_set(tolower(properties.scope)) by RoleDefinitionId_PrincipalId,RoleDefinitionName
    | project RoleDefinitionId = split(RoleDefinitionId_PrincipalId, "_", 0)[0], RoleDefinitionName, PrincipalId = split(RoleDefinitionId_PrincipalId, "_", 1)[0], count_, Scopes
    | where count_ > 1
    | order by count_ desc
    

    以下顯示結果範例。 count_數據行是具有相同角色和相同主體之角色指派的不同範圍數目。 計數會依遞減順序排序。

    Azure Resource Graph Explorer 的螢幕擷取畫面,顯示相同角色和相同主體的角色指派,但位於不同的範圍層級。

    欄 描述
    RoleDefinitionId 目前指派角色的標識碼 。
    RoleDefinitionName 目前指派的角色名稱 。
    PrincipalId 獲指派該角色之主體的 ID。
    計數_ 角色和主體皆相同的角色指派所涉及的不同範圍數量。
    範圍 具有相同角色和相同主體的角色指派範圍。
  5. 找出您想要移除多餘角色指派的資料列。

  6. 在數據列中,選取 [查看詳細數據] 以開啟 [詳細數據] 窗格。

    [詳細資料] 窗格的螢幕擷取畫面,顯示針對相同角色和相同主體的角色指派,但位於不同範圍層級。

  7. 使用 RoleDefinitionId、 RoleDefinitionName 和 PrincipalId 來取得角色和主體識別碼。

  8. 使用 範圍 來取得相同角色和相同主體的範圍清單。

  9. 判斷角色指派所需的範圍。 可移除其他角色指派。

    判斷可以移除哪些角色指派時,您應該遵循 最低許可權 的最佳做法。 在較高層級的範圍中進行的角色指派,可能會授予主體超出所需的存取權。 在此情況下,您應移除範疇較高的角色指派。 例如,當較低資源群組範圍的虛擬機參與者角色指派授與所需的存取權時,使用者可能不需要訂用帳戶範圍中的虛擬機參與者角色指派。

  10. 從主體標識碼取得主體名稱。

  11. 在 您要移除的角色指派範圍中,開啟 [存取控制 ][IAM] 頁面。

  12. 選取 [角色指派] 索引標籤。

  13. 若要篩選角色指派,請選取 [角色 篩選],然後選取角色名稱。

  14. 尋找主體。

  15. 選取並移除角色指派。 如需相關資訊,請參閱移除 Azure 角色指派。

解決方案 3 - 以自定義角色指派取代多個內建角色指派

若要減少訂用帳戶中的角色指派數目,請將多個內建角色指派取代為單一自定義角色指派。 請遵循下列步驟來識別可能取代多個內建角色指派的位置。

  1. 登入 Azure 入口網站 並開啟 Azure Resource Graph 總管。

  2. 選取 [範圍] 並設定查詢的範圍。

    您通常會將範圍設為 Directory,以查詢整個租用戶,但也可以將範圍縮小為特定的訂用帳戶。

    顯示 [範圍] 選取的 [Azure 資源圖形總管] 螢幕擷取畫面。

  3. 執行下列查詢,以取得具有相同主體和相同範圍,但具有不同內建角色的角色指派。

    此查詢會檢查使用中的角色指派,且不會考慮 Microsoft Entra Privileged Identity Management 中符合資格的角色指派。 若要列出合格的角色指派,您可以使用 Microsoft Entra 系統管理中心、PowerShell 或 REST API。 如需詳細資訊,請參閱 Get-AzRoleEligibilityScheduleInstance 或 角色資格排程實例 - 範圍清單。

    如果您使用 角色指派條件 或 委派具有條件的角色指派管理,則應該使用 [條件] 查詢。 否則,請使用預設查詢。

    authorizationresources
    | where type =~ "microsoft.authorization/roleassignments"
    | where id startswith "/subscriptions"
    | extend PrincipalId = tostring(properties.principalId) 
    | extend Scope = tolower(properties.scope)
    | extend RoleDefinitionId = tolower(tostring(properties.roleDefinitionId))
    | join kind = leftouter (
      authorizationresources
      | where type =~ "microsoft.authorization/roledefinitions"
      | extend RoleName = tostring(properties.roleName)
      | extend RoleId = tolower(id)
      | extend RoleType = tostring(properties.type) 
      | where RoleType == "BuiltInRole"
      | extend RoleId_RoleName = pack(RoleId, RoleName)
    ) on $left.RoleDefinitionId == $right.RoleId
    | summarize count_ = count(), AllRD = make_set(RoleId_RoleName) by PrincipalId, Scope
    | where count_ > 1
    | order by count_ desc
    

    以下顯示結果範例。 count_ 資料行表示具有相同主體和相同範圍的不同內建角色指派數量。 計數會依遞減順序排序。

    Azure Resource Graph Explorer 的螢幕擷取畫面,其中顯示具有相同主體和相同範圍的角色指派。

    欄 描述
    PrincipalId 被指派內建角色之主體的識別碼。
    Scope 內建角色指派的範圍。
    計數_ 具有相同主體和相同範圍的內建角色指派數目。
    AllRD 內建角色的標識碼和名稱。
  4. 在數據列中,選取 [查看詳細數據] 以開啟 [詳細數據] 窗格。

    顯示詳細資料窗格的螢幕擷取畫面,其中顯示具有相同主體和相同範圍的角色指派。

  5. 使用 AllRD 查看可能合併成自定義角色的內建角色。

  6. 列出內建角色的動作和數據動作。 如需詳細資訊,請參閱 列出 Azure 角色定義 或 Azure 內建角色。

  7. 建立自定義角色,其中包含所有動作和數據動作作為內建角色。 若要更輕鬆地建立自定義角色,您可以從複製其中一個內建角色開始。 如需詳細資訊,請參閱使用 Azure 入口網站 建立或更新 Azure 自定義角色。

  8. 從主體標識碼取得主體名稱。

  9. 在與角色指派相同的範圍內開啟 存取控制 (IAM) 頁面。

  10. 將新的自定義角色指派給主體。 如需詳細資訊,請參閱使用 Azure 入口網站指派 Azure 角色。

    現在您可以移除內建角色指派。

  11. 在相同範圍的存取控制 (IAM)頁面上,選取角色指派索引標籤。

  12. 找出主體和內建角色指派。

  13. 移除該主體的內建角色指派。 如需相關資訊,請參閱移除 Azure 角色指派。

解決方案 4 - 讓角色指派符合資格

若要減少訂用帳戶中的角色指派數目,如果您有 Microsoft Entra ID P2,請在 Microsoft Entra Privileged Identity Management 中將角色指派設為符合資格,而非永久指派。

解決方案 5 - 新增其他訂用帳戶

新增其他訂用帳戶。

徵兆 - 無法再在管理群組範圍建立角色指派

您無法在管理群組範圍內指派角色。

原因

每個管理群組最多 Azure 支援 500 個角色指派。 此限制與每個訂用帳戶的角色指派限制不同。

注意

每個 管理群組的500 個角色指派限制是固定的,而且無法增加。

解決方案

嘗試減少管理群組中的角色指派數目。 如需可能的選項,請參閱 徵兆 - 無法建立更多角色指派。 若要讓查詢擷取管理群組層級的資源,您必須對查詢進行下列變更:

取代

| where id startswith "/subscriptions"

With

| where id startswith "/providers/Microsoft.Management/managementGroups"

徵兆 - 無法建立其他角色定義

當您嘗試建立新的自定義角色時,會收到下列訊息:

Role definition limit exceeded. No more role definitions can be created (code: RoleDefinitionLimitExceeded)

原因

Azure 支援 目錄中最多5000個自定義角色。 (對於由 21Vianet 運作的 Azure Microsoft,限制為 2000 個自定義角色。

解決方案

請遵循下列步驟來尋找和刪除未使用的 Azure 自定義角色。

  1. 登入 Azure 入口網站 並開啟 Azure Resource Graph 總管。

  2. 選取 [範圍 ],並將範圍設定為 查詢的 [目錄 ]。

    顯示 [範圍] 選取的 Azure Resource Graph Explorer 螢幕擷取畫面。

  3. 執行下列查詢以取得沒有任何角色指派的所有自定義角色:

    此查詢會檢查啟用中的角色指派,且不會考量 Microsoft Entra Privileged Identity Management 中符合資格的自訂角色指派。 若要列出合格的自定義角色指派,您可以使用 Microsoft Entra 系統管理中心、PowerShell 或 REST API。 如需詳細資訊,請參閱 Get-AzRoleEligibilityScheduleInstance 或 角色資格排程實例 - 範圍清單。

    authorizationresources
    | where type =~ "microsoft.authorization/roledefinitions"
    | where tolower(properties.type) == "customrole"
    | extend rdId = tolower(id)
    | extend Scope = tolower(properties.assignableScopes)
    | join kind = leftouter (
    authorizationresources
      | where type =~ "microsoft.authorization/roleassignments"
      | extend RoleId = tolower(tostring(properties.roleDefinitionId))
      | summarize RoleAssignmentCount = count() by RoleId
    ) on $left.rdId == $right.RoleId
    | where isempty(RoleAssignmentCount)
    | project RoleDefinitionId = rdId, RoleDefinitionName = tostring(properties.roleName), Scope
    

    下列顯示結果的範例:

    Azure Resource Graph Explorer 的螢幕快照,其中顯示沒有角色指派的自定義角色。

    欄 描述
    RoleDefinitionId 未使用之自定義角色的識別碼。
    RoleDefinitionName 未使用的自定義角色名稱。
    Scope 未使用之自定義角色的可指派範圍 。
  4. 開啟範圍 (通常是訂用帳戶),然後開啟 訪問控制 (IAM) 頁面。

  5. 選取 [角色] 索引標籤以查看所有內建與自訂角色清單。

  6. 在 [ 類型 ] 篩選中,選取 [CustomRole ],只查看您的自定義角色。

  7. 選取您要刪除之自定義角色的省略號 (...),然後選取 [ 刪除]。

    可選取要刪除之自定義角色清單的螢幕快照。

下一步