Surveillez les réseaux de manière proactive avec des alertes et Azure Functions en utilisant la capture de paquets

La fonctionnalité de capture de paquets d'Azure Network Watcher crée des sessions de capture pour suivre le trafic entrant et sortant des machines virtuelles (VMs). Le fichier de capture peut comporter un filtre que vous définissez pour suivre uniquement le trafic que vous souhaitez surveiller. Ces données sont stockées dans un objet blob de stockage ou localement sur l’ordinateur invité.

Vous pouvez démarrer cette fonctionnalité à distance à partir d’autres scénarios d’automatisation, comme Azure Functions. Vous pouvez exécuter des captures proactives basées sur des anomalies réseau définies. D'autres utilisations incluent la collecte de statistiques réseau, l'obtention d'informations sur les intrusions réseau et le débogage des communications client/serveur.

Les ressources déployées dans Azure s’exécutent en continu. Il est difficile de surveiller activement l'état de toutes les ressources à tout moment. Par exemple, que se passe-t-il si un problème survient à 2h00 du matin ?

En utilisant les alertes et les fonctions Network Watcher au sein de l’écosystème Azure, vous pouvez réagir de manière proactive avec les données et les outils nécessaires pour résoudre les problèmes de votre réseau.

Prérequis

Scénario

Dans cet exemple, une machine virtuelle a plus de trafic sortant que d'habitude et vous souhaitez être alerté. Vous pouvez utiliser un processus similaire pour créer des alertes pour n’importe quelle condition.

Lorsqu'un incident déclenche une alerte, les données au niveau des paquets vous aident à analyser pourquoi le trafic sortant a augmenté. Vous pouvez prendre des mesures pour rétablir la machine virtuelle à son état d’origine.

Ce scénario suppose que vous possédez une instance existante de Network Watcher, ainsi qu’un groupe de ressources avec une machine virtuelle valide.

Voici le workflow pour la capture de paquets :

  1. Un incident déclenche une alerte sur votre VM.
  2. L’alerte appelle votre fonction Azure.
  3. Votre fonction Azure traite l’alerte et démarre une session de capture de paquets Network Watcher.
  4. La capture de paquets s’exécute sur la machine virtuelle et collecte les données.
  5. Le fichier de capture de paquets est chargé vers un compte de stockage afin de subir un examen et un diagnostic.

Pour automatiser ce processus, vous créez et connectez une alerte sur votre VM qui sera déclenchée lorsque l'incident se produit. Vous créez également une fonction pour appeler Network Watcher.

Ce scénario :

  • crée une fonction Azure qui démarrera une capture de paquets ;
  • crée une règle d’alerte sur une machine virtuelle et configure la règle d’alerte pour appeler la fonction Azure.

Création d’une fonction Azure

Pour créer une fonction Azure afin de traiter l'alerte et de créer une capture de paquets, vous devez d'abord créer une application de fonction :

  1. Connectez-vous au portail Azure.

  2. Dans la zone de recherche en haut du portail, entrez application de fonction. Sélectionnez Function App dans les résultats de la recherche.

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

  3. Sélectionnez + Créer.

  4. Dans l'onglet Bases de Créer Function App, entrez ou sélectionnez des valeurs pour les paramètres suivants :

    • Sous Détails du Projet, sélectionnez l’abonnement pour lequel vous souhaitez créer l’application de fonction et le groupe de ressources pour contenir l’application.
    • Sous Détails de l’instance :
      • Pour nom de Function App, saisissez le nom de l’application de fonction. Ce nom est ajouté avec .azurewebsites.net.
      • Pour voulez-vous déployer du code ou une image conteneur ?, sélectionnez le mode de publication : Code ou image conteneur.
      • Pour pile runtime, sélectionnez une pile d’exécution.
      • Pour version, sélectionnez la version de la pile d’exécution.
      • Pour région, sélectionnez la région dans laquelle vous souhaitez créer l’application de fonction.
    • Sous système d’exploitation, sélectionnez le type de système d’exploitation que vous utilisez actuellement. Azure recommande le type de système d’exploitation en fonction de votre sélection de pile d’exécution.
    • Sous hébergement, sélectionnez le type de plan que vous souhaitez utiliser pour l’application de fonction. Choisissez parmi les options suivantes :
      • Consommation (serverless): pour la mise à l’échelle pilotée par les événements pour les coûts les plus bas.
      • Functions Premium : pour les applications serverless de niveau entreprise avec mise à l’échelle basée sur les événements et l’isolation réseau.
      • plan App Service : pour réutiliser le calcul à partir d’un plan Azure App Service existant.

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

  5. Sélectionnez Vérifier + créer pour créer l’application.

Vous pouvez maintenant créer une fonction :

  1. Dans l’application de fonction que vous avez créée, sélectionnez Functions, puis sélectionnez Créer pour ouvrir le volet Créer une fonction.

    Screenshot of the Create function pane.

  2. En regard de Environnement de développement, sélectionnez Déveloper dans le portail.

  3. Sous Sélectionner un modèle, sélectionnez Déclencheur HTTP.

  4. Dans la section Détails du modèle :

    • Pour nouvelle fonction, entrez le nom de la fonction.
    • Pour niveau d’autorisation, sélectionnez fonction.
  5. Sélectionnez Créer.

  6. Accédez à la fonction que vous avez créée et sélectionnez Code + Test.

    Screenshot of the Code + Test page for a function.

  7. Mettez à jour le script et sélectionnez Enregistrer.

Configurer l’authentification

Pour utiliser les applets de commande PowerShell, vous devez configurer l’authentification dans l’application de fonction. Pour ce faire, vous devez configurer les variables d’environnement et charger un fichier de clé chiffré dans l’application de fonction.

Notes

Ce scénario fournit seulement un exemple d’implémentation de l’authentification avec Azure Functions. Il existe d’autres façons d’effectuer la même action.

Le script PowerShell suivant crée un fichier de clé appelé PassEncryptKey.key. Il fournit également une version cryptée du mot de passe fourni. Ce mot de passe est le même que celui défini pour l'application Microsoft Entra utilisé pour l'authentification.

#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

Récupérer des valeurs pour les variables d’environnement

Configurez les variables d'environnement suivantes, qui sont nécessaires pour accéder aux valeurs d'authentification :

  • AzureClientID
  • AzureTenant
  • AzureCredPassword

Si vous disposez déjà d’un ID d’application, utilisez les valeurs AzureClientID, AzureTenant et AzureCredPassword de cette application. Si vous n’en avez pas, passez à la section Store des variables d’environnement section.

AzureClientID

L'ID client est l'ID d'une application dans Microsoft Entra ID. Pour obtenir l'identifiant client :

  1. Si vous n'avez pas encore d'application à utiliser, exécutez l'applet de commande suivante pour créer une application :

    $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
    

    Remarque

    Le mot de passe que vous utilisez lors de la création de l'application doit être le même que celui que vous avez créé précédemment lors de l'enregistrement du fichier de clé.

  2. Dans le portail Azure, sélectionnez Abonnements. Sélectionnez l’abonnement à utiliser, puis sélectionnez Contrôle d’accès (IAM).

  3. Choisissez le compte à utiliser, puis sélectionnez Propriétés. Copiez l’ID de l’application.

AzureTenant

Obtenez l’ID de locataire en exécutant l’applet de commande PowerShell suivante :

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

AzureCredPassword

La valeur de la variable d’environnement AzureCredPassword est la valeur que vous obtenez de l’exécution de l’exemple PowerShell suivant. Cet exemple est le même que celui présenté dans la section Configurer l’authentification précédente. La valeur dont vous avez besoin est la sortie de la variable $Encryptedpassword . Cette sortie correspond au mot de passe principal du service que vous avez chiffré à l'aide du script 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

Stocker les variables d’environnement

Pour stocker les variables d'environnement :

  1. Accédez à l’application de fonction. Sélectionnez Configurations>Paramètres de l’application.

    Screenshot of the tab for application settings.

  2. Ajoutez les variables d’environnement et leurs valeurs aux paramètres de l’application, puis sélectionnez Enregistrer.

Ajout de PowerShell à la fonction

À présent, appelez Network Watcher à partir de la fonction Azure. Selon les besoins, l’implémentation de cette fonction peut varier. Toutefois, le flux général du code est comme suit :

  1. Traiter les paramètres d’entrée.
  2. Interroger les captures de paquets existantes pour vérifier les limites et résoudre les conflits de noms.
  3. Créer une capture de paquets avec les paramètres appropriés.
  4. Interrogez périodiquement la capture de paquets jusqu'à ce qu'elle soit terminée.
  5. Informer l’utilisateur de la fin de la session de capture de paquets.

L'exemple suivant est le code PowerShell que vous pouvez utiliser dans la fonction. Vous devez remplacer les valeurs de subscriptionId, resourceGroupName et 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 
    } 
} 

Utilisez le code PowerShell suivant si vous utilisez l’ancien schéma :

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

Configurer une alerte sur une machine virtuelle

Vous pouvez configurer des alertes pour avertir les individus lorsqu'une mesure spécifique dépasse un seuil que vous lui avez attribué. Dans cet exemple, l’alerte se trouve sur la mesure Network Out Total envoyée, mais vous pouvez déclencher l’alerte pour de nombreuses autres métriques.

Créer la règle d’alerte

Accédez à une machine virtuelle existante et ajoutez une règle d’alerte. Dans la page Créer une règle d’alerte , procédez comme suit :

  1. Dans le Sélectionnez un signal volet, recherchez le nom du signal et sélectionnez-le. Dans cet exemple, Total des sorties réseau est le signal sélectionné. Il indique le nombre d'octets émis sur toutes les interfaces réseau par la machine virtuelle.

  2. Sous l'onglet Conditions, définissez les valeurs suivantes, puis sélectionnez Suivant : Actions.

    Paramètre Valeur
    Seuil Statique
    Type d’agrégation Moyenne
    Opérateur Supérieur à
    Valeur du seuil 3
    Vérifier chaque 1 minute
    Période de recherche arrière 5 minutes
  3. Sous l’onglet Actions, sélectionnez Créer un groupe d’actions.

  4. Dans la page Créer un groupe d’actions, sélectionnez les valeurs Souscription, Groupe de ressourceset Région. Entrez également le nom du groupe d’actions et le nom complet, puis sélectionnez Suivant : Notifications.

  5. Sous l’onglet Notifications, pour Type d’action, sélectionnez Fonction Azure.

  6. Dans le volet Fonction Azure, sélectionnez les valeurs Souscription, Groupe de ressources, Application de fonction et Fonction Azure.

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

  7. Dans Activer le curseur de schéma d’alerte commun, sélectionnez Aucun. Sélectionnez ensuite OK.

Passer en revue les résultats.

Une fois que les critères déclenchent une alerte, Network Watcher crée une capture de paquet. Accédez à Network Watcher et sélectionnez Capture de paquets. Sur cette page, vous pouvez sélectionner le lien du fichier pour télécharger la capture de paquets.

Si le fichier de capture est stocké localement, vous pouvez l'obtenir en vous connectant à la machine virtuelle.

Pour obtenir des instructions de téléchargement des fichiers à partir des comptes de Stockage Azure, consultez Prise en main du Stockage d’objets Blob Azure à l’aide de .NET. Vous pouvez également utiliser l'outil Azure Stockage Microsoft Azure Explorer.

Après avoir téléchargé votre capture, vous pouvez la visualiser à l'aide d'outils tels que Wireshark, capables de lire un fichier .cap.

Étape suivante

Découvrez comment afficher vos captures de paquets en lisant Inspecter et analyser les fichiers de capture de paquets Network Watcher.