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

La funzionalità di acquisizione pacchetti di Azure Network Watcher crea sessioni di acquisizione per tenere traccia del traffico nelle macchine virtuali e nelle macchine virtuali. Il file di acquisizione può avere un filtro definito per tenere traccia solo del traffico che si vuole monitorare. Questi dati vengono archiviati in un BLOB di archiviazione o localmente nel computer guest.

È possibile avviare questa funzionalità in modalità remota da altri scenari di automazione, ad esempio da Funzioni di Azure. È possibile eseguire acquisizioni proattive in base alle anomalie di rete definite. Altri usi includono la raccolta di statistiche di rete, il recupero di informazioni sulle intrusioni di rete e il debug delle comunicazioni client/server.

Le risorse distribuite in Azure vengono eseguite continuamente. È difficile monitorare attivamente lo stato di tutte le risorse in qualsiasi momento. Ad esempio, cosa accade se si verifica un problema alle 2:00?

Usando gli avvisi e le funzioni di Network Watcher dall'interno dell'ecosistema di Azure, è possibile rispondere in modo proattivo con i dati e gli strumenti per risolvere i problemi nella rete.

Prerequisiti

Scenario

In questo esempio una macchina virtuale ha più traffico in uscita del solito e si vuole ricevere un avviso. È possibile usare un processo simile per creare avvisi per qualsiasi condizione.

Quando un evento imprevisto attiva un avviso, i dati a livello di pacchetto consentono di analizzare il motivo per cui il traffico in uscita è aumentato. È possibile eseguire i passaggi per restituire la macchina virtuale allo 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 di 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 di 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, creare e connettere un avviso nella macchina virtuale da attivare quando si verifica l'evento imprevisto. Si crea anche 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

Per creare una funzione di Azure per elaborare l'avviso e creare un'acquisizione di pacchetti, è prima necessario creare un'app per le funzioni:

  1. Accedere al portale di Azure.

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

    Screenshot that shows how to search for function apps in the Azure portal.

  3. Seleziona + Crea.

  4. Nella scheda Informazioni di base di Crea app per le funzioni immettere o selezionare i valori per le impostazioni seguenti:

    • In Dettagli progetto selezionare la sottoscrizione per cui si vuole creare l'app per le funzioni e il gruppo di risorse in cui contenere l'app.
    • In Dettagli istanza:
      • Per Nome app per le funzioni immettere il nome dell'app per le funzioni. Questo nome viene aggiunto con .azurewebsites.net.
      • Per Distribuire il codice o l'immagine del contenitore? selezionare la modalità di pubblicazione: Codice o Immagine contenitore.
      • Per Stack di runtime selezionare uno stack di runtime.
      • Per Versione selezionare la versione dello stack di runtime.
      • In Area selezionare l'area in cui si vuole creare l'app per le funzioni.
    • In Sistema operativo selezionare il tipo di sistema operativo attualmente usato. Azure consiglia il tipo di sistema operativo in base alla selezione dello stack di runtime.
    • In Hosting selezionare il tipo di piano che si vuole usare per l'app per le funzioni. Scegliere tra le opzioni seguenti:
      • Consumo (serverless): per il ridimensionamento basato su eventi per il costo più basso.
      • Funzioni Premium: per applicazioni serverless a livello aziendale con scalabilità basata su eventi e isolamento di rete.
      • servizio app piano: per riutilizzare il calcolo da un piano di servizio app Azure esistente.

    Screenshot of the Create Function App page in the Azure portal.

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

È ora possibile creare una funzione:

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

    Screenshot of the Create function pane.

  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 della funzione.
    • Per Livello di autorizzazione selezionare Funzione.
  5. Seleziona Crea.

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

    Screenshot of the Code + Test page for a function.

  7. Aggiornare lo script e selezionare Salva.

Configurare l'autenticazione

Per usare i cmdlet di 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 di come implementare l'autenticazione con Funzioni di Azure. Esistono altri modi per eseguire la stessa azione.

Lo script di PowerShell seguente crea un file di chiave denominato PassEncryptKey.key Fornisce anche una versione crittografata della password fornita. Questa password è la stessa password definita per l'applicazione 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, usare i AzureClientIDvalori , AzureTenante AzureCredPassword dell'applicazione. Se non è disponibile, passare alla sezione Archiviare le variabili di ambiente.

AzureClientID

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

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

    $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 usata quando si crea l'applicazione deve essere la stessa password creata in precedenza quando è stato salvato il file di 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 di PowerShell seguente:

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

AzureCredPassword

Il valore della variabile di AzureCredPassword ambiente è il valore ottenuto dall'esecuzione dell'esempio di PowerShell seguente. Questo esempio è lo stesso illustrato nella sezione Precedente Configurare l'autenticazione . Il valore necessario è l'output della $Encryptedpassword variabile. Questo output è la password dell'entità servizio crittografata usando 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 Configurations Application settings (Impostazioni applicazione configurazioni>).

    Screenshot of the tab for application settings.

  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

Eseguire ora chiamate a Network Watcher dall'interno della 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 periodicamente il polling dell'acquisizione di pacchetti fino al completamento.
  5. Notificare all'utente che la sessione di acquisizione di pacchetti è completa.

L'esempio seguente è il codice di PowerShell che è possibile usare nella funzione . È necessario sostituire i valori per subscriptionId, resourceGroupNamee 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 
    } 
} 

Usare 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 gli avvisi per notificare agli utenti quando una metrica specifica supera una soglia assegnata. In questo esempio l'avviso si trova nella metrica Network Out Total inviata, ma è possibile attivare l'avviso per molte altre metriche.

Creare la regola di avviso

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

  1. Nel riquadro Selezionare un segnale cercare il nome del segnale e selezionarlo. In questo esempio Network Out Total è il segnale selezionato. Indica il numero di byte in uscita in tutte le interfacce di rete dalla macchina virtuale.

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

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

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

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

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

    Screenshot of the page for creating an action group and the pane for details about an Azure function.

  7. In Abilita il dispositivo di scorrimento dello schema di avviso comune selezionare No. Selezionare OK.

Esaminare i risultati

Dopo che i criteri attivano un avviso, Network Watcher crea un'acquisizione di pacchetti. Passare a Network Watcher e selezionare Acquisizione pacchetti. In questa pagina è possibile selezionare il collegamento al file per scaricare l'acquisizione di pacchetti.

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

Per istruzioni sul download di file dagli account di archiviazione di Azure, vedere la guida introduttiva per la libreria client Archiviazione BLOB di Azure per .NET. È anche possibile usare lo strumento Archiviazione di Azure Explorer.

Dopo aver scaricato l'acquisizione, è possibile visualizzarla usando strumenti come Wireshark che possono leggere un file con estensione cap .

Passaggio successivo

Informazioni su come visualizzare le acquisizioni di pacchetti leggendo Ispezionare e analizzare i file di acquisizione pacchetti di Network Watcher.