Ö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
- Den senaste versionen av Azure PowerShell.
- En befintlig instans av Network Watcher. Om du inte redan har en skapar du en instans av Network Watcher.
- En befintlig virtuell dator i samma region som Network Watcher med Windows-tillägget eller tillägget för virtuella Linux-datorer.
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:
- En incident utlöser en avisering på den virtuella datorn.
- Aviseringen anropar din Azure-funktion.
- Din Azure-funktion bearbetar aviseringen och startar en network watcher-paketinsamlingssession.
- Paketinsamlingen körs på den virtuella datorn och samlar in data.
- 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:
Logga in på Azure-portalen.
I sökrutan överst i portalen anger du funktionsapp. Välj Funktionsapp i sökresultaten.
Välj + Skapa.
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.
Välj Granska + skapa för att skapa appen.
Nu kan du skapa en funktion:
I funktionsappen som du skapade väljer du Funktioner och sedan Skapa för att öppna funktionsfönstret Skapa.
I Utvecklingsmiljö väljer du Utveckla i portal.
Under Välj en mall väljer du HTTP-utlösare.
I avsnittet Mallinformation:
- För Ny funktion anger du namnet på funktionen.
- För auktoriseringsnivå väljer du Funktion.
Välj Skapa.
Gå till den funktion som du skapade och välj Kod + Test.
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 AzureClientID
värdena , AzureTenant
och 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:
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.
I Azure Portal väljer du Prenumerationer. Välj den prenumeration som ska användas och välj sedan Åtkomstkontroll (IAM)..
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:
Gå till funktionsappen. Välj Konfigurationer>Programinställningar.
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:
- Bearbeta indataparametrar.
- Fråga befintliga paketinsamlingar för att verifiera gränser och lösa namnkonflikter.
- Skapa en paketinsamling med lämpliga parametrar.
- Avsök paketinsamlingen regelbundet tills den är klar.
- 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
, resourceGroupName
och 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:
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.
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 På fliken Åtgärder väljer du Skapa en åtgärdsgrupp.
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.
Välj Azure-funktion för Åtgärdstyp på fliken Meddelanden.
I fönstret Azure-funktion väljer du värdena Prenumeration, Resursgrupp, Funktionsapp och Azure-funktion .
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.