Solucionar problemas de limites do RBAC do Azure

Este artigo descreve algumas soluções comuns quando você excede os limites no controle de acesso baseado em função do Azure (Azure RBAC).

Pré-requisitos

Nota

As consultas usadas neste artigo retornam apenas atribuições de função ou funções personalizadas que você tem permissões para ler. Por exemplo, se você tiver permissões apenas para ler atribuições de função no escopo do grupo de recursos, as atribuições de função no escopo da assinatura não serão retornadas.

Sintoma - Não é possível criar mais atribuições de função

Quando você tenta atribuir uma função, você recebe a seguinte mensagem de erro:

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

Motivo

O Azure suporta até 4000 atribuições de função por subscrição. Este limite inclui atribuições de funções nos âmbitos de subscrição, grupo de recursos e recursos, mas não no âmbito do grupo de gestão. As atribuições de funções elegíveis e as atribuições de função agendadas no futuro não contam para este limite. Você deve tentar reduzir o número de atribuições de função na assinatura.

Nota

O limite de 4000 atribuições de função por assinatura é fixo e não pode ser aumentado.

Para obter o número de atribuições de funções, pode ver o gráfico na página Controlo de acesso (IAM) do portal do Azure. Também pode utilizar os seguintes comandos do Azure PowerShell:

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

Solução 1 - Substitua atribuições de função baseadas em entidade por atribuições de função baseadas em grupo

Para reduzir o número de atribuições de função na assinatura, adicione entidades (usuários, entidades de serviço e identidades gerenciadas) aos grupos e atribua funções aos grupos. Siga estas etapas para identificar onde várias atribuições de função para entidades de segurança podem ser substituídas por uma única atribuição de função para um grupo.

  1. Entre no portal do Azure e abra o Azure Resource Graph Explorer.

  2. Selecione Escopo e defina o escopo da consulta.

    Normalmente, você define o escopo como Diretório para consultar todo o locatário, mas pode restringir o escopo a assinaturas específicas.

    Captura de ecrã do Azure Resource Graph Explorer que mostra a seleção de Âmbito.

  3. Selecione Definir escopo de autorização e defina o escopo de autorização como At, acima e abaixo para consultar todos os recursos no escopo especificado.

    Captura de ecrã do Azure Resource Graph Explorer que mostra o painel Definir âmbito de autorização.

  4. Execute a consulta a seguir para obter as atribuições de função com a mesma função e no mesmo escopo, mas para entidades diferentes.

    Esta consulta verifica atribuições de função ativas e não considera atribuições de função qualificadas no Microsoft Entra Privileged Identity Management. Para listar atribuições de função qualificadas, você pode usar o centro de administração do Microsoft Entra, o PowerShell ou a API REST. Para obter mais informações, consulte Get-AzRoleEligibilityScheduleInstance ou Instâncias de agendamento de elegibilidade de função - Lista para escopo.

    Se você estiver usando condições de atribuição de função ou delegando o gerenciamento de atribuição de função com condições, deverá usar a consulta Condições. Caso contrário, use a consulta padrão.

    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
    

    Segue-se um exemplo dos resultados. A coluna count_ é o número de entidades a quem foi atribuída a mesma função e ao mesmo âmbito. A contagem é ordenada por ordem decrescente.

    Captura de ecrã do Azure Resource Graph Explorer que mostra atribuições de função com a mesma função e no mesmo âmbito, mas para entidades diferentes.

  5. Identifique uma linha na qual você deseja substituir as várias atribuições de função por uma única atribuição de função para um grupo.

  6. Na linha, selecione Ver detalhes para abrir o painel Detalhes .

    Captura de ecrã do painel Detalhes que mostra atribuições de função com a mesma função e no mesmo âmbito, mas para entidades diferentes.

    Column Description
    RoleDefinitionId ID da função atribuída no momento.
    Âmbito Escopo para a atribuição de função, que será uma assinatura, grupo de recursos ou recurso.
    RoleDefinitionName Nome da função atribuída no momento.
    contagem_ Número de entidades a quem foi atribuída a mesma função e no mesmo âmbito.
    Todos os Princípios Lista de IDs principais atribuídos à mesma função e no mesmo escopo.
  7. Use RoleDefinitionId, RoleDefinitionName e Scope para obter a função e o escopo.

  8. Use AllPrincipals para obter a lista dos IDs principais com a mesma atribuição de função.

  9. Crie um grupo do Microsoft Entra. Para obter mais informações, consulte Gerenciar grupos e associação a grupos do Microsoft Entra.

  10. Adicione os principais de AllPrincipals ao grupo.

    Para obter informações sobre como adicionar entidades em massa, consulte Adicionar membros do grupo em massa no Microsoft Entra ID.

  11. Atribua a função ao grupo criado no mesmo escopo. Para obter mais informações, consulte Atribuir funções do Azure utilizando o portal do Azure.

    Agora você pode localizar e remover as atribuições de função baseadas em principal.

  12. Obtenha os nomes principais das IDs principais.

  13. Abra a página Controle de acesso (IAM) no mesmo escopo das atribuições de função.

  14. Selecione o separador Atribuição de funções.

  15. Para filtrar as atribuições de função, selecione o filtro Função e, em seguida, selecione o nome da função.

  16. Encontre as atribuições de função baseadas em principal.

    Você também deve ver sua atribuição de função baseada em grupo.

    Captura de tela da página Controle de acesso (IAM) que mostra atribuições de função com a mesma função e no mesmo escopo, mas para entidades diferentes.

  17. Selecione e remova as atribuições de função baseadas em principal. Para obter mais informações, veja Remover atribuições de funções do Azure.

Solução 2 - Remover atribuições de função redundantes

Para reduzir o número de atribuições de função na assinatura, remova as atribuições de função redundantes. Siga estas etapas para identificar onde as atribuições de função redundantes em um escopo inferior podem ser potencialmente removidas, uma vez que uma atribuição de função em um escopo mais alto já concede acesso.

  1. Entre no portal do Azure e abra o Azure Resource Graph Explorer.

  2. Selecione Escopo e defina o escopo da consulta.

    Normalmente, você define o escopo como Diretório para consultar todo o locatário, mas pode restringir o escopo a assinaturas específicas.

    Captura de ecrã do Azure Resource Graph Explorer que mostra a seleção de Âmbito.

  3. Selecione Definir escopo de autorização e defina o escopo de autorização como At, acima e abaixo para consultar todos os recursos no escopo especificado.

    Captura de ecrã do Azure Resource Graph Explorer que mostra o painel Definir âmbito de autorização.

  4. Execute a consulta a seguir para obter as atribuições de função com a mesma função e a mesma entidade de segurança, mas em escopos diferentes.

    Esta consulta verifica atribuições de função ativas e não considera atribuições de função qualificadas no Microsoft Entra Privileged Identity Management. Para listar atribuições de função qualificadas, você pode usar o centro de administração do Microsoft Entra, o PowerShell ou a API REST. Para obter mais informações, consulte Get-AzRoleEligibilityScheduleInstance ou Instâncias de agendamento de elegibilidade de função - Lista para escopo.

    Se você estiver usando condições de atribuição de função ou delegando o gerenciamento de atribuição de função com condições, deverá usar a consulta Condições. Caso contrário, use a consulta padrão.

    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
    

    Segue-se um exemplo dos resultados. A coluna count_ é o número de escopos diferentes para atribuições de função com a mesma função e o mesmo principal. A contagem é ordenada por ordem decrescente.

    Captura de ecrã do Azure Resource Graph Explorer que mostra atribuições de função para a mesma função e a mesma entidade de segurança, mas em âmbitos diferentes.

    Column Description
    RoleDefinitionId ID da função atribuída no momento.
    RoleDefinitionName Nome da função atribuída no momento.
    PrincipalId ID da entidade de segurança atribuída à função.
    contagem_ Número de escopos diferentes para atribuições de função com a mesma função e o mesmo principal.
    Âmbitos Escopos para atribuições de função com a mesma função e o mesmo principal.
  5. Identifique uma linha onde você deseja remover atribuições de função redundantes.

  6. Numa linha, selecione Ver detalhes para abrir o painel Detalhes .

    Captura de ecrã do painel Detalhes que mostra atribuições de função para a mesma função e a mesma entidade de segurança, mas em âmbitos diferentes.

  7. Use RoleDefinitionId, RoleDefinitionName e PrincipalId para obter a função e a ID principal.

  8. Use Escopos para obter a lista dos escopos para a mesma função e a mesma entidade de segurança.

  9. Determine qual escopo é necessário para a atribuição de função. As outras atribuições de função podem ser removidas.

    Você deve seguir as práticas recomendadas de menor privilégio ao determinar quais atribuições de função podem ser removidas. A atribuição de função no escopo mais alto pode estar concedendo mais acesso ao principal do que o necessário. Nesse caso, você deve remover a atribuição de função com o escopo mais alto. Por exemplo, um usuário pode não precisar de uma atribuição de função de Colaborador de Máquina Virtual no escopo da assinatura quando uma atribuição de função de Colaborador de Máquina Virtual em um escopo de grupo de recursos inferior conceder o acesso necessário.

  10. Obtenha o nome principal do ID principal.

  11. Abra a página Controle de acesso (IAM) no escopo de uma atribuição de função que você deseja remover.

  12. Selecione o separador Atribuição de funções.

  13. Para filtrar as atribuições de função, selecione o filtro Função e, em seguida, selecione o nome da função.

  14. Encontre o principal.

  15. Selecione e remova a atribuição de função. Para obter mais informações, veja Remover atribuições de funções do Azure.

Solução 3 - Substitua várias atribuições de função internas por uma atribuição de função personalizada

Para reduzir o número de atribuições de função na assinatura, substitua várias atribuições de função internas por uma única atribuição de função personalizada. Siga estas etapas para identificar onde várias atribuições de função internas podem ser substituídas.

  1. Entre no portal do Azure e abra o Azure Resource Graph Explorer.

  2. Selecione Escopo e defina o escopo da consulta.

    Normalmente, você define o escopo como Diretório para consultar todo o locatário, mas pode restringir o escopo a assinaturas específicas.

    Captura de ecrã do Azure Resource Graph Explorer que mostra a seleção de Âmbito.

  3. Execute a consulta a seguir para obter atribuições de função com a mesma entidade principal e o mesmo escopo, mas com funções internas diferentes.

    Esta consulta verifica atribuições de função ativas e não considera atribuições de função qualificadas no Microsoft Entra Privileged Identity Management. Para listar atribuições de função qualificadas, você pode usar o centro de administração do Microsoft Entra, o PowerShell ou a API REST. Para obter mais informações, consulte Get-AzRoleEligibilityScheduleInstance ou Instâncias de agendamento de elegibilidade de função - Lista para escopo.

    Se você estiver usando condições de atribuição de função ou delegando o gerenciamento de atribuição de função com condições, deverá usar a consulta Condições. Caso contrário, use a consulta padrão.

    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
    

    Segue-se um exemplo dos resultados. A coluna count_ é o número de diferentes atribuições de função internas com o mesmo principal e o mesmo escopo. A contagem é ordenada por ordem decrescente.

    Captura de ecrã do Azure Resource Graph Explorer que mostra atribuições de função para com o mesmo principal e o mesmo âmbito.

    Column Description
    PrincipalId ID da entidade de segurança atribuída às funções internas.
    Âmbito Escopo para atribuições de função internas.
    contagem_ Número de atribuições de função internas com o mesmo principal e mesmo escopo.
    AllRD ID e nome das funções internas.
  4. Numa linha, selecione Ver detalhes para abrir o painel Detalhes .

    Captura de ecrã do painel Detalhes que mostra atribuições de função com o mesmo principal e o mesmo âmbito.

  5. Use o AllRD para ver as funções internas que podem ser combinadas em uma função personalizada.

  6. Liste as ações e ações de dados para as funções internas. Para obter mais informações, consulte Listar definições de função do Azure ou funções internas do Azure

  7. Crie uma função personalizada que inclua todas as ações e ações de dados como as funções internas. Para facilitar a criação da função personalizada, você pode começar clonando uma das funções internas. Para obter mais informações, consulte Criar ou atualizar funções personalizadas do Azure usando o portal do Azure.

  8. Obtenha o nome principal do ID principal.

  9. Abra a página Controle de acesso (IAM) no mesmo escopo das atribuições de função.

  10. Atribua a nova função personalizada à entidade de segurança. Para obter mais informações, consulte Atribuir funções do Azure utilizando o portal do Azure.

    Agora você pode remover as atribuições de função internas.

  11. Na página Controle de acesso (IAM) no mesmo escopo, selecione a guia Atribuições de função.

  12. Encontre as atribuições de função principal e internas.

  13. Remova as atribuições de função internas da entidade de segurança. Para obter mais informações, veja Remover atribuições de funções do Azure.

Solução 4 - Tornar as atribuições de função elegíveis

Para reduzir o número de atribuições de função na assinatura e você tiver o Microsoft Entra ID P2, torne as atribuições de função qualificadas no Microsoft Entra Privileged Identity Management em vez de atribuídas permanentemente.

Solução 5 - Adicionar uma subscrição adicional

Adicione uma subscrição adicional.

Sintoma - Não é possível criar mais atribuições de função no escopo do grupo de gerenciamento

Não é possível atribuir uma função no escopo do grupo de gerenciamento.

Motivo

O Azure suporta até 500 atribuições de função por grupo de gestão. Este limite é diferente do limite de atribuições de funções por subscrição.

Nota

O limite de 500 atribuições de funções por grupo de gerenciamento é fixo e não pode ser aumentado.

Solução

Tente reduzir o número de atribuições de função no grupo de gerenciamento. Para obter opções possíveis, consulte Sintoma - Não é possível criar mais atribuições de função. Para que as consultas recuperem recursos no nível do grupo de gerenciamento, você precisará fazer a seguinte alteração nas consultas:

Replace

| where id startswith "/subscriptions"

With

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

Sintoma - Não é possível criar mais definições de função

Quando você tenta criar uma nova função personalizada, você recebe a seguinte mensagem:

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

Motivo

O Azure suporta até 5000 funções personalizadas num diretório. (Para o Microsoft Azure operado pela 21Vianet, o limite é de 2000 funções personalizadas.)

Solução

Siga estas etapas para localizar e excluir funções personalizadas do Azure não utilizadas.

  1. Entre no portal do Azure e abra o Azure Resource Graph Explorer.

  2. Selecione Escopo e defina o escopo como Diretório para a consulta.

    Captura de ecrã do Azure Resource Graph Explorer que mostra a seleção de Âmbito.

  3. Execute a seguinte consulta para obter todas as funções personalizadas que não têm atribuições de função:

    Esta consulta verifica atribuições de função ativas e não considera atribuições de função personalizadas qualificadas no Microsoft Entra Privileged Identity Management. Para listar atribuições de função personalizadas qualificadas, você pode usar o Centro de administração do Microsoft Entra, o PowerShell ou a API REST. Para obter mais informações, consulte Get-AzRoleEligibilityScheduleInstance ou Instâncias de agendamento de elegibilidade de função - Lista para escopo.

    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
    

    Segue-se um exemplo dos resultados:

    Captura de ecrã do Azure Resource Graph Explorer que mostra funções personalizadas sem atribuições de função.

    Column Description
    RoleDefinitionId ID da função personalizada não utilizada.
    RoleDefinitionName Nome da função personalizada não utilizada.
    Âmbito Escopos atribuíveis para a função personalizada não utilizada.
  4. Abra o escopo (normalmente assinatura) e, em seguida, abra a página Controle de acesso (IAM).

  5. Selecione o separador Funções para ver uma lista de todas as funções incorporadas e personalizadas.

  6. No filtro Tipo, selecione CustomRole para ver apenas suas funções personalizadas.

  7. Selecione as reticências (...) para a função personalizada que pretende eliminar e, em seguida, selecione Eliminar.

    Captura de tela de uma lista de funções personalizadas que podem ser selecionadas para exclusão.

Próximos passos