Netwerken proactief bewaken met waarschuwingen en Azure Functions met behulp van pakketopname

Met de functie voor pakketopname van Azure Network Watcher worden opnamesessies gemaakt om verkeer in en uit virtuele machines (VM's) bij te houden. Het capture-bestand kan een filter hebben dat u definieert om alleen het verkeer bij te houden dat u wilt bewaken. Deze gegevens worden opgeslagen in een opslagblob of lokaal op de gastcomputer.

U kunt deze mogelijkheid op afstand starten vanuit andere automatiseringsscenario's, zoals vanuit Azure Functions. U kunt proactieve opnamen uitvoeren op basis van gedefinieerde netwerkafwijkingen. Andere toepassingen zijn het verzamelen van netwerkstatistieken, het ophalen van informatie over netwerkinbraak en foutopsporing van client-/servercommunicatie.

Resources die in Azure worden geïmplementeerd, worden continu uitgevoerd. Het is moeilijk om de status van alle resources altijd actief te bewaken. Wat gebeurt er bijvoorbeeld als er om 2:00 uur een probleem optreedt?

Met behulp van Network Watcher-waarschuwingen en -functies vanuit het Azure-ecosysteem kunt u proactief reageren met de gegevens en hulpprogramma's om problemen in uw netwerk op te lossen.

Vereisten

Scenario

In dit voorbeeld heeft een virtuele machine meer uitgaand verkeer dan normaal en wilt u een waarschuwing ontvangen. U kunt een vergelijkbaar proces gebruiken om waarschuwingen te maken voor elke voorwaarde.

Wanneer een incident een waarschuwing activeert, helpen de gegevens op pakketniveau u te analyseren waarom het uitgaande verkeer is toegenomen. U kunt stappen ondernemen om de virtuele machine terug te zetten naar de oorspronkelijke staat.

In dit scenario wordt ervan uitgegaan dat u een bestaand exemplaar van Network Watcher en een resourcegroep met een geldige virtuele machine hebt.

Dit is de werkstroom voor pakketopname:

  1. Een incident activeert een waarschuwing op uw VIRTUELE machine.
  2. De waarschuwing roept uw Azure-functie aan.
  3. Uw Azure-functie verwerkt de waarschuwing en start een Network Watcher-pakketopnamesessie.
  4. De pakketopname wordt uitgevoerd op de virtuele machine en verzamelt gegevens.
  5. Het pakketopnamebestand wordt geüpload naar een opslagaccount voor beoordeling en diagnose.

Als u dit proces wilt automatiseren, maakt en verbindt u een waarschuwing op uw VIRTUELE machine die moet worden geactiveerd wanneer het incident plaatsvindt. U maakt ook een functie om Network Watcher aan te roepen.

Dit scenario:

  • Hiermee maakt u een Azure-functie waarmee een pakketopname wordt gestart.
  • Hiermee maakt u een waarschuwingsregel op een virtuele machine en configureert u de waarschuwingsregel om de Azure-functie aan te roepen.

Een Azure-functie maken

Als u een Azure-functie wilt maken om de waarschuwing te verwerken en een pakketopname te maken, moet u eerst een functie-app maken:

  1. Meld u aan bij het Azure-portaal.

  2. Voer in het zoekvak boven aan de portal de functie-app in. Selecteer Functie-app in de zoekresultaten.

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

  3. Selecteer + Maken.

  4. Voer op het tabblad Basisbeginselen van Functie-app maken waarden in of selecteer deze voor de volgende instellingen:

    • Selecteer onder Projectdetails het abonnement waarvoor u de functie-app en de resourcegroep wilt maken die de app moet bevatten.
    • Onder Exemplaardetails:
      • Voer voor de naam van de functie-app de naam van de functie-app in. Deze naam wordt toegevoegd aan .azurewebsites.net.
      • Als u code of containerinstallatiekopieën wilt implementeren, selecteert u de publicatiemodus: Code of Containerinstallatiekopieën.
      • Selecteer een runtimestack voor runtimestack.
      • Selecteer bij Versie de versie van de runtimestack.
      • Selecteer voor Regio de regio waarin u de functie-app wilt maken.
    • Selecteer onder Besturingssysteem het type besturingssysteem dat u momenteel gebruikt. Azure raadt het type besturingssysteem aan op basis van uw runtimestackselectie.
    • Selecteer onder Hosting het type abonnement dat u wilt gebruiken voor de functie-app. Kies uit de volgende opties:
      • Verbruik (serverloos): voor gebeurtenisgestuurd schalen voor de laagste kosten.
      • Functions Premium: Voor serverloze toepassingen op ondernemingsniveau met op gebeurtenissen gebaseerde schaalaanpassing en netwerkisolatie.
      • App Service-plan: voor het hergebruik van rekenkracht op basis van een bestaand Azure-app Service-plan.

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

  5. Selecteer Beoordelen en maken om de app te maken.

U kunt nu een functie maken:

  1. Selecteer Functions in de functie-app die u hebt gemaakt en selecteer vervolgens Maken om het deelvenster Functie maken te openen.

    Screenshot of the Create function pane.

  2. Als Ontwikkelomgeving selecteert u Ontwikkelen in portal.

  3. Selecteer onder Selecteer een sjabloon de HTTP-trigger.

  4. In de sectie Sjabloondetails :

    • Voer voor Nieuwe functie de naam van de functie in.
    • Selecteer Functie voor autorisatieniveau.
  5. Selecteer Maken.

  6. Ga naar de functie die u hebt gemaakt en selecteer Code + Test.

    Screenshot of the Code + Test page for a function.

  7. Werk het script bij en selecteer Opslaan.

Verificatie configureren

Als u de PowerShell-cmdlets wilt gebruiken, moet u verificatie configureren in de functie-app. Als u verificatie wilt configureren, moet u omgevingsvariabelen configureren en een versleuteld sleutelbestand uploaden naar de functie-app.

Notitie

Dit scenario biedt slechts één voorbeeld van het implementeren van verificatie met Azure Functions. Er zijn andere manieren om dezelfde actie uit te voeren.

Met het volgende PowerShell-script maakt u een sleutelbestand met de naam PassEncryptKey.key. Het biedt ook een versleutelde versie van het opgegeven wachtwoord. Dit wachtwoord is hetzelfde wachtwoord dat is gedefinieerd voor de Microsoft Entra-toepassing die wordt gebruikt voor verificatie.

#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

Waarden voor omgevingsvariabelen ophalen

Stel de volgende omgevingsvariabelen in die nodig zijn voor toegang tot de waarden voor verificatie:

  • AzureClientID
  • AzureTenant
  • AzureCredPassword

Als u al een toepassings-id hebt, gebruikt u de waarden AzureTenanten AzureCredPassword waarden AzureClientIDvan die toepassing. Als u nog geen omgevingsvariabelen hebt, gaat u verder met de sectie Omgevingsvariabelen opslaan.

AzureClientID

De client-id is de id van een toepassing in Microsoft Entra-id. De client-id ophalen:

  1. Als u nog geen toepassing hebt om te gebruiken, voert u de volgende cmdlet uit om een toepassing te maken:

    $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
    

    Notitie

    Het wachtwoord dat u gebruikt wanneer u de toepassing maakt, moet hetzelfde wachtwoord zijn dat u eerder hebt gemaakt toen u het sleutelbestand opslaat.

  2. Selecteer Abonnementen in de Azure-portal. Selecteer het abonnement dat u wilt gebruiken en selecteer vervolgens Toegangsbeheer (IAM).

  3. Kies het account dat u wilt gebruiken en selecteer vervolgens Eigenschappen. Kopieer de toepassings-id.

AzureTenant

Haal de tenant-id op door de volgende PowerShell-cmdlet uit te voeren:

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

AzureCredPassword

De waarde van de AzureCredPassword omgevingsvariabele is de waarde die u krijgt van het uitvoeren van het volgende PowerShell-voorbeeld. Dit voorbeeld is hetzelfde als in de voorgaande sectie Verificatie configureren. De waarde die u nodig hebt, is de uitvoer van de $Encryptedpassword variabele. Deze uitvoer is het wachtwoord van de service-principal dat u hebt versleuteld met behulp van het PowerShell-script.

#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

De omgevingsvariabelen opslaan

De omgevingsvariabelen opslaan:

  1. Ga naar functie app. Selecteer Toepassingsinstellingen voor configuraties>.

    Screenshot of the tab for application settings.

  2. Voeg de omgevingsvariabelen en de bijbehorende waarden toe aan de app-instellingen en selecteer Opslaan.

PowerShell toevoegen aan de functie

Maak nu aanroepen naar Network Watcher vanuit de Azure-functie. Afhankelijk van de vereisten kan de implementatie van deze functie variëren. De algemene stroom van de code is echter als volgt:

  1. Invoerparameters verwerken.
  2. Query's uitvoeren op bestaande pakketopnamen om limieten te controleren en naamconflicten op te lossen.
  3. Maak een pakketopname met de juiste parameters.
  4. Poll de pakketopname periodiek totdat het is voltooid.
  5. Informeer de gebruiker dat de pakketopnamesessie is voltooid.

Het volgende voorbeeld is PowerShell-code die u in de functie kunt gebruiken. U moet de waarden voor subscriptionId, resourceGroupNameen 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 
    } 
} 

Gebruik de volgende PowerShell-code als u het oude schema gebruikt:

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

Een waarschuwing configureren op een VIRTUELE machine

U kunt waarschuwingen configureren om personen op de hoogte te stellen wanneer een specifieke metrische waarde een drempelwaarde overschrijdt die u eraan hebt toegewezen. In dit voorbeeld bevindt de waarschuwing zich in de metrische waarde Network Out Total die wordt verzonden, maar u kunt de waarschuwing activeren voor veel andere metrische gegevens.

De waarschuwingsregel maken

Ga naar een bestaande virtuele machine en voeg een waarschuwingsregel toe. Voer op de pagina Waarschuwingsregel maken de volgende stappen uit:

  1. Zoek in het deelvenster Een signaal selecteren naar de naam van het signaal en selecteer het. In dit voorbeeld is network out total het geselecteerde signaal. Het geeft het aantal bytes op alle netwerkinterfaces door de virtuele machine aan.

  2. Stel op het tabblad Voorwaarden de volgende waarden in en selecteer vervolgens Volgende: Acties.

    Instelling Value
    Threshold Statisch
    Aggregatietype Gemiddeld
    Operator Groter dan
    Drempelwaarde 3
    Controleer elke 1 minuut
    Terugblikperiode 5 minuten
  3. Selecteer een actiegroep maken op het tabblad Acties.

  4. Selecteer op de pagina Actiegroep maken de waarden Abonnement, Resourcegroep en Regio . Voer ook de naam van de actiegroep en de weergavenaam in en selecteer vervolgens Volgende: Meldingen.

  5. Selecteer Op het tabblad Meldingen, voor actietype, De Azure-functie.

  6. Selecteer in het deelvenster Azure-functie de waarden Abonnement, Resourcegroep, Functie-app en Azure Function .

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

  7. Selecteer Nee in de schuifregelaar Algemeen waarschuwingsschema inschakelen. Selecteer vervolgens OK.

De resultaten bekijken

Nadat de criteria een waarschuwing hebben geactiveerd, maakt Network Watcher een pakketopname. Ga naar Network Watcher en selecteer Pakketopname. Op deze pagina kunt u de bestandskoppeling selecteren om de pakketopname te downloaden.

Als het opnamebestand lokaal is opgeslagen, kunt u het ophalen door u aan te melden bij de virtuele machine.

Zie de quickstart voor de Azure Blob Storage-clientbibliotheek voor .NET voor instructies over het downloaden van bestanden uit Azure Storage-accounts. U kunt ook het hulpprogramma Azure Storage Explorer gebruiken.

Nadat u uw opname hebt gedownload, kunt u deze bekijken met behulp van hulpprogramma's zoals Wireshark die een .cap-bestand kunnen lezen.

Volgende stap

Meer informatie over het weergeven van uw pakketopnamen door Network Watcher-pakketopnamebestanden te lezen en analyseren.