針對 Azure RBAC 限制進行疑難排解
本文說明當您超過 Azure 角色型存取控制 (Azure RBAC) 的限制時,一些常見的解決方案。
必要條件
- 讀取者 角色以執行 Azure Resource Graph 查詢。
- 角色型 存取控制 系統管理員角色,以新增或移除角色指派。
- 使用者存取系統管理員 角色可新增角色指派、移除角色指派或刪除自定義角色。
- 群組系統管理員 或 用戶系統管理員 角色以建立群組。
注意
本文中使用的查詢只會傳回您有權讀取的角色指派或自定義角色。 例如,如果您只有許可權可讀取資源群組範圍的角色指派,則不會傳回訂用帳戶範圍的角色指派。
徵兆 - 無法建立更多角色指派
當您嘗試指派角色時,會收到下列錯誤訊息:
No more role assignments can be created (code: RoleAssignmentLimitExceeded)
原因
每個訂用帳戶最多 Azure 支援 4000 個角色指派。 此限制包括訂用帳戶、資源群組和資源範圍的角色指派,但不包括管理群組範圍的角色指派。 合格的角色指派以及排定在未來的角色指派不計入此限制。 您應該嘗試減少訂用帳戶中的角色指派數目。
注意
每個訂用帳戶的 4000 個角色指派限制是固定的,而且無法增加。
若要取得角色指派的數目,您可以在 Azure 入口網站 的 [訪問控制 ][IAM] 頁面上檢視表。 您也可以使用下列 Azure PowerShell 命令:
$scope = "/subscriptions/<subscriptionId>"
$ras = Get-AzRoleAssignment -Scope $scope | Where-Object {$_.scope.StartsWith($scope)}
$ras.Count
解決方案 1 - 以群組型角色指派取代主體型角色指派
若要減少訂用帳戶中的角色指派數目,請將主體(使用者、服務主體和受控識別)新增至群組,並改為將角色指派給群組。 請遵循下列步驟來識別主體的多個角色指派可以取代為群組的單一角色指派。
登入 Azure 入口網站,然後開啟 Azure Resource Graph 總管。
選取 [範圍] 並設定查詢的範圍。
您通常會將範圍設定為 Directory 來查詢整個租使用者,但您可以將範圍縮小至特定訂用帳戶。
選取 [設定授權範圍],並將授權範圍設定為 [符合、高於和低於] 以查詢在指定範圍的所有資源。
執行下列查詢,以取得具有相同角色和相同範圍的角色指派,但針對不同的主體。
此查詢會檢查作用中角色指派,而且不會考慮 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_數據行是指派相同角色和相同範圍的主體數目。 計數會依遞減順序排序。
識別您想要將多個角色指派取代為群組單一角色指派的數據列。
在數據列中,選取 [查看詳細數據] 以開啟 [詳細數據] 窗格。
資料行 描述 RoleDefinitionId 目前指派角色的標識碼 。 範圍 角色指派的範圍,也就是訂用帳戶、資源群組或資源。 RoleDefinitionName 目前指派的角色名稱 。 計數_ 指派相同角色和相同範圍的主體數目。 AllPrincipals 指派相同角色和相同範圍的主體標識符清單。 使用 RoleDefinitionId、 RoleDefinitionName 和 Scope 來取得角色和範圍。
使用 AllPrincipals 取得具有相同角色指派的主體標識碼清單。
建立Microsoft Entra 群組。 如需詳細資訊,請參閱管理 Microsoft Entra 群組和群組成員資格。
將 AllPrincipals 中的主體新增至群組。
如需如何大量新增主體的資訊,請參閱 在 entra 標識符Microsoft大量新增群組成員。
將角色指派給您在相同範圍中建立的群組。 如需詳細資訊,請參閱使用 Azure 入口網站指派 Azure 角色。
現在,您可以找到並移除主體型角色指派。
從主體標識碼取得主體名稱。
- 若要使用 Azure 入口網站,請參閱新增或更新使用者的配置檔資訊和設定。
- 若要使用PowerShell,請參閱 Get-MgUser。
- 若要使用 Azure,CLI,請參閱 az ad user show。
在與 角色指派相同的範圍內開啟 [訪問控制][IAM] 頁面。
選取 [角色指派] 索引標籤。
若要篩選角色指派,請選取 [角色 篩選],然後選取角色名稱。
尋找主體型角色指派。
您也應該會看到以群組為基礎的角色指派。
選取並移除主體型角色指派。 如需相關資訊,請參閱移除 Azure 角色指派。
解決方案 2 - 移除備援角色指派
若要減少訂用帳戶中的角色指派數目,請移除備援角色指派。 請遵循下列步驟來識別可能會移除較低範圍中備援角色指派的位置,因為較高範圍的角色指派已經授與存取權。
登入 Azure 入口網站,然後開啟 Azure Resource Graph 總管。
選取 [範圍] 並設定查詢的範圍。
您通常會將範圍設定為 Directory 來查詢整個租使用者,但您可以將範圍縮小至特定訂用帳戶。
選取 [設定授權範圍],並將授權範圍設定為 [符合、高於和低於] 以查詢在指定範圍的所有資源。
執行下列查詢,以取得具有相同角色和相同主體的角色指派,但在不同的範圍。
此查詢會檢查作用中角色指派,而且不會考慮 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_數據行是具有相同角色和相同主體之角色指派的不同範圍數目。 計數會依遞減順序排序。
資料行 描述 RoleDefinitionId 目前指派角色的標識碼 。 RoleDefinitionName 目前指派的角色名稱 。 PrincipalId 指派角色之主體的標識碼。 計數_ 具有相同角色和相同主體之角色指派的不同範圍數目。 範圍 具有相同角色和相同主體的角色指派範圍。 識別您想要移除備援角色指派的數據列。
在數據列中,選取 [查看詳細數據] 以開啟 [詳細數據] 窗格。
使用 RoleDefinitionId、 RoleDefinitionName 和 PrincipalId 來取得角色和主體識別碼。
使用 範圍 來取得相同角色和相同主體的範圍清單。
判斷角色指派所需的範圍。 可以移除其他角色指派。
判斷可以移除哪些角色指派時,您應該遵循 最低許可權 的最佳做法。 較高範圍的角色指派可能會授與主體的存取權,而不是所需的存取權。 在此情況下,您應該移除具有較高範圍的角色指派。 例如,當較低資源群組範圍的虛擬機參與者角色指派授與所需的存取權時,使用者可能不需要訂用帳戶範圍中的虛擬機參與者角色指派。
從主體標識碼取得主體名稱。
- 若要使用 Azure 入口網站,請參閱新增或更新使用者的配置檔資訊和設定。
- 若要使用PowerShell,請參閱 Get-MgUser。
- 若要使用 Azure,CLI,請參閱 az ad user show。
在 您要移除的角色指派範圍中,開啟 [存取控制 ][IAM] 頁面。
選取 [角色指派] 索引標籤。
若要篩選角色指派,請選取 [角色 篩選],然後選取角色名稱。
尋找主體。
選取並移除角色指派。 如需相關資訊,請參閱移除 Azure 角色指派。
解決方案 3 - 以自定義角色指派取代多個內建角色指派
若要減少訂用帳戶中的角色指派數目,請將多個內建角色指派取代為單一自定義角色指派。 請遵循下列步驟來識別可能取代多個內建角色指派的位置。
登入 Azure 入口網站,然後開啟 Azure Resource Graph 總管。
選取 [範圍] 並設定查詢的範圍。
您通常會將範圍設定為 Directory 來查詢整個租使用者,但您可以將範圍縮小至特定訂用帳戶。
執行下列查詢,以取得具有相同主體和相同範圍,但具有不同內建角色的角色指派。
此查詢會檢查作用中角色指派,而且不會考慮 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_數據行是具有相同主體和相同範圍的不同內建角色指派數目。 計數會依遞減順序排序。
資料行 描述 PrincipalId 指派內建角色之主體的標識碼。 範圍 內建角色指派的範圍。 計數_ 具有相同主體和相同範圍的內建角色指派數目。 AllRD 內建角色的標識碼和名稱。 在數據列中,選取 [查看詳細數據] 以開啟 [詳細數據] 窗格。
使用 AllRD 查看可能合併成自定義角色的內建角色。
列出內建角色的動作和數據動作。 如需詳細資訊,請參閱 列出 Azure 角色定義 或 Azure 內建角色
建立自定義角色,其中包含所有動作和數據動作作為內建角色。 若要更輕鬆地建立自定義角色,您可以從複製其中一個內建角色開始。 如需詳細資訊,請參閱使用 Azure 入口網站 建立或更新 Azure 自定義角色。
從主體標識碼取得主體名稱。
- 若要使用 Azure 入口網站,請參閱新增或更新使用者的配置檔資訊和設定。
- 若要使用PowerShell,請參閱 Get-MgUser。
- 若要使用 Azure,CLI,請參閱 az ad user show。
在與 角色指派相同的範圍內開啟 [訪問控制][IAM] 頁面。
將新的自定義角色指派給主體。 如需詳細資訊,請參閱使用 Azure 入口網站指派 Azure 角色。
現在您可以移除內建角色指派。
在相同範圍的 [ 存取控制 (IAM)] 頁面上,選取 [ 角色指派] 索引卷標 。
尋找主體和內建角色指派。
從主體移除內建角色指派。 如需相關資訊,請參閱移除 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 運作的 Azure Microsoft,限制為 2000 個自定義角色。
解決方案
請遵循下列步驟來尋找和刪除未使用的 Azure 自定義角色。
登入 Azure 入口網站,然後開啟 Azure Resource Graph 總管。
選取 [範圍 ],並將範圍設定為 查詢的 [目錄 ]。
執行下列查詢以取得沒有任何角色指派的所有自定義角色:
此查詢會檢查作用中角色指派,而且不會在 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
下列顯示結果的範例:
資料行 描述 RoleDefinitionId 未使用之自定義角色的識別碼。 RoleDefinitionName 未使用的自定義角色名稱。 範圍 未使用之自定義角色的可指派範圍 。 開啟範圍 (通常是訂用帳戶),然後開啟 訪問控制 (IAM) 頁面。
選取 [角色] 索引標籤以查看所有內建與自訂角色清單。
在 [ 類型 ] 篩選中,選取 [CustomRole ],只查看您的自定義角色。
選取您要刪除之自定義角色的省略號 (...),然後選取 [ 刪除]。