Monitorar alterações de delegação em seu locatário de gerenciamento

Como provedor de serviços, convém estar ciente de quando assinaturas de clientes ou grupos de recursos são delegados ao seu locatário por meio do Azure Lighthouse ou quando recursos delegados anteriormente são removidos.

No locatário de gerenciamento, o log de atividades do Azure rastreia a atividade de delegação no nível do locatário. Essa atividade registrada inclui quaisquer delegações adicionadas ou removidas de locatários clientes.

Este tópico explica as permissões necessárias para monitorar a atividade de delegação ao seu locatário em todos os seus clientes. Ele também inclui um script de exemplo que mostra um método para consultar e relatar esses dados.

Importante

Todas essas etapas devem ser executadas em seu locatário de gerenciamento, e não em qualquer locatário cliente.

Embora nos referimos a provedores de serviços e clientes neste tópico, as empresas que gerenciam vários locatários podem usar os mesmos processos.

Habilitar o acesso a dados no nível do locatário

Para acessar os dados do Log de Atividades no nível do locatário, uma conta deve receber a função interna do Monitoring Reader Azure no escopo raiz (/). Essa atribuição deve ser executada por um usuário que tenha a função de Administrador Global com acesso elevado adicional.

Elevar o acesso a uma conta de Administrador Global

Para atribuir uma função no escopo raiz (/), você precisará ter a função de Administrador Global com acesso elevado. Esse acesso elevado deve ser adicionado somente quando você precisar fazer a atribuição de função e, em seguida, removido quando terminar.

Para obter instruções detalhadas sobre como adicionar e remover elevação, consulte Elevar o acesso para gerenciar todas as assinaturas e grupos de gerenciamento do Azure.

Depois de elevar seu acesso, sua conta terá a função de Administrador de Acesso de Usuário no Azure no escopo raiz. Essa atribuição de função permite visualizar todos os recursos e atribuir acesso em qualquer assinatura ou grupo de gerenciamento no diretório, bem como fazer atribuições de função no escopo raiz.

Atribuir a função de Leitor de Monitoramento no escopo raiz

Depois de elevar o acesso, você pode atribuir as permissões apropriadas a uma conta para que ela possa consultar os dados do log de atividades no nível do locatário. Essa conta precisará ter a função interna do Monitoring Reader Azure atribuída no escopo raiz do seu locatário de gerenciamento.

Importante

Conceder uma atribuição de função no escopo raiz significa que as mesmas permissões serão aplicadas a todos os recursos no locatário. Como esse é um nível amplo de acesso, recomendamos atribuir essa função a uma conta principal de serviço e usar essa conta para consultar dados.

Você também pode atribuir a função Leitor de Monitoramento no escopo raiz a usuários individuais ou a grupos de usuários para que eles possam exibir informações de delegação diretamente no portal do Azure. Se você fizer isso, esteja ciente de que este é um amplo nível de acesso que deve ser limitado ao menor número de usuários possível.

Use um dos seguintes métodos para fazer a atribuição de escopo raiz.

PowerShell

# Log in first with Connect-AzAccount if you're not using Cloud Shell

New-AzRoleAssignment -SignInName <yourLoginName> -Scope "/" -RoleDefinitionName "Monitoring Reader"  -ObjectId <objectId> 

CLI do Azure

# Log in first with az login if you're not using Cloud Shell

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 --role "Monitoring Reader" --scope "/"

Remover acesso elevado para a conta de Administrador Global

Depois de atribuir a função Leitor de Monitoramento no escopo raiz à conta desejada, certifique-se de remover o acesso elevado para a conta de Administrador Global, pois esse nível de acesso não será mais necessário.

Exibir alterações de delegação no portal do Azure

Os usuários aos quais foi atribuída a função Leitor de Monitoramento no escopo raiz podem exibir as alterações de delegação diretamente no portal do Azure.

  1. Navegue até a página Meus clientes e selecione Registro de atividades no menu de navegação à esquerda.
  2. Verifique se Atividade do diretório está selecionada no filtro próximo à parte superior da tela.

Será apresentada uma lista de alterações de delegação. Você pode selecionar Editar colunas para mostrar ou ocultar os valores Status, Evento, Hora, Carimbo de data/hora, Assinatura, Evento iniciado por, Grupo de recursos, Tipo de recurso e Recurso.

Screenshot of delegation changes in the Azure portal.

Usar uma conta principal de serviço para consultar o log de atividades

Como a função Leitor de Monitoramento no escopo raiz é um nível de acesso tão amplo, convém atribuir a função a uma conta principal de serviço e usar essa conta para consultar dados usando o script abaixo.

Importante

Atualmente, locatários com uma grande quantidade de atividade de delegação podem encontrar erros ao consultar esses dados.

Ao usar uma conta de entidade de serviço para consultar o log de atividades, recomendamos as seguintes práticas recomendadas:

Depois de criar uma nova conta principal de serviço com acesso do Monitoring Reader ao escopo raiz do locatário de gerenciamento, você pode usá-la para consultar e relatar a atividade de delegação em seu locatário.

Esse script do Azure PowerShell pode ser usado para consultar o dia anterior de atividade e relatar quaisquer delegações adicionadas ou removidas (ou tentativas que não foram bem-sucedidas). Ele consulta os dados do Registro de Atividades do Locatário e, em seguida, constrói os seguintes valores para relatar as delegações que são adicionadas ou removidas:

  • DelegatedResourceId: A ID da assinatura delegada ou do grupo de recursos
  • CustomerTenantId: O ID do locatário do cliente
  • CustomerSubscriptionId: A ID da assinatura que foi delegada ou que contém o grupo de recursos que foi delegado
  • CustomerDelegationStatus: A alteração de status do recurso delegado (bem-sucedida ou com falha)
  • EventTimeStamp: A data e a hora em que a alteração de delegação foi registrada

Ao consultar esses dados, lembre-se:

  • Se vários grupos de recursos forem delegados em uma única implantação, entradas separadas serão retornadas para cada grupo de recursos.
  • As alterações feitas em uma delegação anterior (como a atualização da estrutura de permissões) serão registradas como uma delegação adicionada.
  • Conforme observado acima, uma conta deve ter a função interna do Monitoring Reader Azure no escopo raiz (/) para acessar esses dados no nível do locatário.
  • Você pode usar esses dados em seus próprios fluxos de trabalho e relatórios. Por exemplo, você pode usar a API do Coletor de Dados HTTP (visualização) para registrar dados no Azure Monitor a partir de um cliente de API REST e, em seguida, usar grupos de ações para criar notificações ou alertas.
# Log in first with Connect-AzAccount if you're not using Cloud Shell

# Azure Lighthouse: Query Tenant Activity Log for registered/unregistered delegations for the last 1 day

$GetDate = (Get-Date).AddDays((-1))

$dateFormatForQuery = $GetDate.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")

# Getting Azure context for the API call
$currentContext = Get-AzContext

# Fetching new token
$azureRmProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$profileClient = [Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient]::new($azureRmProfile)
$token = $profileClient.AcquireAccessToken($currentContext.Tenant.Id)

$listOperations = @{
    Uri     = "https://management.azure.com/providers/microsoft.insights/eventtypes/management/values?api-version=2015-04-01&`$filter=eventTimestamp ge '$($dateFormatForQuery)'"
    Headers = @{
        Authorization  = "Bearer $($token.AccessToken)"
        'Content-Type' = 'application/json'
    }
    Method  = 'GET'
}
$list = Invoke-RestMethod @listOperations

# First link can be empty - and point to a next link (or potentially multiple pages)
# While you get more data - continue fetching and add result
while($list.nextLink){
    $list2 = Invoke-RestMethod $list.nextLink -Headers $listOperations.Headers -Method Get
    $data+=$list2.value;
    $list.nextLink = $list2.nextlink;
}

$showOperations = $data;

if ($showOperations.operationName.value -eq "Microsoft.Resources/tenants/register/action") {
    $registerOutputs = $showOperations | Where-Object -FilterScript { $_.eventName.value -eq "EndRequest" -and $_.resourceType.value -and $_.operationName.value -eq "Microsoft.Resources/tenants/register/action" }
    foreach ($registerOutput in $registerOutputs) {
        $eventDescription = $registerOutput.description | ConvertFrom-Json;
    $registerOutputdata = [pscustomobject]@{
        Event                    = "An Azure customer has registered delegated resources to your Azure tenant";
        DelegatedResourceId      = $eventDescription.delegationResourceId; 
        CustomerTenantId         = $eventDescription.subscriptionTenantId;
        CustomerSubscriptionId   = $eventDescription.subscriptionId;
        CustomerDelegationStatus = $registerOutput.status.value;
        EventTimeStamp           = $registerOutput.eventTimestamp;
        }
        $registerOutputdata | Format-List
    }
}
if ($showOperations.operationName.value -eq "Microsoft.Resources/tenants/unregister/action") {
    $unregisterOutputs = $showOperations | Where-Object -FilterScript { $_.eventName.value -eq "EndRequest" -and $_.resourceType.value -and $_.operationName.value -eq "Microsoft.Resources/tenants/unregister/action" }
    foreach ($unregisterOutput in $unregisterOutputs) {
        $eventDescription = $registerOutput.description | ConvertFrom-Json;
    $unregisterOutputdata = [pscustomobject]@{
        Event                    = "An Azure customer has unregistered delegated resources from your Azure tenant";
        DelegatedResourceId      = $eventDescription.delegationResourceId;
        CustomerTenantId         = $eventDescription.subscriptionTenantId;
        CustomerSubscriptionId   = $eventDescription.subscriptionId;
        CustomerDelegationStatus = $unregisterOutput.status.value;
        EventTimeStamp           = $unregisterOutput.eventTimestamp;
        }
        $unregisterOutputdata | Format-List
    }
}
else {
    Write-Output "No new delegation events for tenant: $($currentContext.Tenant.TenantId)"
}

Próximos passos