Proaktives Überwachen von Netzwerken mit Warnungen und Azure Functions mithilfe der Paketerfassung

Das Paketerfassungsfeature von Azure Network Watcher erstellt Aufzeichnungssitzungen zum Nachverfolgen von Datenverkehr in und aus virtuellen Computern (VMs). Die Erfassungsdatei kann über einen Filter verfügen, der so definiert ist, dass nur der Datenverkehr nachverfolgt wird, den Sie überwachen möchten. Diese Daten werden in einem Speicherblob oder lokal auf dem Gastcomputer gespeichert.

Sie können diese Funktion remote aus anderen Automatisierungsszenarien starten, z. B. aus Azure Functions. Sie können proaktive Erfassungen basierend auf definierten Netzwerkanomalien ausführen. Weitere Verwendungszwecke sind das Erfassen von Netzwerkstatistiken, das Gewinnen von Informationen zu Netzwerkangriffen, das Debuggen der Kommunikation zwischen Client und Server.

In Azure bereitgestellte Ressourcen werden rund um die Uhr ausgeführt. Es ist schwierig, den Status aller Ressourcen rund um die Uhr lückenlos aktiv zu überwachen. Was geschieht beispielsweise, wenn ein Problem um 2:00 Uhr auftritt?

Durch den Einsatz von Network Watcher, Warnungen und Funktionen im Azure-Ökosystem können Sie mit den entsprechenden Daten und Tools proaktiv reagieren, um Probleme im Netzwerk zu lösen.

Voraussetzungen

Szenario

In diesem Beispiel verfügt ein virtueller Computer (VM) über mehr ausgehenden Datenverkehr als üblich, und Sie möchten benachrichtigt werden. Sie können einen ähnlichen Prozess verwenden, um Warnungen für jede Bedingung zu erstellen.

Wenn ein Vorfall eine Warnung auslöst, können Sie anhand der Daten auf Paketebene analysieren, warum der ausgehende Datenverkehr gestiegen ist. Sie können Schritte ausführen, um den virtuellen Computer in den ursprünglichen Zustand zurück zu versetzen.

Bei diesem Szenario wird angenommen, dass Sie über eine vorhandene Instanz von Network Watcher und eine Ressourcengruppe mit einem gültigen virtuellen Computer verfügen.

Hier ist der Workflow für die Paketerfassung:

  1. Ein Vorfall löst eine Warnung auf Ihrem virtuellen Computer aus.
  2. Die Warnung ruft Ihre Azure-Funktion auf.
  3. Ihre Azure-Funktion verarbeitet die Warnung und startet eine Network Watcher-Paketerfassungssitzung.
  4. Die Paketerfassung wird auf dem virtuellen Computer ausgeführt, und es werden Daten erfasst.
  5. Die Paketerfassungsdatei wird zur Überprüfung und Diagnose in ein Speicherkonto hochgeladen.

Um diesen Prozess zu automatisieren, erstellen und verbinden Sie eine Warnung auf Ihrer VM, die ausgelöst wird, wenn der Vorfall auftritt. Außerdem erstellen Sie eine Funktion, die Network Watcher aufruft.

Dieses Szenario:

  • Es wird eine Azure-Funktion erstellt, die eine Paketerfassung startet.
  • Es wird eine Warnungsregel auf einem virtuellen Computer erstellt, und die Warnungsregel wird zum Aufrufen der Azure-Funktion konfiguriert.

Erstellen einer Azure-Funktion

Um eine Azure-Funktion zu erstellen, um die Warnung zu verarbeiten und eine Paketerfassung zu erstellen, müssen Sie zuerst eine Funktions-App erstellen:

  1. Melden Sie sich beim Azure-Portal an.

  2. Geben Sie im Suchfeld oben im Portal Funktions-App ein. Wählen Sie in den Suchergebnissen Funktions-App aus

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

  3. Wählen Sie + Erstellen aus.

  4. Geben Sie unter Funktions-App erstellen auf der Registerkarte Grundlagen Werte für die folgenden Einstellungen ein, oder wählen Sie sie aus:

    • Wählen Sie unter Projektdetails das Abonnement aus, für das Sie die Funktions-App erstellen möchten, und die Ressourcengruppe, die die App enthalten soll.
    • Gehen Sie unter Instanzendetails wie folgt vor:
      • Geben Sie für den Namender Funktions-App den Namen der Funktions-App ein. Dieser Name wird mit .azurewebsites.netangefügt.
      • Wenn Sie Code oder Containerimage bereitstellen möchten,wählen Sie den Veröffentlichungsmodus aus: Code oder Containerimage.
      • Wählen Sie für den Laufzeitstapel einen Laufzeitstapelaus.
      • Wählen Sie die Version des Runtimestapels in Version aus.
      • Wählen Sie die Region aus, in der Sie die Funktions-App erstellen möchten.
    • Wählen Sie unter Betriebssystem den Typ des Betriebssystems aus, das Sie derzeit verwenden. Azure empfiehlt den Typ des Betriebssystems basierend auf ihrer Laufzeitstapelauswahl.
    • Wählen Sie unter Hosting den Plantyp aus, den Sie für die Funktions-App verwenden möchten. Sie können zwischen folgenden Optionen wählen:
      • Verbrauch (serverlos): Für die ereignisgesteuerte Skalierung mit den geringsten Kosten.
      • Functions Premium: Für serverlose Anwendungen auf Unternehmensebene mit ereignisbasierter Skalierung und Netzwerkisolation.
      • App Service-Plan: Für die Wiederverwendung von Computing aus einem vorhandenen App Service-Plan.

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

  5. Wählen Sie Überprüfen und erstellen aus, um die App zu erstellen.

Jetzt können Sie eine Funktion erstellen:

  1. Wählen Sie in der von Ihnen erstellten Funktions-App auf der Registerkarte Funktionen die Option Erstellen aus, um den Bereich Funktion erstellen zu öffnen.

    Screenshot of the Create function pane.

  2. Wählen Sie für Entwicklungsumgebung die Option Im Portal entwickeln aus.

  3. Wählen Sie unter Vorlage auswählen die Option HTTP-Trigger aus.

  4. Gehen Sie im Abschnitt Vorlagendetails wie folgt vor:

    • Geben Sie für "Neue Funktion" den Namen der Funktion ein.
    • Wählen Sie für die Autorisierungsstufe die Option Funktion aus.
  5. Klicken Sie auf Erstellen.

  6. Wechseln Sie zu der Funktion, die Sie erstellt haben, und wählen Sie Code + Test aus.

    Screenshot of the Code + Test page for a function.

  7. Aktualisieren Sie das Skript, und wählen Sie Speichern aus.

Konfigurieren der Authentifizierung

Um die PowerShell-Cmdlets verwenden zu können, müssen Sie die Authentifizierung in der Funktions-App konfigurieren. Zum Konfigurieren der Authentifizierung müssen Sie Umgebungsvariablen konfigurieren und eine verschlüsselte Schlüsseldatei in die Funktionen-App hochladen.

Hinweis

Dieses Szenario stellt nur ein Beispiel für das Implementieren einer Authentifizierung für Azure Functions dar. Es gibt andere Möglichkeiten, dieselbe Aktion auszuführen.

Das folgende PowerShell-Skript erstellt die Schlüsseldatei PassEncryptKey.key. Außerdem wird eine verschlüsselte Version des bereitgestellten Kennworts zur Verfügung gestellt. Dieses Kennwort ist dasselbe Kennwort, das für die Microsoft Entra-Anwendung definiert ist, die für die Authentifizierung verwendet wird.

#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

Abrufen von Werten für Umgebungsvariablen

Legen Sie die Umgebungsvariablen fest, die für den Zugriff auf die Werte für die Authentifizierung erforderlich sind.

  • AzureClientID
  • AzureTenant
  • AzureCredPassword

Wenn Sie bereits über eine Anwendungs-ID verfügen, verwenden Sie die AzureClientIDWerte AzureTenantund Werte AzureCredPassword dieser Anwendung. Wenn Sie noch keine haben, speichern Sie die Umgebungsvariablen.

AzureClientID

Die Client-ID ist die ID einer Anwendung in der Microsoft Entra-ID. So rufen Sie die Client-ID ab:

  1. Wenn Sie noch nicht über eine zu verwendende Anwendung verfügen, führen Sie das folgende Cmdlet aus, um eine Anwendung zu erstellen.

    $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
    

    Hinweis

    Das beim Erstellen der Anwendung verwendete Kennwort sollte das gleiche sein, das Sie zuvor beim Speichern der Schlüsseldatei erstellt haben.

  2. Wählen Sie im Azure-Portal Abonnements aus. Wählen Sie das zu verwendende Abonnement und dann Zugriffssteuerung (IAM) aus.

  3. Wählen Sie das zu verwendende Konto und dann Eigenschaften aus. Anwendungs-ID kopieren.

AzureTenant

Rufen Sie die Mandaten-ID durch Ausführen des folgenden PowerShell-Cmdlets ab:

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

AzureCredPassword

Der Wert der Umgebungsvariable AzureCredPassword ist der Wert, den Sie durch Ausführen des folgenden PowerShell-Beispiels erhalten. Dieses Beispiel ist identisch mit dem vorherigen Abschnitt Konfigurieren der Authentifizierung. Der wert, den Sie benötigen, ist die Ausgabe der $Encryptedpassword-Variable. Dies ist das Dienstprinzipalkennwort, das mithilfe des PowerShell-Skripts verschlüsselt wurde.

#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

Speichern der Umgebungsvariablen

Speichern der Umgebungsvariablen:

  1. Navigieren Sie zur Funktions-App. Wählen Sie Konfigurationen>Anwendungseinstellungen aus.

    Screenshot of the tab for application settings.

  2. Fügen Sie den App-Einstellungen die Umgebungsvariablen und ihre Werte hinzu, und wählen Sie dann Speichern aus.

Hinzufügen von PowerShell zur Funktion

Nun können Sie über die Azure-Funktion Aufrufe an Network Watcher senden. Die Implementierung dieser Funktion kann je nach den geltenden Anforderungen abweichen. Für den allgemeinen Code gilt aber folgender Ablauf:

  1. Verarbeiten von Eingabeparametern
  2. Abfragen von vorhandenen Paketerfassungen, um Grenzwerte zu überprüfen und Namenskonflikte zu lösen
  3. Erstellen einer Paketerfassung mit den geeigneten Parametern
  4. Regelmäßiges Abfragen der Paketerfassung bis zum Abschluss
  5. Benachrichtigen des Benutzers über den Abschluss der Paketerfassungssitzung

Bei dem folgenden Beispiel handelt es sich um PowerShell-Code, der in der Funktion verwendet werden kann. Sie müssen die Werte für subscriptionId, resourceGroupNameund storageAccountName ersetzen.

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

Verwenden Sie den folgenden PowerShell-Code, wenn Sie das alte Schema verwenden:

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

Konfigurieren einer Warnung auf einem virtuellen Computer

Sie können Warnungen konfigurieren, um Personen zu benachrichtigen, wenn eine bestimmte Metrik einen zugewiesenen Schwellenwert überschreitet. In diesem Beispiel befindet sich die Warnung in der Metrik Netzwerkausgang gesamt, die gesendet wird, aber Sie können die Warnung für viele andere Metriken auslösen.

Erstellen der Warnungsregel

Navigieren Sie zu einem vorhandenen virtuellen Computer, und fügen Sie eine Warnungsregel hinzu. Führen Sie auf der Seite Warnungsregel erstellen die folgenden Schritte aus:

  1. Suchen Sie im Bereich Signal auswählen nach dem Namen des Signals, und wählen Sie ihn aus. In diesem Beispiel ist Ausgehender Netzwerkverkehr gesamt das ausgewählte Signal. Es gibt die Anzahl von Bytes an, die von dem virtuellen Computer an allen Netzwerkschnittstellen gesendet werden.

  2. Legen Sie auf der Registerkarte Bedingungen die folgenden Werte fest, und wählen Sie Weiter: Aktionen aus.

    Einstellung Wert
    Schwellenwert Statisch
    Aggregationstyp Average
    Operator Größer als
    Schwellenwert 3
    Überprüfung alle 1 Minute
    Rückblickperiode 5 Minuten
  3. Wählen Sie auf der Registerkarte Aktionen die Option Aktionsgruppe erstellen aus.

  4. Wählen Sie auf dem Bildschirm Aktionsgruppe erstellen die Optionen Abonnement, Ressourcengruppe und Region aus. Geben Sie außerdem den Namen der Aktionsgruppe und den Anzeigenamen ein, und wählen Sie Weiter: Benachrichtigungen aus.

  5. Wählen Sie auf der Registerkarte Benachrichtigungen für den AktionstypAzure-Funktion aus.

  6. Wählen Sie im Bereich Azure-Funktion die Optionen Abonnement, Ressourcengruppe, Funktions-App und Azure-Funktion aus.

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

  7. Wählen Sie im Schieberegler Allgemeine Warnungsschema aktivieren die Option Nein aus. Wählen Sie dann OK aus.

Überprüfen der Ergebnisse

Nachdem die Kriterien eine Warnung ausgelöst haben, erstellt Network Watcher eine Paketerfassung. Wechseln Sie zu Network Watcher, und wählen Sie Paketerfassung aus. Auf dieser Seite können Sie den Link auswählen, um die Paketerfassung herunterzuladen.

Wenn die Erfassungsdatei lokal gespeichert ist, können Sie sie abrufen, indem Sie sich auf dem virtuellen Computer anmelden.

Anweisungen zum Herunterladen von Dateien aus Azure-Speicherkonten finden Sie in der Schnellstartanleitung für die Azure Blob Storage-Clientbibliothek für .NET. Sie können auch das Tool Azure Storage-Explorer verwenden.

Nachdem Sie Ihr Capture heruntergeladen haben, können Sie es mit Tools wie Wireshark ansehen, die eine .cap-Datei lesen können.

Nächster Schritt

Erfahren Sie, wie Sie Ihre Paketerfassungen anzeigen, indem Sie Die Dateien der Netzwerküberwachungspakete überprüfen und analysieren.