Övervaka nätverk proaktivt med aviseringar och Azure Functions med hjälp av paketinsamling

Paketinsamlingsfunktionen i Azure Network Watcher skapar avbildningssessioner för att spåra trafik in och ut från virtuella datorer (VM). Avbildningsfilen kan ha ett filter som du definierar för att endast spåra den trafik som du vill övervaka. Dessa data lagras i en lagringsblob eller lokalt på gästdatorn.

Du kan starta den här funktionen via fjärranslutning från andra automatiseringsscenarier, till exempel från Azure Functions. Du kan köra proaktiva avbildningar baserat på definierade nätverksavvikelser. Andra användningsområden är att samla in nätverksstatistik, hämta information om nätverksintrång och felsöka klient-/serverkommunikation.

Resurser som distribueras i Azure körs kontinuerligt. Det är svårt att aktivt övervaka statusen för alla resurser hela tiden. Vad händer till exempel om ett problem inträffar kl. 02:00?

Genom att använda Network Watcher-aviseringar och funktioner inifrån Azure-ekosystemet kan du proaktivt svara med data och verktyg för att lösa problem i nätverket.

Förutsättningar

Scenario

I det här exemplet har en virtuell dator mer utgående trafik än vanligt och du vill bli varnad. Du kan använda en liknande process för att skapa aviseringar för alla villkor.

När en incident utlöser en avisering hjälper data på paketnivå dig att analysera varför den utgående trafiken ökade. Du kan vidta åtgärder för att återställa den virtuella datorn till dess ursprungliga tillstånd.

Det här scenariot förutsätter att du har en befintlig instans av Network Watcher och en resursgrupp med en giltig virtuell dator.

Här är arbetsflödet för paketinsamling:

  1. En incident utlöser en avisering på den virtuella datorn.
  2. Aviseringen anropar din Azure-funktion.
  3. Din Azure-funktion bearbetar aviseringen och startar en network watcher-paketinsamlingssession.
  4. Paketinsamlingen körs på den virtuella datorn och samlar in data.
  5. Paketinsamlingsfilen laddas upp till ett lagringskonto för granskning och diagnos.

För att automatisera den här processen skapar och ansluter du en avisering på den virtuella datorn som ska utlösas när incidenten inträffar. Du kan också skapa en funktion för att anropa Network Watcher.

Det här scenariot:

  • Skapar en Azure-funktion som startar en paketinsamling.
  • Skapar en aviseringsregel på en virtuell dator och konfigurerar aviseringsregeln för att anropa Azure-funktionen.

Skapa en Azure-funktion

Om du vill skapa en Azure-funktion för att bearbeta aviseringen och skapa en paketinsamling måste du först skapa en funktionsapp:

  1. Logga in på Azure-portalen.

  2. I sökrutan överst i portalen anger du funktionsapp. Välj Funktionsapp i sökresultaten.

    Skärmbild som visar hur du söker efter funktionsappar i Azure-portalen.

  3. Välj + Skapa.

  4. På fliken Grundläggande i Skapa funktionsapp anger eller väljer du värden för följande inställningar:

    • Under Projektinformation väljer du den prenumeration som du vill skapa funktionsappen för och resursgruppen som ska innehålla appen.
    • Under Instansinformation:
      • För Funktionsappens namn anger du namnet på funktionsappen. Det här namnet läggs till med .azurewebsites.net.
      • För Vill du distribuera kod eller containeravbildning? väljer du publiceringsläget: Kod eller Containeravbildning.
      • För Körningsstack väljer du en körningsstack.
      • För Version väljer du versionen av körningsstacken.
      • För Region väljer du den region där du vill skapa funktionsappen.
    • Under Operativsystem väljer du den typ av operativsystem som du använder för närvarande. Azure rekommenderar typen av operativsystem baserat på valet av körningsstack.
    • Under Värd väljer du den typ av plan som du vill använda för funktionsappen. Välj bland följande alternativ:
      • Förbrukning (serverlös): För händelsedriven skalning till lägsta kostnad.
      • Functions Premium: För serverlösa program på företagsnivå med händelsebaserad skalning och nätverksisolering.
      • App Service-plan: För återanvändning av beräkning från en befintlig Azure App Service-plan.

    Skärmbild av sidan Skapa funktionsapp i Azure-portalen.

  5. Välj Granska + skapa för att skapa appen.

Nu kan du skapa en funktion:

  1. I funktionsappen som du skapade väljer du Funktioner och sedan Skapa för att öppna funktionsfönstret Skapa.

    Skärmbild av fönstret Skapa funktion.

  2. I Utvecklingsmiljö väljer du Utveckla i portal.

  3. Under Välj en mall väljer du HTTP-utlösare.

  4. I avsnittet Mallinformation:

    • För Ny funktion anger du namnet på funktionen.
    • För auktoriseringsnivå väljer du Funktion.
  5. Välj Skapa.

  6. Gå till den funktion som du skapade och välj Kod + Test.

    Skärmbild av sidan Kod + test för en funktion.

  7. Uppdatera skriptet och välj Spara.

Konfigurera autentisering

Om du vill använda PowerShell-cmdletarna måste du konfigurera autentisering i funktionsappen. För att konfigurera autentisering måste du konfigurera miljövariabler och ladda upp en krypterad nyckelfil till funktionsappen.

Kommentar

Det här scenariot innehåller bara ett exempel på hur du implementerar autentisering med Azure Functions. Det finns andra sätt att utföra samma åtgärd.

Följande PowerShell-skript skapar en nyckelfil med namnet PassEncryptKey.key. Den innehåller också en krypterad version av det angivna lösenordet. Det här lösenordet är samma lösenord som har definierats för Microsoft Entra-programmet som används för autentisering.

#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

Hämta värden för miljövariabler

Konfigurera följande miljövariabler, som är nödvändiga för att få åtkomst till värdena för autentisering:

  • AzureClientID
  • AzureTenant
  • AzureCredPassword

Om du redan har ett program-ID använder du AzureClientIDvärdena , AzureTenantoch för AzureCredPassword det programmet. Om du inte har någon fortsätter du till avsnittet Lagra miljövariabler .

AzureClientID

Klient-ID:t är ID för ett program i Microsoft Entra-ID. Så här hämtar du klient-ID:t:

  1. Om du inte redan har ett program att använda kör du följande cmdlet för att skapa ett program:

    $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
    

    Kommentar

    Lösenordet som du använder när du skapar programmet ska vara samma lösenord som du skapade tidigare när du sparade nyckelfilen.

  2. I Azure-portalen väljer du Prenumerationer. Välj den prenumeration som ska användas och välj sedan Åtkomstkontroll (IAM)..

  3. Välj det konto som ska användas och välj sedan Egenskaper. Kopiera app-ID.

AzureTenant

Hämta klientorganisations-ID:t genom att köra följande PowerShell-cmdlet:

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

AzureCredPassword

Värdet för AzureCredPassword miljövariabeln är det värde som du får från att köra följande PowerShell-exempel. Det här exemplet är samma som föregående avsnitt konfigurera autentisering visade. Det värde som du behöver är utdata för variabeln $Encryptedpassword . Det här utdata är lösenordet för tjänstens huvudnamn som du krypterade med hjälp av PowerShell-skriptet.

#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

Lagra miljövariablerna

Så här lagrar du miljövariablerna:

  1. Gå till funktionsappen. Välj Konfigurationer>Programinställningar.

    Skärmbild av fliken för programinställningar.

  2. Lägg till miljövariablerna och deras värden i appinställningarna och välj sedan Spara.

Lägga till PowerShell i funktionen

Gör nu anrop till Network Watcher inifrån Azure-funktionen. Beroende på kraven kan implementeringen av den här funktionen variera. Det allmänna flödet för koden är dock följande:

  1. Bearbeta indataparametrar.
  2. Fråga befintliga paketinsamlingar för att verifiera gränser och lösa namnkonflikter.
  3. Skapa en paketinsamling med lämpliga parametrar.
  4. Avsök paketinsamlingen regelbundet tills den är klar.
  5. Meddela användaren att paketinsamlingssessionen är klar.

Följande exempel är PowerShell-kod som du kan använda i funktionen. Du måste ersätta värdena för subscriptionId, resourceGroupNameoch 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 
    } 
} 

Använd följande PowerShell-kod om du använder det gamla schemat:

# 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 
    } 
}                               

Konfigurera en avisering på en virtuell dator

Du kan konfigurera aviseringar för att meddela enskilda personer när ett visst mått överskrider ett tröskelvärde som du har tilldelat till det. I det här exemplet finns aviseringen på måttet Network Out Total som skickas, men du kan utlösa aviseringen för många andra mått.

Skapa aviseringsregeln

Gå till en befintlig virtuell dator och lägg till en aviseringsregel. På sidan Skapa en aviseringsregel utför du följande steg:

  1. I fönstret Välj en signal söker du efter namnet på signalen och väljer den. I det här exemplet är Network Out Total den valda signalen. Det anger antalet byte som visas i alla nätverksgränssnitt av den virtuella datorn.

  2. På fliken Villkor anger du följande värden och väljer sedan Nästa: Åtgärder.

    Inställning Värde
    Threshold Statisk
    Sammansättningstyp Genomsnitt
    Operator Större än
    Tröskelvärdet 3
    Kontrollera varje 1 minut
    Återblicksperiod 5 minuter
  3. På fliken Åtgärder väljer du Skapa en åtgärdsgrupp.

  4. På sidan Skapa åtgärdsgrupp väljer du värdena Prenumeration, Resursgrupp och Region . Ange även åtgärdsgruppens namn och visningsnamn och välj sedan Nästa: Meddelanden.

  5. Välj Azure-funktion för Åtgärdstyp på fliken Meddelanden.

  6. I fönstret Azure-funktion väljer du värdena Prenumeration, Resursgrupp, Funktionsapp och Azure-funktion .

    Skärmbild av sidan för att skapa en åtgärdsgrupp och fönstret för information om en Azure-funktion.

  7. I Skjutreglaget Aktivera det vanliga aviseringsschemat väljer du Nej. Välj sedan OK.

Granska resultaten

När villkoret utlöser en avisering skapar Network Watcher en paketinsamling. Gå till Network Watcher och välj Paketinsamling. På den här sidan kan du välja fillänken för att ladda ned paketinsamlingen.

Om avbildningsfilen lagras lokalt kan du hämta den genom att logga in på den virtuella datorn.

Anvisningar om hur du laddar ned filer från Azure Storage-konton finns i snabbstarten för Azure Blob Storage-klientbiblioteket för .NET. Du kan också använda Azure Storage Explorer-verktyget .

När du har laddat ned avbildningen kan du visa den med hjälp av verktyg som Wireshark som kan läsa en .cap-fil .

Gå vidare

Lär dig hur du visar dina paketinsamlingar genom att läsa Granska och analysera insamlingsfiler för Network Watcher-paket.