Proaktywne monitorowanie sieci przy użyciu alertów i usługi Azure Functions przy użyciu funkcji przechwytywania pakietów

Funkcja przechwytywania pakietów w usłudze Azure Network Watcher tworzy sesje przechwytywania w celu śledzenia ruchu przychodzącego i wychodzącego z maszyn wirtualnych. Plik przechwytywania może mieć zdefiniowany filtr do śledzenia tylko ruchu, który chcesz monitorować. Te dane są przechowywane w obiekcie blob magazynu lub lokalnie na maszynie gościa.

Tę funkcję można uruchomić zdalnie z innych scenariuszy automatyzacji, takich jak z usługi Azure Functions. Aktywne przechwytywanie można uruchamiać na podstawie zdefiniowanych anomalii sieciowych. Inne zastosowania obejmują zbieranie statystyk sieciowych, uzyskiwanie informacji o włamaniach sieciowych i debugowanie komunikacji klienta/serwera.

Zasoby wdrażane na platformie Azure są stale uruchamiane. Trudno jest aktywnie monitorować stan wszystkich zasobów przez cały czas. Na przykład co się stanie, jeśli wystąpi problem o godzinie 2:00?

Korzystając z alertów i funkcji usługi Network Watcher z poziomu ekosystemu platformy Azure, możesz aktywnie reagować na dane i narzędzia, aby rozwiązać problemy w sieci.

Wymagania wstępne

Scenariusz

W tym przykładzie maszyna wirtualna ma większy ruch wychodzący niż zwykle i chcesz otrzymywać alerty. Możesz użyć podobnego procesu, aby utworzyć alerty dla dowolnego warunku.

Gdy zdarzenie wyzwoli alert, dane na poziomie pakietu ułatwiają analizowanie, dlaczego ruch wychodzący wzrósł. Możesz wykonać kroki, aby przywrócić oryginalną maszynę wirtualną.

W tym scenariuszu przyjęto założenie, że masz istniejące wystąpienie usługi Network Watcher i grupę zasobów z prawidłową maszyną wirtualną.

Oto przepływ pracy przechwytywania pakietów:

  1. Zdarzenie wyzwala alert na maszynie wirtualnej.
  2. Alert wywołuje funkcję platformy Azure.
  3. Funkcja platformy Azure przetwarza alert i uruchamia sesję przechwytywania pakietów usługi Network Watcher.
  4. Przechwytywanie pakietów jest uruchamiane na maszynie wirtualnej i zbiera dane.
  5. Plik przechwytywania pakietów jest przekazywany do konta magazynu w celu przeglądu i diagnostyki.

Aby zautomatyzować ten proces, utworzysz i połączysz alert na maszynie wirtualnej, który zostanie wyzwolony po wystąpieniu zdarzenia. Utworzysz również funkcję w celu wywołania usługi Network Watcher.

Ten scenariusz:

  • Tworzy funkcję platformy Azure, która uruchamia przechwytywanie pakietów.
  • Tworzy regułę alertu na maszynie wirtualnej i konfiguruje regułę alertu w celu wywołania funkcji platformy Azure.

Tworzenie funkcji platformy Azure

Aby utworzyć funkcję platformy Azure w celu przetworzenia alertu i utworzenia przechwytywania pakietów, należy najpierw utworzyć aplikację funkcji:

  1. Zaloguj się w witrynie Azure Portal.

  2. W polu wyszukiwania w górnej części portalu wprowadź ciąg aplikacja funkcji. Wybierz pozycję Aplikacja funkcji z wyników wyszukiwania.

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

  3. Wybierz + Utwórz.

  4. Na karcie Podstawy tworzenia aplikacji funkcji wprowadź lub wybierz wartości dla następujących ustawień:

    • W obszarze Project Details (Szczegóły projektu) wybierz subskrypcję, dla której chcesz utworzyć aplikację funkcji i grupę zasobów, która ma zawierać aplikację.
    • W obszarze Szczegóły wystąpienia:
      • W polu Nazwa aplikacji funkcji wprowadź nazwę aplikacji funkcji. Ta nazwa jest dołączana do pliku .azurewebsites.net.
      • W obszarze Czy chcesz wdrożyć kod lub obraz kontenera?, wybierz tryb publikowania: kod lub obraz kontenera.
      • W polu Stos środowiska uruchomieniowego wybierz stos środowiska uruchomieniowego.
      • W polu Wersja wybierz wersję stosu środowiska uruchomieniowego.
      • W obszarze Region wybierz region, w którym chcesz utworzyć aplikację funkcji.
    • W obszarze System operacyjny wybierz typ aktualnie używanego systemu operacyjnego. Platforma Azure zaleca typ systemu operacyjnego na podstawie wyboru stosu środowiska uruchomieniowego.
    • W obszarze Hosting wybierz typ planu, którego chcesz użyć dla aplikacji funkcji. Wybierz jedną z następujących opcji:
      • Zużycie (bezserwerowe): w przypadku skalowania opartego na zdarzeniach dla najniższego kosztu.
      • Functions Premium: w przypadku aplikacji bezserwerowych na poziomie przedsiębiorstwa ze skalowaniem opartym na zdarzeniach i izolacją sieci.
      • Plan usługi App Service: w celu ponownego opracowywania zasobów obliczeniowych z istniejącego planu usługi aplikacja systemu Azure Service.

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

  5. Wybierz pozycję Przejrzyj i utwórz , aby utworzyć aplikację.

Teraz możesz utworzyć funkcję:

  1. W utworzonej aplikacji funkcji wybierz pozycję Funkcje, a następnie wybierz pozycję Utwórz , aby otworzyć okienko Tworzenie funkcji .

    Screenshot of the Create function pane.

  2. Dla ustawienia Środowisko deweloperskie wybierz pozycję Programuj w portalu.

  3. W obszarze Wybierz szablon wybierz pozycję Wyzwalacz HTTP.

  4. W sekcji Szczegóły szablonu:

    • W polu Nowa funkcja wprowadź nazwę funkcji.
    • W obszarze Poziom autoryzacji wybierz pozycję Funkcja.
  5. Wybierz pozycję Utwórz.

  6. Przejdź do utworzonej funkcji i wybierz pozycję Kod i testowanie.

    Screenshot of the Code + Test page for a function.

  7. Zaktualizuj skrypt i wybierz pozycję Zapisz.

Konfiguruj uwierzytelnianie

Aby użyć poleceń cmdlet programu PowerShell, należy skonfigurować uwierzytelnianie w aplikacji funkcji. Aby skonfigurować uwierzytelnianie, należy skonfigurować zmienne środowiskowe i przekazać zaszyfrowany plik klucza do aplikacji funkcji.

Uwaga

Ten scenariusz zawiera tylko jeden przykład implementacji uwierzytelniania za pomocą usługi Azure Functions. Istnieją inne sposoby wykonania tej samej akcji.

Poniższy skrypt programu PowerShell tworzy plik klucza o nazwie PassEncryptKey.key. Zapewnia również zaszyfrowaną wersję podanego hasła. To hasło jest tym samym hasłem zdefiniowanym dla aplikacji Microsoft Entra, która jest używana do uwierzytelniania.

#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

Pobieranie wartości zmiennych środowiskowych

Skonfiguruj następujące zmienne środowiskowe, które są niezbędne do uzyskania dostępu do wartości uwierzytelniania:

  • AzureClientID
  • AzureTenant
  • AzureCredPassword

Jeśli masz już identyfikator aplikacji, użyj AzureClientIDwartości , AzureTenanti AzureCredPassword tej aplikacji. Jeśli go nie masz, przejdź do sekcji Przechowywanie zmiennych środowiskowych.

AzureClientID

Identyfikator klienta jest identyfikatorem aplikacji w usłudze Microsoft Entra ID. Aby uzyskać identyfikator klienta:

  1. Jeśli nie masz jeszcze aplikacji do użycia, uruchom następujące polecenie cmdlet, aby utworzyć aplikację:

    $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
    

    Uwaga

    Hasło używane podczas tworzenia aplikacji powinno być tym samym hasłem utworzonym wcześniej podczas zapisywania pliku klucza.

  2. W witrynie Azure Portal wybierz pozycję Subskrypcje. Wybierz subskrypcję do użycia, a następnie wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami).

  3. Wybierz konto do użycia, a następnie wybierz pozycję Właściwości. Skopiuj identyfikator aplikacji.

AzureTenant

Pobierz identyfikator dzierżawy, uruchamiając następujące polecenie cmdlet programu PowerShell:

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

AzureCredPassword

Wartość zmiennej środowiskowej AzureCredPassword to wartość uzyskana z uruchamiania następującego przykładu programu PowerShell. Ten przykład jest taki sam, jak pokazano w poprzedniej sekcji Konfigurowanie uwierzytelniania . Potrzebna wartość to dane wyjściowe zmiennej $Encryptedpassword . Te dane wyjściowe to hasło jednostki usługi szyfrowane przy użyciu skryptu programu 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

Przechowywanie zmiennych środowiskowych

Aby przechowywać zmienne środowiskowe:

  1. Przejdź do aplikacji funkcji. Wybierz pozycję Konfiguracje>Ustawienia aplikacji.

    Screenshot of the tab for application settings.

  2. Dodaj zmienne środowiskowe i ich wartości do ustawień aplikacji, a następnie wybierz pozycję Zapisz.

Dodawanie programu PowerShell do funkcji

Teraz wykonaj wywołania usługi Network Watcher z poziomu funkcji platformy Azure. W zależności od wymagań implementacja tej funkcji może się różnić. Jednak ogólny przepływ kodu jest następujący:

  1. Przetwarzanie parametrów wejściowych.
  2. Wykonywanie zapytań dotyczących istniejących przechwytywania pakietów w celu zweryfikowania limitów i rozwiązania konfliktów nazw.
  3. Utwórz przechwytywanie pakietów z odpowiednimi parametrami.
  4. Sonduj przechwytywanie pakietów okresowo, dopóki nie zostanie ukończone.
  5. Powiadom użytkownika o zakończeniu sesji przechwytywania pakietów.

W poniższym przykładzie przedstawiono kod programu PowerShell, którego można użyć w funkcji . Należy zastąpić wartości , subscriptionIdresourceGroupNamei 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 
    } 
} 

Jeśli używasz starego schematu, użyj następującego kodu programu PowerShell:

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

Konfigurowanie alertu na maszynie wirtualnej

Alerty można skonfigurować tak, aby powiadamiały osoby, gdy określona metryka przekroczy przypisany do niej próg. W tym przykładzie alert znajduje się w wysłanej metryce Łączna suma sieci, ale możesz wyzwolić alert dla wielu innych metryk.

Tworzenie reguły alertu

Przejdź do istniejącej maszyny wirtualnej i dodaj regułę alertu. Na stronie Tworzenie reguły alertu wykonaj następujące kroki:

  1. W okienku Wybierz sygnał wyszukaj nazwę sygnału i wybierz go. W tym przykładzie łączna wartość network out jest wybranym sygnałem. Określa liczbę bajtów na wszystkich interfejsach sieciowych przez maszynę wirtualną.

  2. Na karcie Warunki ustaw następujące wartości, a następnie wybierz pozycję Dalej: Akcje.

    Ustawienie Wartość
    Threshold Static
    Typ agregacji Średnia
    Operator Większe niż
    Wartość progowa 3
    Sprawdź co 1 minuta
    Okres wyszukiwania 5 min
  3. Na karcie Akcje wybierz pozycję Utwórz grupę akcji.

  4. Na stronie Tworzenie grupy akcji wybierz wartości Subskrypcja, Grupa zasobów i Region. Wprowadź również nazwę grupy akcji i nazwę wyświetlaną, a następnie wybierz pozycję Dalej: Powiadomienia.

  5. Na karcie Powiadomienia w polu Typ akcji wybierz pozycję Funkcja platformy Azure.

  6. W okienku Funkcja platformy Azure wybierz wartości Subskrypcja, Grupa zasobów, Aplikacja funkcji i Funkcja platformy Azure.

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

  7. W obszarze Włącz suwak wspólnego schematu alertu wybierz pozycję Nie. Następnie wybierz opcję OK.

Sprawdzanie wyników

Po wyzwoleniu alertu przez kryteria usługa Network Watcher tworzy przechwytywanie pakietów. Przejdź do usługi Network Watcher i wybierz pozycję Przechwytywanie pakietów. Na tej stronie możesz wybrać link do pliku, aby pobrać przechwytywanie pakietów.

Jeśli plik przechwytywania jest przechowywany lokalnie, możesz go uzyskać, logując się do maszyny wirtualnej.

Aby uzyskać instrukcje dotyczące pobierania plików z kont usługi Azure Storage, zobacz przewodnik Szybki start dotyczący biblioteki klienta usługi Azure Blob Storage dla platformy .NET. Możesz również użyć narzędzia Eksplorator usługi Azure Storage.

Po pobraniu przechwytywania można go wyświetlić przy użyciu narzędzi, takich jak Wireshark , które mogą odczytywać plik cap .

Następny krok

Dowiedz się, jak wyświetlać przechwytywane pakiety, czytając artykuł Inspect and analyze Network Watcher packet capture files (Inspekcja i analizowanie plików przechwytywania pakietów usługi Network Watcher).