Azure RBAC 한도 문제 해결
이 문서에서는 Azure RBAC(Azure 역할 기반 액세스 제어)의 한도를 초과하는 경우의 몇 가지 일반적인 솔루션에 대해 설명합니다.
필수 조건
- Azure Resource Graph 쿼리를 실행하는 읽기 권한자 역할.
- 역할 할당을 추가하거나 제거하는 역할 기반 액세스 제어 관리자 역할.
- 역할 할당을 추가하거나, 역할 할당을 제거하거나, 사용자 지정 역할을 삭제하는 사용자 액세스 관리자 역할.
- 그룹을 만드는 그룹 관리자 또는 사용자 관리자 역할.
참고 항목
이 문서에 사용된 쿼리는 읽을 수 있는 권한이 있는 역할 할당 또는 사용자 지정 역할만 반환합니다. 예를 들어 리소스 그룹 범위에서 역할 할당을 읽을 수 있는 권한만 있는 경우 구독 범위의 역할 할당은 반환되지 않습니다.
증상 - 더 이상의 역할 할당을 만들 수 없음
역할을 할당하려고 하면 다음 오류 메시지가 표시됩니다.
No more role assignments can be created (code: RoleAssignmentLimitExceeded)
원인
Azure는 구독당 최대 4000개의 역할 할당을 지원합니다. 이 제한에는 구독, 리소스 그룹 및 리소스 범위의 역할 할당이 포함되지만 관리 그룹 범위는 포함되지 않습니다. 적격 역할 할당과 향후 예약된 역할 할당은 이 제한에 포함되지 않습니다. 구독에서 역할 할당 수를 줄여야 합니다.
참고 항목
역할 할당 한도는 구독당 4000개로 고정되어 있고 늘릴 수 없습니다.
역할 할당 수를 얻으려면 Azure Portal의 IAM(액세스 제어) 페이지의 차트를 참고할 수 있습니다. 다음 Azure PowerShell 명령을 사용할 수도 있습니다.
$scope = "/subscriptions/<subscriptionId>"
$ras = Get-AzRoleAssignment -Scope $scope | Where-Object {$_.scope.StartsWith($scope)}
$ras.Count
솔루션 1 - 주체 기반 역할 할당을 그룹 기반 역할 할당으로 바꾸기
구독에서 역할 할당 수를 줄이려면 그룹에 보안 주체(사용자, 서비스 주체 및 관리 ID)를 추가하고 대신 그룹에 역할을 할당합니다. 보안 주체에 대한 여러 역할 할당을 그룹에 대한 단일 역할 할당으로 바꿀 수 있는 위치를 식별하려면 다음 단계를 따릅니다.
Azure Portal에 로그인하고 Azure Resource Graph Explorer를 엽니다.
범위를 선택하고 쿼리의 범위를 설정합니다.
일반적으로 범위를 디렉터리로 설정하여 전체 테넌트를 쿼리하지만, 특정 구독으로 범위를 좁힐 수 있습니다.
권한 부여 범위를 선택하고 권한 부여 범위를 동일, 위, 아래로 설정하여 지정된 범위의 모든 리소스를 쿼리합니다.
다음 쿼리를 실행하여 동일한 역할과 동일한 범위에서 다른 보안 주체에 대한 역할 할당을 가져옵니다.
이 쿼리는 활성 역할 할당을 확인하고 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 현재 할당된 역할의 ID입니다. 범위 구독, 리소스 그룹 또는 리소스가 될 역할 할당의 범위입니다. RoleDefinitionName 현재 할당된 역할의 이름입니다. count_ 동일한 역할과 동일한 범위에 할당된 보안 주체 수입니다. AllPrincipals 동일한 역할과 동일한 범위에 할당된 보안 주체 ID 목록입니다. RoleDefinitionId, RoleDefinitionName 및 Scope를 사용하여 역할 및 범위를 가져옵니다.
AllPrincipals를 사용하여 동일한 역할 할당이 있는 보안 주체 ID 목록을 가져옵니다.
Microsoft Entra 그룹을 만듭니다. 자세한 내용은 Microsoft Entra 그룹 및 그룹 멤버 자격 관리를 참조하세요.
AllPrincipals의 보안 주체를 그룹에 추가합니다.
보안 주체를 대량으로 추가하는 방법에 대한 자세한 내용은 Microsoft Entra ID에서 그룹 멤버 추가를 참조하세요.
동일한 범위에서 만든 그룹에 역할을 할당합니다. 자세한 내용은 Azure Portal을 사용하여 Azure 역할 할당을 참조하십시오.
이제 보안 주체 기반 역할 할당을 찾아서 제거할 수 있습니다.
보안 주체 ID에서 보안 주체 이름을 가져옵니다.
- Azure Portal을 사용하려면 사용자 프로필 정보 및 설정 추가 또는 업데이트를 참조하세요.
- PowerShell을 사용하려면 Get-MgUser를 참조하세요.
- Azure, CLI를 사용하려면 az ad user show를 참조하세요.
역할 할당과 동일한 범위에서 액세스 제어(IAM) 페이지를 엽니다.
역할 할당 탭을 선택합니다.
역할 할당을 필터링하려면 역할 필터를 선택한 다음 역할 이름을 선택합니다.
보안 주체 기반 역할 할당을 찾습니다.
그룹 기반 역할 할당도 표시됩니다.
보안 주체 기반 역할 할당을 선택하고 제거합니다. 자세한 내용은 Azure 역할 할당 제거를 참조하세요.
솔루션 2 - 중복 역할 할당 제거
구독의 역할 할당 수를 줄이려면 중복 역할 할당을 제거합니다. 더 높은 범위의 역할 할당이 이미 액세스 권한을 부여하므로 하위 범위에서 중복 역할 할당을 잠재적으로 제거할 수 있는 위치를 식별하려면 다음 단계를 따릅니다.
Azure Portal에 로그인하고 Azure Resource Graph Explorer를 엽니다.
범위를 선택하고 쿼리의 범위를 설정합니다.
일반적으로 범위를 디렉터리로 설정하여 전체 테넌트를 쿼리하지만, 특정 구독으로 범위를 좁힐 수 있습니다.
권한 부여 범위를 선택하고 권한 부여 범위를 동일, 위, 아래로 설정하여 지정된 범위의 모든 리소스를 쿼리합니다.
다음 쿼리를 실행하여 동일한 역할과 동일한 범위에서 다른 보안 주체에 대한 역할 할당을 가져옵니다.
이 쿼리는 활성 역할 할당을 확인하고 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 현재 할당된 역할의 ID입니다. RoleDefinitionName 현재 할당된 역할의 이름입니다. PrincipalId 역할이 할당된 보안 주체의 ID입니다. count_ 역할과 보안 주체가 동일한 역할 할당에 대한 다양한 범위의 수입니다. 범위 역할과 보안 주체가 동일한 역할 할당의 범위입니다. 중복 역할 할당을 제거할 행을 식별합니다.
행에서 세부 정보 보기를 선택하여 세부 정보 창을 엽니다.
RoleDefinitionId, RoleDefinitionName 및 PrincipalId를 사용하여 역할 및 보안 주체 ID를 가져옵니다.
Scopes를 사용하여 동일한 역할 및 동일한 보안 주체에 대한 범위 목록을 가져옵니다.
역할 할당에 필요한 범위를 결정합니다. 다른 역할 할당을 제거할 수 있습니다.
제거할 수 있는 역할 할당을 결정할 때 최소 권한의 모범 사례를 따라야 합니다. 더 높은 범위의 역할 할당은 필요한 것보다 더 많은 액세스 권한을 보안 주체에 부여할 수 있습니다. 이 경우 더 높은 범위의 역할 할당을 제거해야 합니다. 예를 들어 하위 리소스 그룹 범위에서 Virtual Machine 기여자 역할 할당이 필요한 액세스 권한을 부여하는 경우 구독 범위에서 Virtual Machine 기여자 역할 할당이 필요하지 않을 수 있습니다.
보안 주체 ID에서 보안 주체 이름을 가져옵니다.
- Azure Portal을 사용하려면 사용자 프로필 정보 및 설정 추가 또는 업데이트를 참조하세요.
- PowerShell을 사용하려면 Get-MgUser를 참조하세요.
- Azure, CLI를 사용하려면 az ad user show를 참조하세요.
제거하려는 역할 할당의 범위에서 액세스 제어(IAM) 페이지를 엽니다.
역할 할당 탭을 선택합니다.
역할 할당을 필터링하려면 역할 필터를 선택한 다음 역할 이름을 선택합니다.
보안 주체를 찾습니다.
역할 할당을 선택하고 제거합니다. 자세한 내용은 Azure 역할 할당 제거를 참조하세요.
솔루션 3 - 여러 기본 제공 역할 할당을 사용자 지정 역할 할당으로 바꾸기
구독에서 역할 할당 수를 줄이려면 여러 기본 제공 역할 할당을 단일 사용자 지정 역할 할당으로 바꿉니다. 여러 기본 제공 역할 할당을 대체할 수 있는 위치를 식별하려면 다음 단계를 따릅니다.
Azure Portal에 로그인하고 Azure Resource Graph Explorer를 엽니다.
범위를 선택하고 쿼리의 범위를 설정합니다.
일반적으로 범위를 디렉터리로 설정하여 전체 테넌트를 쿼리하지만, 특정 구독으로 범위를 좁힐 수 있습니다.
다음 쿼리를 실행하여 보안 주체와 범위는 같지만 기본 제공 역할은 다른 역할 할당을 가져옵니다.
이 쿼리는 활성 역할 할당을 확인하고 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 기본 제공 역할이 할당된 보안 주체의 ID입니다. 범위 기본 제공 역할 할당에 대한 범위입니다. count_ 동일한 보안 주체와 동일한 범위를 가진 기본 제공 역할 할당 수입니다. AllRD 기본 제공 역할의 ID 및 이름입니다. 행에서 세부 정보 보기를 선택하여 세부 정보 창을 엽니다.
AllRD를 사용하여 사용자 지정 역할로 결합될 수 있는 기본 제공 역할을 확인합니다.
기본 제공 역할에 대한 작업 및 데이터 작업을 나열합니다. 자세한 내용은 Azure 역할 정의 나열 또는 Azure 기본 제공 역할을 참조하세요.
모든 작업 및 데이터 작업을 기본 제공 역할로 포함하는 사용자 지정 역할을 만듭니다. 사용자 지정 역할을 더 쉽게 만들 수 있도록 기본 제공 역할 중 하나를 복제하여 시작할 수 있습니다. 자세한 내용은 Azure Portal을 사용하여 사용자 지정 역할 만들기 또는 업데이트를 참조하세요.
보안 주체 ID에서 보안 주체 이름을 가져옵니다.
- Azure Portal을 사용하려면 사용자 프로필 정보 및 설정 추가 또는 업데이트를 참조하세요.
- PowerShell을 사용하려면 Get-MgUser를 참조하세요.
- Azure, CLI를 사용하려면 az ad user show를 참조하세요.
역할 할당과 동일한 범위에서 액세스 제어(IAM) 페이지를 엽니다.
보안 주체에 새 사용자 지정 역할을 할당합니다. 자세한 내용은 Azure Portal을 사용하여 Azure 역할 할당을 참조하십시오.
이제 기본 제공 역할 할당을 제거할 수 있습니다.
동일한 범위의 액세스 제어(IAM) 페이지에서 역할 할당 탭을 선택합니다.
보안 주체 및 기본 제공 역할 할당을 찾습니다.
보안 주체에서 기본 제공 역할 할당을 제거합니다. 자세한 내용은 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에서 운영하는 Microsoft Azure의 경우 한도는 사용자 지정 역할 2000개입니다.)
솔루션
다음 단계를 따라 사용되지 않는 Azure 사용자 지정 역할을 찾아 삭제합니다.
Azure Portal에 로그인하고 Azure Resource Graph Explorer를 엽니다.
범위를 선택하고 범위를 쿼리에 대한 디렉터리로 설정합니다.
다음 쿼리를 실행하여 역할 할당이 없는 모든 사용자 지정 역할을 가져옵니다.
이 쿼리는 활성 역할 할당을 확인하고 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 사용되지 않는 사용자 지정 역할의 ID입니다. RoleDefinitionName 사용되지 않는 사용자 지정 역할의 이름입니다. 범위 사용되지 않는 사용자 지정 역할에 대한 할당 가능한 범위입니다. 범위(일반적으로 구독)를 연 다음 액세스 제어(IAM) 페이지를 엽니다.
역할 탭을 선택하여 모든 기본 제공 역할 및 사용자 지정 역할 목록을 봅니다.
형식 필터에서 CustomRole을 선택하여 사용자 지정 역할을 확인합니다.
삭제하려는 사용자 지정 역할에 대한 줄임표(...)를 선택한 다음 삭제를 선택합니다.