Поделиться через


Устранение неполадок с ограничениями Azure RBAC

В этой статье описываются некоторые распространенные решения при превышении ограничений в управлении доступом на основе ролей Azure (Azure RBAC).

Prerequisites

Note

Запросы, используемые в этой статье, возвращают только назначения ролей или пользовательские роли, на чтение которых у вас есть разрешения. Например, если у вас есть только разрешения на чтение назначений ролей в области группы ресурсов, назначения ролей на уровне подписки не будут получены.

Симптом — невозможно создать больше назначений ролей

При попытке назначить роль вы получите следующее сообщение об ошибке:

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

Cause

Azure поддерживает до 4000 назначений ролей на подписку. Это ограничение включает назначения ролей в подписке, группе ресурсов и областях ресурсов, но не на уровне группы управления. Соответствующие назначения ролей и назначения ролей, запланированные в будущем, не учитываются в этот лимит. Следует попытаться уменьшить количество назначений ролей в подписке.

Note

Ограничение на назначение ролей в 4000 для каждой подписки является фиксированным и не может быть увеличено.

Чтобы получить количество назначений ролей, можно просмотреть диаграмму на странице управления доступом (IAM) на портале 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. Выберите область и задайте область для запроса.

    Как правило, вы устанавливаете область в Каталог, чтобы делать запросы к арендатору, но вы можете сузить область до конкретных подписок.

    Снимок экрана: обозреватель 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. В строке выберите "Просмотреть сведения" , чтобы открыть панель сведений .

    Снимок экрана: панель сведений, на котором показаны назначения ролей с одной и той же ролью и в одной области, но для разных субъектов.

    Column Description
    RoleDefinitionId Идентификатор назначенной в настоящее время роли.
    Scope Область назначения роли в виде подписки, группы ресурсов или ресурса.
    RoleDefinitionName Имя назначаемой в настоящее время роли.
    count_ Число субъектов, назначенных той же роли и в той же области.
    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. Выберите область и задайте область для запроса.

    Как правило, вы устанавливаете область в Каталог, чтобы делать запросы к арендатору, но вы можете сузить область до конкретных подписок.

    Снимок экрана: обозреватель 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 Explorer, на котором показаны назначения ролей для одной и той же роли и одного и того же субъекта, но на разных уровнях.

    Column Description
    RoleDefinitionId Идентификатор назначенной в настоящее время роли.
    RoleDefinitionName Имя назначаемой в настоящее время роли.
    PrincipalId Идентификатор участника, которому назначена роль.
    count_ Количество различных областей назначения ролей с одной и той же ролью и тем же субъектом.
    Scopes Области назначений ролей с одной и той же ролью и тем же субъектом.
  5. Определите строку, в которой требуется удалить избыточные назначения ролей.

  6. В строке выберите "Просмотреть сведения" , чтобы открыть панель сведений .

    Снимок экрана: панель сведений, на котором показаны назначения ролей для одной роли и одного и того же субъекта, но в разных областях.

  7. Используйте RoleDefinitionId, RoleDefinitionName и PrincipalId , чтобы получить идентификатор роли и субъекта.

  8. Используйте области для получения списка областей для одной роли и одного и того же субъекта.

  9. Определите, какая область требуется для назначения роли. Другие назначения ролей можно удалить.

    При определении того, какие назначения ролей можно удалить, следует следовать рекомендациям по наименьшим привилегиям . Назначение роли на более высоком уровне может предоставлять принципалу больше доступа, чем необходимо. В этом случае необходимо удалить назначение роли с более высоким охватом. Например, пользователю может не потребоваться назначение роли участника виртуальной машины в области подписки, когда назначение роли участника виртуальной машины в более низкой области группы ресурсов предоставляет необходимый доступ.

  10. Получите имя принципала из идентификатора принципала.

  11. Откройте страницу управления доступом (IAM) в рамках области, где находится назначение роли, которое вы хотите удалить.

  12. Выберите вкладку Назначения ролей.

  13. Чтобы отфильтровать назначения ролей, выберите фильтр роли и выберите имя роли.

  14. Найдите субъект.

  15. Выберите и удалите назначение роли. Дополнительные сведения см. в разделе "Удаление назначений ролей Azure".

Решение 3. Замена нескольких встроенных назначений ролей настраиваемым назначением ролей

Чтобы уменьшить количество назначений ролей в подписке, замените несколько встроенных назначений ролей одним пользовательским назначением ролей. Выполните следующие действия, чтобы определить, где могут быть заменены несколько встроенных назначений ролей.

  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/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, в котором показаны назначения ролей с одной и той же областью.

    Column Description
    PrincipalId Идентификатор субъекта, назначаемого встроенными ролями.
    Scope Диапазон для встроенных назначений ролей.
    count_ Количество встроенных назначений ролей с одинаковым основным элементом и одной и той же областью.
    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. Добавление дополнительной подписки

Добавьте дополнительную подписку.

Симптом - Больше нельзя назначать роли на уровне группы управления

Невозможно назначить роль в области группы управлений.

Cause

Azure поддерживает до 500 назначений ролей для каждой группы управления. Это ограничение отличается от ограничения назначений ролей для каждой подписки.

Note

Ограничение на назначение ролей в 500 для каждой группы управления является фиксированным и не может быть увеличено.

Solution

Попробуйте уменьшить количество назначений ролей в группе управления. Возможные варианты см. в разделе "Симптом" — нет дополнительных назначений ролей. Для выполнения запросов получения ресурсов на уровне группы управления необходимо внести следующее изменение в эти запросы.

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)

Cause

Azure поддерживает до 5000 пользовательских ролей в каталоге. (Для Microsoft Azure, управляемой 21Vianet, ограничение составляет 2000 пользовательских ролей.)

Solution

Выполните следующие действия, чтобы найти и удалить неиспользуемые пользовательские роли 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, в котором показаны пользовательские роли без назначений ролей.

    Column Description
    RoleDefinitionId Идентификатор неиспользуемой пользовательской роли.
    RoleDefinitionName Название неиспользуемой пользовательской роли.
    Scope Назначаемые области для неиспользуемой пользовательской роли.
  4. Откройте область (обычно подписка), а затем откройте страницу управления доступом (IAM).

  5. Перейдите на вкладку "Роли ", чтобы просмотреть список всех встроенных и настраиваемых ролей.

  6. В фильтре Тип выберите CustomRole, чтобы видеть только пользовательские роли.

  7. Выберите многоточие (...) для настраиваемой роли, которую вы хотите удалить, и нажмите кнопку "Удалить".

    Снимок экрана: список настраиваемых ролей, которые можно выбрать для удаления.

Дальнейшие шаги