分享方式:


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

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

必要條件

注意

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

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

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

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

原因

每個訂用帳戶最多 Azure 支援 4000 個角色指派。 此限制包括訂用帳戶、資源群組和資源範圍的角色指派,但不包括管理群組範圍的角色指派。 您應該嘗試減少訂用帳戶中的角色指派數目。

注意

每個訂用帳戶的 4000 個角色指派限制是固定的,而且無法增加。

若要取得角色指派的數目,您可以在 Azure 入口網站 的 [訪問控制] 頁面檢視表。 您也可以使用下列 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 Resource Graph 總管螢幕快照。

  3. 選取 [設定授權範圍 ],並將授權範圍設定為 [At],在上方和下方 查詢指定範圍的所有資源。

    顯示 [設定授權範圍] 窗格的 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 總管的螢幕快照,其中顯示具有相同角色和相同範圍的角色指派,但針對不同的主體。

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

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

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

    資料行 描述
    RoleDefinitionId 目前指派角色的標識碼
    範圍 角色指派的範圍,也就是訂用帳戶、資源群組或資源。
    RoleDefinitionName 目前指派的角色名稱
    計數_ 指派相同角色和相同範圍的主體數目。
    AllPrincipals 指派相同角色和相同範圍的主體標識符清單。
  7. 使用 RoleDefinitionIdRoleDefinitionNameScope 來取得角色和範圍。

  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 Resource Graph 總管螢幕快照。

  3. 選取 [設定授權範圍 ],並將授權範圍設定為 [At],在上方和下方 查詢指定範圍的所有資源。

    顯示 [設定授權範圍] 窗格的 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 總管的螢幕快照,其中顯示相同角色和相同主體的角色指派,但位於不同範圍。

    資料行 描述
    RoleDefinitionId 目前指派角色的標識碼
    RoleDefinitionName 目前指派的角色名稱
    PrincipalId 指派角色之主體的標識碼。
    計數_ 具有相同角色和相同主體之角色指派的不同範圍數目。
    範圍 具有相同角色和相同主體的角色指派範圍。
  5. 識別您想要移除備援角色指派的數據列。

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

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

  7. 使用 RoleDefinitionIdRoleDefinitionNamePrincipalId 來取得角色和主體識別碼。

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

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

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

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

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

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

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

  14. 尋找主體。

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

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

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

  1. 登入 Azure 入口網站,然後開啟 Azure Resource Graph 總管。

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

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

    顯示 [範圍] 選取範圍的 Azure Resource Graph 總管螢幕快照。

  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 總管的螢幕快照,其中顯示具有相同主體和相同範圍的角色指派。

    資料行 描述
    PrincipalId 指派內建角色之主體的標識碼。
    範圍 內建角色指派的範圍。
    計數_ 具有相同主體和相同範圍的內建角色指派數目。
    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 個角色指派限制是固定的,而且無法增加。

解決方案

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

Replace

| 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 運作的 Microsoft Azure,限制為 2000 個自定義角色。

解決方案

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

  1. 登入 Azure 入口網站,然後開啟 Azure Resource Graph 總管。

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

    顯示 [範圍] 選取範圍的 Azure Resource Graph 總管螢幕快照。

  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 未使用的自定義角色名稱。
    範圍 未使用之自定義角色的可指派範圍
  4. 開啟範圍 (通常是訂用帳戶),然後開啟 訪問控制 (IAM) 頁面。

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

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

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

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

下一步