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ê deve ter a função de Administrador Global com acesso elevado. Esse acesso elevado deve ser habilitado somente quando você precisar fazer a atribuição de função e 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 elevar seu acesso, você pode atribuir as permissões apropriadas a uma conta para que ela possa consultar dados de log de atividades no nível do locatário. Essa conta deve ter a função interna Leitor de monitoramento 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 se aplicam a todos os recursos no locatário. Como esse é um nível de acesso tão amplo, 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 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 Leitor de monitoramento no escopo raiz à conta desejada, certifique-se de remover o acesso elevado para a conta Administrador global, pois esse alto nível de acesso não é 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.
- Navegue até a página Meus clientes e, em seguida, selecione Log de atividades no menu de navegação à esquerda.
- Verifique se a Atividade de Diretório está selecionada no filtro próximo à parte superior da tela.
- Selecione o período em que você deseja visualizar as alterações de delegação.
Usar uma conta de entidade de serviço para consultar o log de atividades
Como a função Leitor de monitoramento no escopo raiz é um nível de acesso muito amplo, recomendamos atribuir a função a uma conta principal de serviço e usar essa conta para consultar dados por meio de um script.
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:
- Crie uma conta de entidade de serviço para ser usada somente para essa função, em vez de atribuir essa função a uma entidade de serviço existente usada para outra automação.
- Certifique-se de que esse principal de serviço não tenha acesso a nenhum recurso de cliente delegado.
- Use um certificado para autenticar e armazene-o com segurança no Azure Key Vault.
- Limite os usuários que têm acesso para atuar em nome da entidade de serviço.
Depois de criar uma conta principal de serviço que tenha acesso ao Monitoring Reader no escopo raiz do seu locatário de gerenciamento, você pode usá-la para consultar e relatar a atividade de delegação.
Esse script do Azure PowerShell pode ser usado para consultar o último dia de atividade e relatar quaisquer 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, entradas separadas serão retornadas para cada grupo de recursos.
- Alterações feitas em uma delegação anterior (como atualização da estrutura de permissão) são registradas como uma delegação adicionada.
- Conforme observado anteriormente, uma conta deve ter a função interna do Monitoring Reader do 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 de ingestão de logs para registrar dados no Azure Monitor de um cliente de API REST e, em seguida, usar grupos de ação 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 = $unregisterOutput.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
- Saiba como integrar clientes ao Azure Lighthouse.
- Saiba mais sobre o Azure Monitor e o log de atividades do Azure.
- Examine a pasta de trabalho de exemplo Logs de Atividades por Domínio para saber como exibir os Logs de Atividades do Azure entre assinaturas com uma opção para filtrá-los por nome de domínio.