Monitorare le reti in modo proattivo con avvisi e Funzioni di Azure usando l'acquisizione di pacchetti

Il servizio di acquisizione di pacchetti di Network Watcher crea sessioni di acquisizione per registrare il traffico da e verso le macchine virtuali (VM). Il file di acquisizione può avere un filtro che deve essere definito per tenere traccia solo del traffico che si desidera monitorare. I dati vengono archiviati in un BLOB di archiviazione o in locale nel computer guest.

Questa funzionalità può essere avviata in remoto da altri scenari di automazione, ad esempio da Funzioni di Azure. È possibile eseguire acquisizioni proattive in base alle anomalie di rete definite. Altri utilizzi comprendono la raccolta di statistiche di rete, l'ottenimento di informazioni sulle intrusioni nella rete, il debug delle comunicazioni client-server.

Le risorse distribuite in Azure sono continuamente in esecuzione. È difficile monitorare sempre attivamente lo stato di tutte le risorse. Si pensi a cosa può accadere se si verifica un problema alle 2:00 del mattino.

Usando gli avvisi e le funzioni Network Watcher dall'ecosistema di Azure, è possibile rispondere in modo proattivo alle problematiche della rete con i dati e gli strumenti più idonei.

Prerequisiti

Scenario

In questo esempio una macchina virtuale ha più traffico in uscita del solito e si desidera ricevere un avviso. Un processo simile può essere utilizzato per creare avvisi per qualsiasi condizione.

Quando un evento imprevisto attiva un avviso, i dati a livello di pacchetto contribuiscono ad analizzare il motivo per cui il traffico in uscita è aumentato. Pertanto è possibile intervenire per riportare la macchina virtuale al suo stato originale.

Questo scenario presuppone che esistano già un'istanza di Network Watcher e un gruppo di risorse con una macchina virtuale valida.

Ecco il flusso di lavoro per l'acquisizione pacchetti:

  1. Un evento imprevisto attiva un avviso nella macchina virtuale.
  2. L'avviso chiama la funzione di Azure.
  3. La funzione di Azure elabora l'avviso e avvia una sessione di acquisizione di pacchetti di Network Watcher.
  4. L'acquisizione pacchetti viene eseguita nella macchina virtuale e raccoglie i dati.
  5. Il file di acquisizione pacchetto viene caricato in un account di archiviazione per revisione e diagnosi.

Per automatizzare questo processo, nella VM viene creato e connesso un avviso che verrà attivato quando si verifica l'evento imprevisto. Viene anche creata una funzione per chiamare Network Watcher.

Questo scenario:

  • Crea una funzione di Azure che avvia un'acquisizione di pacchetti.
  • Crea una regola di avviso in una macchina virtuale e configura la regola di avviso in modo da chiamare la funzione di Azure.

Creazione di una funzione di Azure

Il primo passaggio è la creazione di un'app per le funzioni per creare una funzione di Azure che elabori l'avviso e crei l'acquisizione pacchetti:

  1. Accedere al portale di Azure.

  2. Nella casella di ricerca nella parte superiore del portale, immettere app per le funzioni. Selezionare App per le funzioni nei risultati della ricerca.

    Screenshot che mostra come cercare le app per le funzioni nel portale di Azure.

  3. Seleziona + Crea.

  4. Nella scheda Dati principali di Crea app per le funzioni, immettere o selezionare i valori per le impostazioni seguenti:

    • In Dettagli progetto, selezionare la sottoscrizione per la quale si desidera creare l'app per le funzioni e il gruppo di risorse che contengano l'app.
    • In Dettagli istanza:
      • Per Nome dell'app per le funzioni immettere il nome desiderato. Questo nome viene accodato con .azurewebsites.net.
      • Per Distribuire il codice o l'immagine del contenitore?, selezionare la modalità di pubblicazione: Codice o Immagine del contenitore.
      • Per Stack di runtime, selezionare uno stack di runtime.
      • Per Versione, selezionare la versione dello stack di runtime.
      • Per Area: selezionare l'area in cui creare l'app per le funzioni.
    • In Sistema operativo, selezionare il tipo di sistema operativo attualmente in uso. Azure consiglia di scegliere il tipo di sistema operativo in base alla selezione dello stack di runtime.
    • In Hosting, selezionare il tipo di piano che si desidera utilizzare per l'app per le funzioni. È possibile scegliere tra le opzioni seguenti:
      • Consumo (Serverless): per il ridimensionamento guidato dagli eventi al costo più basso.
      • Premium di funzioni: per il livello di organizzazione, applicazioni serverless con ridimensionamento basato su eventi e isolamento rete.
      • Piano di servizio app: per riutilizzare l'ambiente di calcolo da un piano di servizio app di Azure esistente.

    Screenshot della pagina Crea app per le funzioni nel portale di Azure.

  5. Selezionare Rivedi e crea per creare l'app.

Ora è possibile creare una funzione:

  1. Nell'app per le funzioni creata, selezionare Funzioni, quindi scegliere Crea per aprire il riquadro Crea funzione.

    Screenshot del riquadro Crea funzione.

  2. Per Ambiente di sviluppo, selezionare Develop in portal (Sviluppa nel portale).

  3. In Seleziona un modello selezionare Trigger HTTP.

  4. Nella sezione Dettagli modello:

    • Per Nuova funzione, immettere il nome desiderato.
    • Per Livello di autorizzazione, selezionare Funzione.
  5. Seleziona Crea.

  6. Passare alla funzione creata e selezionare Codice e test.

    Screenshot della pagina Codice e test per una funzione.

  7. Aggiornare lo script e selezionare Salva.

Configurare l'autenticazione

Per usare i cmdlet PowerShell, è necessario configurare l'autenticazione nell'app per le funzioni. Per configurare l'autenticazione è necessario definire le variabili di ambiente e caricare un file di chiave crittografata nell'app per le funzioni.

Nota

Questo scenario fornisce solo un esempio della modalità di implementazione dell'autenticazione con Funzioni di Azure. Tale azione può essere eseguita in altri modi.

Lo script di PowerShell seguente crea un file di chiave denominato PassEncryptKey.key Inoltre, viene messa a disposizione una versione crittografata della password fornita. Tale password è la stessa che viene definita per l'applicazione di Microsoft Entra usata per l'autenticazione.

#Variables
$keypath = "C:\temp\PassEncryptKey.key"
$AESKey = New-Object Byte[] 32
$Password = "<insert a password here>"

#Keys
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey) 
Set-Content $keypath $AESKey

#Get encrypted password
$secPw = ConvertTo-SecureString -AsPlainText $Password -Force
$AESKey = Get-content $KeyPath
$Encryptedpassword = $secPw | ConvertFrom-SecureString -Key $AESKey
$Encryptedpassword

Recuperare i valori per le variabili di ambiente

Configurare le variabili di ambiente seguenti, necessarie per accedere ai valori per l'autenticazione:

  • AzureClientID
  • AzureTenant
  • AzureCredPassword

Se si dispone già di un ID applicazione, utilizzare i valori AzureClientID, AzureTenant e AzureCredPassword dell'applicazione. In caso contrario, passare alla sezione Archiviare le variabili di ambiente.

AzureClientID

L'ID client è l'ID di un'applicazione in Microsoft Entra ID. Per ottenere un ID client:

  1. Se non si dispone già di un'applicazione da utilizzare, eseguire il cmdlet seguente per crearne una:

    $app = New-AzADApplication -DisplayName "ExampleAutomationAccount_MF" -HomePage "https://exampleapp.com" -IdentifierUris "https://exampleapp1.com/ExampleFunctionsAccount" -Password "<same password as defined earlier>"
    New-AzADServicePrincipal -ApplicationId $app.ApplicationId
    Start-Sleep 15]
    New-AzRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $app.ApplicationId
    

    Nota

    La password utilizzata per la creazione dell'applicazione deve essere la stessa creata in precedenza durante il salvataggio del file della chiave.

  2. Nel portale di Azure selezionare Sottoscrizioni. Selezionare la sottoscrizione da usare e quindi fare clic su Controllo di accesso (IAM).

  3. Scegliere l'account da usare e quindi selezionare Proprietà. Copia l'ID applicazione.

AzureTenant

Ottenere l'ID tenant eseguendo il cmdlet PowerShell seguente:

(Get-AzSubscription -SubscriptionName "<subscriptionName>").TenantId

AzureCredPassword

Il valore della variabile di ambiente AzureCredPassword è il valore che si ottiene dopo l'esecuzione di questo esempio di PowerShell. Questo esempio è lo stesso illustrato nella sezione mostrata in precedenza Configurare l'autenticazione. Il valore necessario è l'output della variabile $Encryptedpassword. Questo output è la password dell'entità servizio crittografata tramite lo script di PowerShell.

#Variables
$keypath = "C:\temp\PassEncryptKey.key"
$AESKey = New-Object Byte[] 32
$Password = "<insert a password here>"

#Keys
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey) 
Set-Content $keypath $AESKey

#Get encrypted password
$secPw = ConvertTo-SecureString -AsPlainText $Password -Force
$AESKey = Get-content $KeyPath
$Encryptedpassword = $secPw | ConvertFrom-SecureString -Key $AESKey
$Encryptedpassword

Archiviare le variabili di ambiente

Per archiviare le variabili di ambiente:

  1. Passare all'app per le funzioni. Selezionare Configurazioni>Impostazioni applicazione.

    Screenshot della scheda relativa alle impostazioni applicazione.

  2. Aggiungere le variabili di ambiente e i relativi valori alle impostazioni dell'app e quindi fare clic su Salva.

Aggiunta di PowerShell alla funzione

Adesso effettuare chiamate in Network Watcher dalla funzione di Azure. L'implementazione di questa funzione può variare a seconda dei requisiti. Il flusso generale del codice è tuttavia il seguente:

  1. Elaborare i parametri di input.
  2. Eseguire una query sulle acquisizioni di pacchetti esistenti per verificare i limiti e risolvere i conflitti di nomi.
  3. Creare un'acquisizione di pacchetti con i parametri appropriati.
  4. Eseguire il polling dell'acquisizione pacchetti fino al completamento.
  5. Notificare all'utente che la sessione di acquisizione di pacchetti è completa.

L'esempio seguente è il codice PowerShell che può essere usato nella funzione. Sostituire i valori di subscriptionId, resourceGroupName e storageAccountName.

# Input bindings are passed in via parameter block 
param($Request, $TriggerMetadata) 

$essentials = $Request.body.data.essentials
$alertContext = $Request.body.data.alertContext 


# Storage account ID to save captures in 
$storageaccountid = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}" 

# Packet capture variables 
$packetCaptureName = "PSAzureFunction" 
$packetCaptureLimit = 100
$packetCaptureDuration = 30 

# Credentials 
# Set the credentials in the configurations
$tenant = $env:AzureTenant 
$pw = $env:AzureCredPassword 
$clientid = $env:AzureClientId 
$password = ConvertTo-SecureString $pw -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($clientid, $password)

Connect-AzAccount -ServicePrincipal -Tenant $tenant -Credential $credential #-WarningAction SilentlyContinue | out-null

if ($alertContext.condition.allOf.metricNamespace -eq "Microsoft.Compute/virtualMachines") { 

    # Get the VM firing this alert 
    $vm = Get-AzVM -ResourceId $essentials.alertTargetIDs[0] 

    # Get the Network Watcher instance in the VM's region 
    $networkWatcher = Get-AzNetworkWatcher -Location $vm.Location  

    # Get existing packet captures 
    $packetCaptures = Get-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher 

    # Remove an existing packet capture created by the function (if it exists) 
    $packetCaptures | ForEach-Object { if ($_.Name -eq $packetCaptureName) 
        {  
            Remove-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher -PacketCaptureName $packetCaptureName 
        } 
    } 
  
    # Initiate packet capture on the VM that fired the alert 
    if ($packetCaptures.Count -lt $packetCaptureLimit) { 
        Write-Output "Initiating Packet Capture" 
        New-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher -TargetVirtualMachineId $vm.Id -PacketCaptureName $packetCaptureName -StorageAccountId $storageaccountid -TimeLimitInSeconds $packetCaptureDuration 
    } 
} 

Utilizzare il codice di PowerShell seguente se si usa lo schema precedente:

# Input bindings are passed in via parameter block 
param($Request, $TriggerMetadata)
$details = $Request.RawBody | ConvertFrom-Json


# Process alert request body 
$requestBody = $Request.Body.data

# Storage account ID to save captures in 
$storageaccountid = "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{storageAccountName}" 

# Packet capture variables 
$packetCaptureName = "PSAzureFunction" 
$packetCaptureLimit = 100
$packetCaptureDuration = 30 

# Credentials 
# Set the credentials in the configurations
$tenant = $env:AzureTenant 
$pw = $env:AzureCredPassword 
$clientid = $env:AzureClientId 

$password = ConvertTo-SecureString $pw -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($clientid, $password)

Connect-AzAccount -ServicePrincipal -Tenant $tenant -Credential $credential #-WarningAction SilentlyContinue | out-null

if ($requestBody.context.resourceType -eq "Microsoft.Compute/virtualMachines") { 

    # Get the VM firing this alert 
    $vm = Get-AzVM -ResourceGroupName $requestBody.context.resourceGroupName -Name $requestBody.context.resourceName 

    # Get the Network Watcher instance in the VM's region 
    $networkWatcher = Get-AzNetworkWatcher -Location $vm.Location  

    # Get existing packet captures 
    packetCaptures = Get-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher 

    # Remove an existing packet capture created by the function (if it exists) 
    $packetCaptures | ForEach-Object { if ($_.Name -eq $packetCaptureName) 
        {  
            Remove-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher -PacketCaptureName $packetCaptureName 
        } 
    } 

    # Initiate packet capture on the VM that fired the alert 
    if ($packetCaptures.Count -lt $packetCaptureLimit) { 
        Write-Output "Initiating Packet Capture" 
        New-AzNetworkWatcherPacketCapture -NetworkWatcher $networkWatcher -TargetVirtualMachineId $requestBody.context.resourceId -PacketCaptureName $packetCaptureName -StorageAccountId $storageaccountid -TimeLimitInSeconds $packetCaptureDuration 
    } 
}                               

Configurare un avviso in una VM

È possibile configurare avvisi per comunicare alle singole persone il superamento di una soglia assegnata a una metrica specifica. In questo esempio, l'avviso si trova nella metrica Totale rete in uscita inviata, tuttavia è possibile attivare l'avviso per molte altre metriche.

Creare la regola di avviso

Passare a una macchina virtuale esistente e aggiungere una regola avvisi. Nella pagina Crea una regola avvisi, seguire questa procedura:

  1. Nel riquadro Seleziona un segnale, cercare il nome del segnale e selezionarlo. In questo esempio, Totale rete in uscita è il segnale selezionato. Esso denota il numero di byte inviati su tutte le interfacce di rete dalla macchina virtuale.

  2. Nella scheda Condizioni, impostare i valori seguenti, quindi selezionare Avanti: Azioni.

    Impostazione valore
    Threshold Statico
    Tipo di aggregazione Media
    Operatore Maggiore di
    Valore di soglia 3
    Controllare ogni 1 minuto
    Periodo di ricerca 5 minuti
  3. Nella scheda Azioni, selezionare Crea gruppo di azioni.

  4. Nella pagina Crea gruppo di azioni, selezionare i valori relativi a Sottoscrizione, Gruppo di risorse e Area. Immettere anche il nome del gruppo di azioni e il nome visualizzato, quindi selezionare Avanti: Notifiche.

  5. Nella scheda Notifiche, per Tipo di azione selezionare Funzione di Azure.

  6. Nel riquadro Funzione di Azure, selezionare i valori di Sottoscrizione, Gruppo di risorse, App per le funzioni e Funzione di Azure.

    Screenshot della pagina per la creazione di un gruppo di azioni e il riquadro per i dettagli di una funzione di Azure.

  7. Nel dispositivo di scorrimento Abilita schema di avviso comune, selezionare No. Quindi, seleziona OK.

Esaminare i risultati

Una volta attivato un avviso da parte dei criteri, Network Watcher crea un'acquisizione pacchetti. Passare a Network Watcher e selezionare Acquisizione pacchetti. In questa pagina è possibile fare clic sul collegamento al file per scaricare l'acquisizione pacchetti.

Se il file di acquisizione è archiviato in locale, è possibile recuperarlo accedendo alla macchina virtuale.

Per istruzioni sul download di file dagli account di archiviazione di Azure, consultare la Guida introduttiva alla libreria client dell'Archiviazione BLOB di Azure per .NET. È anche possibile usare lo strumento Azure Storage Explorer.

Al termine del download dell'acquisizione, è possibile visualizzarla con strumenti come Wireshark che consente di leggere un file .cap.

Passaggio successivo

Per informazioni su come visualizzare le acquisizioni pacchetti, leggere Esaminare e analizzare i file di acquisizione pacchetti di Network Watcher.