Share via


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

Como um provedor de serviços, talvez você queira estar ciente de quando os grupos de recursos ou assinaturas de clientes são delegados para seu locatário por meio do Azure Lighthouse ou quando os recursos previamente delegados 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 todas as delegações adicionadas ou removidas dos locatários do cliente.

Este tópico explica as permissões necessárias para monitorar a atividade de delegação para 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, em vez de em qualquer locatário do cliente.

Embora estejamos nos referindo 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 aos dados no nível dos locatários

Para acessar dados do log de atividades no nível dos locatários, uma conta deve ser atribuída à função interna do Leitor de Monitoramento do 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 de 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 deve ser removido quando terminar.

Para obter instruções detalhadas sobre como adicionar e remover a 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 do usuário no Azure no escopo raiz. Essa atribuição de função permite exibir 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 ao escopo raiz

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

Importante

A concessão de 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, é recomendável atribuir essa função a uma conta de entidade de serviço e usar essa conta para consultar dados.

Você também pode atribuir a função de 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, lembre-se de que esse é um nível amplo de acesso que deve ser limitado ao menor número de usuários possível.

Use um dos métodos a seguir 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 de 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 que receberam a função Leitor de Monitoramento no escopo raiz podem ver as alterações de delegação diretamente no portal do Azure.

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

Uma lista de delegações será exibida. Você pode selecionar Editar colunas para mostrar ou ocultar os valores Status, a Categoria de eventos, a Hora, o Carimbo de data/hora, a Assinatura, o Evento iniciado por, o Grupo de recursos, o Tipo de recurso e Recurso.

Screenshot of delegation changes in the Azure portal.

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

Como a função de leitor de monitoramento no escopo raiz é um nível tão amplo de acesso, talvez você queira atribuir a função a uma conta de entidade de serviço e usar essa conta para consultar dados usando o script abaixo.

Importante

Atualmente, os 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 melhores práticas:

Depois de criar uma conta de entidade de serviço com acesso de leitura de monitoramento ao escopo raiz do seu locatário de gerenciamento, você poderá usá-la para consultar e relatar a atividade de delegação em seu locatário.

Este script do Azure PowerShell pode ser usado para consultar o último dia de atividade e relatórios de delegações adicionadas ou removidas (ou tentativas que não foram bem-sucedidas). Ele consulta os dados do Log de Atividades do Locatário e, em seguida, elabora os seguintes valores para relatar as delegações adicionadas ou removidas:

  • DelegatedResourceId: a ID do grupo de recursos ou da assinatura delegada
  • CustomerTenantId: a ID de 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 para o recurso delegado (com êxito ou falha)
  • EventTimeStamp: a data e a hora em que a alteração de delegação foi registrada

Ao consultar esses dados, tenha em mente:

  • Se vários grupos de recursos forem delegados em uma única implantação, as entradas separadas serão retornadas para cada grupo de recursos.
  • As alterações feitas em uma delegação anterior (como atualizar a estrutura de permissão) serão registradas como uma delegação adicionada.
  • Como mencionado acima, uma conta deve ter a função interna do Azure de leitor de monitoramento no escopo raiz (/) para acessar os dados no nível dos locatários.
  • 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 (versão prévia) para registrar dados no Azure Monitor 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óximas etapas