Solucionar problemas de limites de RBAC do Azure
Esse artigo descreve algumas soluções comuns quando você excede os limites do controle de acesso baseado em função do Azure (Azure RBAC).
Pré-requisitos
- Função de leitor para executar consultas do Azure Resource Graph.
- Administrador de Serviço de Controle de Acesso do Microsoft Azure AD baseado em função função para adicionar ou remover atribuições de função.
- Função Administrador de acesso de usuário para adicionar atribuições de função, remover atribuições de função ou excluir funções personalizadas.
- Função Administrador de grupos ou Administrador de usuários para criar grupos.
Observação
As consultas usadas neste artigo retornam apenas atribuições de funções ou funções personalizadas que você tem permissão para ler. Por exemplo, se só tiver permissões para ler atribuições de funções no âmbito do grupo de recursos, as atribuições de funções no âmbito da subscrição não serão devolvidas.
Sintoma – não podem ser criadas mais atribuições da função
Ao tentar atribuir uma função, você recebe a seguinte mensagem de erro:
No more role assignments can be created (code: RoleAssignmentLimitExceeded)
Causa
O Azure dá suporte a até 4 mil atribuições de função por assinatura. Esse limite inclui atribuições de função nos escopos de assinatura, de grupo de recursos e de recursos, mas não no escopo do grupo de gerenciamento. Você deve tentar reduzir o número de atribuições de funções na assinatura.
Observação
O limite de 4.000 atribuições de função por assinatura é fixo e não pode ser aumentado.
Para obter o número de atribuições de função, você pode ver o gráfico na página IAM (controle de acesso) no portal do Azure. Você também pode usar os seguintes comandos do Azure PowerShell:
$scope = "/subscriptions/<subscriptionId>"
$ras = Get-AzRoleAssignment -Scope $scope | Where-Object {$_.scope.StartsWith($scope)}
$ras.Count
Solução 1 – Substituir atribuições de funções baseadas em entidade por atribuições de funções baseadas em grupo
Para reduzir o número de atribuições de funções na subscrição, adicione entidades (utilizadores, entidades de serviço e identidades geridas) a grupos e, em vez disso, atribua funções aos grupos. Siga essas etapas para identificar onde várias atribuições de função para entidades principais podem ser substituídas por uma única atribuição de função para um grupo.
Entre no portal do Azure e abra o Azure Resource Graph Explorer.
Selecione Escopo e defina o escopo da consulta.
Normalmente, você define o escopo como Directory para consultar todo o seu locatário, mas pode restringir o escopo a assinaturas específicas.
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.
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 de segurança diferentes.
Essa consulta verifica atribuições de funções ativas e não considera atribuições de funções elegíveis no Microsoft Entra Privileged Identity Management. Para listar atribuições de funções elegíveis, pode utilizar o centro de administração Microsoft Entra, o PowerShell ou a API REST. Para obter mais informações, veja 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 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
O seguinte mostra um exemplo dos resultados. A coluna count_ é o número de principais atribuídos à mesma função e no mesmo escopo. A contagem é classificada em ordem decrescente.
Identifique uma linha onde você deseja substituir as diversas atribuições de função por uma única atribuição de função para um grupo.
Na linha, selecione Ver detalhes para abrir o painel Detalhes.
Coluna Descrição RoleDefinitionId ID da função atualmente atribuída. Escopo Escopo da atribuição de função, que será uma assinatura, um grupo de recursos ou um recurso. RoleDefinitionName Nome da função atualmente atribuída. count_ Número de principais atribuídos à mesma função e no mesmo escopo. AllPrincipals Lista de IDs principais atribuídos à mesma função e no mesmo escopo. Use RoleDefinitionId, RoleDefinitionName e Scope para obter a função e o escopo.
Use AllPrincipals para obter a lista dos IDs principais com a mesma atribuição de função.
Crie um grupo do Microsoft Entra. Para obter mais informações, veja Gerenciar grupos do Microsoft Entra e associação a grupos.
Adicione os principais de AllPrincipals ao grupo.
Para obter informações sobre como adicionar entidades em massa, veja Adicionar membros do grupo em massa no Microsoft Entra ID.
Atribua a função ao grupo que você criou no mesmo escopo. Para obter mais informações, confira Atribuir funções do Azure usando o portal do Azure.
Agora você pode localizar e remover as atribuições de função baseadas em entidade principal.
Obtenha os nomes principais dos IDs principais.
- Para usar o portal do Azure, veja Adicionar ou atualizar as informações e configurações do perfil de um usuário.
- Para usar o PowerShell, veja Get-MgUser.
- Para usar o Azure, CLI, veja az ad user show.
Abra a página Controle de acesso (IAM) no mesmo escopo das atribuições de função.
Selecione a guia Atribuições de função.
Para filtrar as atribuições de função, selecione o filtro Função e selecione o nome da função.
Encontre as atribuições de função baseadas em entidade principal.
Você também deverá ver sua atribuição de função baseada em grupo.
Selecione e remova as atribuições de funções baseadas em entidade. Para saber mais, confira Remover atribuições de função do Azure.
Solução 2 – Remover atribuições de funções redundantes
Para reduzir o número de atribuições de funções na subscrição, remova atribuições de funções redundantes. Siga esses passos para identificar onde as atribuições de funções redundantes num âmbito inferior podem ser potencialmente removidas, uma vez que uma atribuição de funções num âmbito superior já concede acesso.
Entre no portal do Azure e abra o Azure Resource Graph Explorer.
Selecione Escopo e defina o escopo da consulta.
Normalmente, você define o escopo como Directory para consultar todo o seu locatário, mas pode restringir o escopo a assinaturas específicas.
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.
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.
Essa consulta verifica atribuições de funções ativas e não considera atribuições de funções elegíveis no Microsoft Entra Privileged Identity Management. Para listar atribuições de funções elegíveis, pode utilizar o centro de administração Microsoft Entra, o PowerShell ou a API REST. Para obter mais informações, veja 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 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
O seguinte mostra um exemplo dos resultados. A coluna count_ é o número de âmbitos diferentes para atribuições de funções com a mesma função e o mesmo principal. A contagem é classificada em ordem decrescente.
Coluna Descrição RoleDefinitionId ID da função atualmente atribuída. RoleDefinitionName Nome da função atualmente atribuída. PrincipalId ID do principal atribuído à função. count_ Número de âmbitos diferentes para atribuições de funções com a mesma função e o mesmo principal. Escopos Escopos para atribuições de função com a mesma função e o mesmo principal. Identifique uma linha onde você deseja remover atribuições de funções redundantes.
Em uma linha, selecione Ver detalhes para abrir o painel Detalhes.
Use RoleDefinitionId, RoleDefinitionName e PrincipalId para obter a função e o ID principal.
Use Escopos para obter a lista de escopos para a mesma função e o mesmo principal.
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 privilégio mínimo ao determinar quais atribuições de função podem ser removidas. A atribuição de funções no âmbito mais elevado pode conceder mais acesso ao principal do que o necessário. Nesse caso, deverá remover a atribuição de funções com o âmbito superior. Por exemplo, um utilizador poderá não precisar de uma atribuição de função de Colaborador de Máquina Virtual no âmbito da subscrição quando uma atribuição de função de Colaborador de Máquina Virtual num âmbito de grupo de recursos inferior concede o acesso necessário.
Obtenha o nome principal do ID principal.
- Para usar o portal do Azure, veja Adicionar ou atualizar as informações e configurações do perfil de um usuário.
- Para usar o PowerShell, veja Get-MgUser.
- Para usar o Azure, CLI, veja az ad user show.
Abra a página Controle de acesso (IAM) no escopo de uma atribuição de função que você deseja remover.
Selecione a guia Atribuições de função.
Para filtrar as atribuições de função, selecione o filtro Função e selecione o nome da função.
Encontre o diretor.
Selecione e remova a atribuição de função. Para saber mais, confira Remover atribuições de função do Azure.
Solução 3 – Substitua várias atribuições de função integradas por uma atribuição de função personalizada
Para reduzir o número de atribuições de funções na subscrição, substitua várias atribuições de funções incorporadas por uma única atribuição de funções personalizada. Siga essas etapas para identificar onde várias atribuições de funções internas podem ser potencialmente substituídas.
Entre no portal do Azure e abra o Azure Resource Graph Explorer.
Selecione Escopo e defina o escopo da consulta.
Normalmente, você define o escopo como Directory para consultar todo o seu locatário, mas pode restringir o escopo a assinaturas específicas.
Execute a consulta a seguir para obter atribuições de funções com a mesma entidade de segurança e o mesmo escopo, mas com funções internas diferentes.
Essa consulta verifica atribuições de funções ativas e não considera atribuições de funções elegíveis no Microsoft Entra Privileged Identity Management. Para listar atribuições de funções elegíveis, pode utilizar o centro de administração Microsoft Entra, o PowerShell ou a API REST. Para obter mais informações, veja 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 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
O seguinte mostra um exemplo dos resultados. A coluna count_ é o número de diferentes atribuições de funções internas com o mesmo principal e o mesmo escopo. A contagem é classificada em ordem decrescente.
Coluna Descrição PrincipalId ID da entidade de segurança atribuída às funções integradas. Escopo Escopo para atribuições de funções integradas. count_ Número de atribuições de funções incorporadas com o mesmo principal e o mesmo âmbito. AllRD ID e nome das funções integradas. Em uma linha, selecione Ver detalhes para abrir o painel Detalhes.
Use AllRD para ver as funções integradas que podem ser potencialmente combinadas em uma função personalizada.
Liste as ações e ações de dados para as funções integradas. Para obter mais informações, Veja Listar definições de funções do Azure ou Funções internas do Azure
Crie uma função personalizada que inclua todas as ações e ações de dados como funções integradas. Para facilitar a criação da função personalizada, você pode começar clonando uma das funções integradas. Para obter mais informações, veja Criar ou atualizar funções personalizadas do Azure usando o portal do Azure.
Obtenha o nome principal do ID principal.
- Para usar o portal do Azure, veja Adicionar ou atualizar as informações e configurações do perfil de um usuário.
- Para usar o PowerShell, veja Get-MgUser.
- Para usar o Azure, CLI, veja az ad user show.
Abra a página Controle de acesso (IAM) no mesmo escopo das atribuições de função.
Atribua a nova função personalizada ao principal. Para obter mais informações, confira Atribuir funções do Azure usando o portal do Azure.
Agora você pode remover as atribuições de funções integradas.
Na página Controle de acesso (IAM) no mesmo escopo, selecione a guia Atribuições de função.
Encontre as atribuições de funções principais e integradas.
Remova as atribuições de função integradas da entidade principal. Para saber mais, confira Remover atribuições de função do Azure.
Solução 4 – Tornar as atribuições de funções elegíveis
Para reduzir o número de atribuições de funções na assinatura e você tiver o Microsoft Entra ID P2, torne as atribuições de funções elegíveis no Microsoft Entra Privileged Identity Management em vez de atribuídas permanentemente.
Solução 5 – Adicione uma assinatura adicional
Adicione uma assinatura extra.
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 âmbito do grupo de gestão.
Causa
O Azure dá suporte para até 500 atribuições de função por grupo de gerenciamento. Esse limite é diferente do limite de atribuições de função por assinatura.
Observação
O limite de 500 atribuições de função 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 opções possíveis, veja Sintoma - Não é possível criar mais atribuições de função. Para que as consultas recuperem recursos ao nível do grupo de gestão, terá de fazer as seguintes alterações nas consultas:
Substitua
| where id startswith "/subscriptions"
With
| where id startswith "/providers/Microsoft.Management/managementGroups"
Sintoma – nenhuma definição de função adicional pode ser criada
Ao tentar criar uma função personalizada, você recebe a seguinte mensagem:
Role definition limit exceeded. No more role definitions can be created (code: RoleDefinitionLimitExceeded)
Causa
O Azure dá suporte a até 5.000 funções personalizadas em um diretório. (Para o Microsoft Azure operado pela 21Vianet, o limite é de 2.000 funções personalizadas.)
Solução
Siga estas etapas para localizar e excluir funções personalizadas do Azure não utilizadas.
Entre no portal do Azure e abra o Azure Resource Graph Explorer.
Selecione Escopo e defina o escopo como Diretório para a consulta.
Execute a seguinte consulta para obter todas as funções personalizadas que não possuem atribuições de função:
Esta consulta verifica atribuições de funções ativas e não considera atribuições de funções personalizadas qualificadas no Microsoft Entra Privileged Identity Management. Para listar atribuições de funções personalizadas elegíveis, pode utilizar o centro de administração Microsoft Entra, o PowerShell ou a API REST. Para obter mais informações, veja 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
A seguir mostramos um exemplo dos resultados:
Coluna Descrição RoleDefinitionId ID da função personalizada não utilizada. RoleDefinitionName Nome da função personalizada não utilizada. Escopo Escopos atribuíveis para a função personalizada não utilizada. Abra o escopo (normalmente assinatura) e depois abra a página Controle de acesso (IAM).
Selecione a guia Funções para ver uma lista de todas as funções integradas e personalizadas.
No filtro Tipo, selecione CustomRole para ver apenas suas funções personalizadas.
Selecione as reticências (...) da função personalizada que você deseja excluir e selecione Excluir.