Monitorare le modifiche di delega nel tenant di gestione

In qualità di provider di servizi, è consigliabile tenere presente quando le sottoscrizioni dei clienti o i gruppi di risorse vengono delegate al tenant tramite Azure Lighthouse o quando le risorse delegate in precedenza vengono rimosse.

Nel tenant di gestione, il log attività di Azure tiene traccia dell'attività di delega a livello di tenant. Questa attività registrata include tutte le deleghe aggiunte o rimosse dai tenant dei clienti.

Questo argomento illustra le autorizzazioni necessarie per monitorare l'attività di delega al tenant in tutti i clienti. Include anche uno script di esempio che mostra un metodo per l'esecuzione di query e la creazione di report su questi dati.

Importante

Tutti questi passaggi devono essere eseguiti nel tenant di gestione, anziché in tutti i tenant dei clienti.

Anche se in questo argomento si fa riferimento a provider di servizi e clienti, le aziende che gestiscono più tenant possono usare gli stessi processi.

Abilitare l'accesso ai dati a livello di tenant

Per accedere ai dati del log attività a livello di tenant, è necessario assegnare un account al ruolo predefinito di Azure con autorizzazioni di lettura per il monitoraggio nell'ambito radice (/). Questa assegnazione deve essere eseguita da un utente che dispone del ruolo Global Amministrazione istrator con accesso con privilegi elevati aggiuntivi.

Elevare l'accesso per un account globale Amministrazione istrator

Per assegnare un ruolo nell'ambito radice (/), è necessario avere il ruolo global Amministrazione istrator con accesso con privilegi elevati. Questo accesso con privilegi elevati deve essere aggiunto solo quando è necessario eseguire l'assegnazione di ruolo, quindi rimosso al termine.

Per istruzioni dettagliate sull'aggiunta e la rimozione dell'elevazione dei privilegi, vedere Elevare l'accesso per gestire tutte le sottoscrizioni e i gruppi di gestione di Azure.

Dopo aver elevato l'accesso, l'account avrà il ruolo Accesso utente Amministrazione istrator in Azure nell'ambito radice. Questa assegnazione di ruolo consente di visualizzare tutte le risorse e assegnare l'accesso in qualsiasi sottoscrizione o gruppo di gestione nella directory, nonché di effettuare assegnazioni di ruolo nell'ambito radice.

Assegnare il ruolo Lettore di monitoraggio nell'ambito radice

Dopo aver elevato l'accesso, è possibile assegnare le autorizzazioni appropriate a un account in modo che possa eseguire query sui dati del log attività a livello di tenant. Questo account dovrà avere assegnato il ruolo predefinito di Lettura monitoraggio di Azure nell'ambito radice del tenant di gestione.

Importante

La concessione di un'assegnazione di ruolo nell'ambito radice significa che le stesse autorizzazioni verranno applicate a ogni risorsa nel tenant. Poiché si tratta di un ampio livello di accesso, è consigliabile assegnare questo ruolo a un account dell'entità servizio e usare tale account per eseguire query sui dati.

È anche possibile assegnare il ruolo Lettore di monitoraggio nell'ambito radice a singoli utenti o a gruppi di utenti in modo che possano visualizzare le informazioni di delega direttamente nel portale di Azure. In tal caso, tenere presente che si tratta di un ampio livello di accesso che deve essere limitato al minor numero possibile di utenti.

Usare uno dei metodi seguenti per assegnare l'ambito radice.

PowerShell

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

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

Interfaccia della riga di comando di 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 "/"

Rimuovere l'accesso con privilegi elevati per l'account globale Amministrazione istrator

Dopo aver assegnato il ruolo Lettore di monitoraggio nell'ambito radice all'account desiderato, assicurarsi di rimuovere l'accesso con privilegi elevati per l'account global Amministrazione istrator, perché questo livello di accesso non sarà più necessario.

Visualizzare le modifiche alla delega nel portale di Azure

Gli utenti a cui è stato assegnato il ruolo Lettore di monitoraggio nell'ambito radice possono visualizzare le modifiche di delega direttamente nel portale di Azure.

  1. Passare alla pagina Clienti personali e quindi selezionare Log attività dal menu di spostamento a sinistra.
  2. Assicurarsi che l'attività directory sia selezionata nel filtro nella parte superiore della schermata.

Verrà visualizzato un elenco di modifiche alla delega. È possibile selezionare Modifica colonne per visualizzare o nascondere i valori Stato, Categoria di eventi, Time, Timestamp, Sottoscrizione, Evento avviato da, Gruppo di risorse, Tipo di risorsa e Risorsa.

Screenshot of delegation changes in the Azure portal.

Usare un account dell'entità servizio per eseguire query sul log attività

Poiché il ruolo Lettore di monitoraggio nell'ambito radice è un livello di accesso così ampio, è possibile assegnare il ruolo a un account dell'entità servizio e usare tale account per eseguire query sui dati usando lo script seguente.

Importante

Attualmente, i tenant con una grande quantità di attività di delega possono verificarsi errori durante l'esecuzione di query su questi dati.

Quando si usa un account dell'entità servizio per eseguire query sul log attività, è consigliabile seguire le procedure consigliate seguenti:

Dopo aver creato un nuovo account dell'entità servizio con l'accesso con autorizzazioni di lettura per il monitoraggio all'ambito radice del tenant di gestione, è possibile usarlo per eseguire query e segnalare l'attività di delega nel tenant.

Questo script di Azure PowerShell può essere usato per eseguire una query sull'ultimo giorno dell'attività e segnalare eventuali deleghe aggiunte o rimosse (o tentativi non riusciti). Esegue una query sui dati del log attività tenant, quindi costruisce i valori seguenti per segnalare le deleghe aggiunte o rimosse:

  • DelegatedResourceId: ID della sottoscrizione o del gruppo di risorse delegato
  • CustomerTenantId: ID tenant del cliente
  • CustomerSubscriptionId: ID sottoscrizione delegato o contenente il gruppo di risorse delegato
  • CustomerDelegationStatus: modifica dello stato per la risorsa delegata (riuscita o non riuscita)
  • EventTimeStamp: data e ora in cui è stata registrata la modifica della delega

Quando si eseguono query su questi dati, tenere presente quanto segue:

  • Se più gruppi di risorse sono delegati in una singola distribuzione, verranno restituite voci separate per ogni gruppo di risorse.
  • Le modifiche apportate a una delega precedente, ad esempio l'aggiornamento della struttura delle autorizzazioni, verranno registrate come delega aggiunta.
  • Come indicato in precedenza, per accedere a questi dati a livello di tenant, un account deve avere il ruolo predefinito di Azure con autorizzazioni di lettura per il monitoraggio di Azure nell'ambito radice (/).
  • È possibile usare questi dati nei flussi di lavoro e nei report personalizzati. Ad esempio, è possibile usare l'API dell'agente di raccolta dati HTTP (anteprima) per registrare i dati in Monitoraggio di Azure da un client API REST, quindi usare i gruppi di azioni per creare notifiche o avvisi.
# 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)"
}

Passaggi successivi