Supervisión proactiva de redes con alertas y Azure Functions mediante la captura de paquetes

La característica de captura de paquetes de Azure Network Watcher crea sesiones de captura para realizar el seguimiento del tráfico dentro y fuera de las máquinas virtuales (VM). El archivo de captura puede tener un filtro que se define para realizar el seguimiento solo del tráfico que se quiere supervisar. Estos datos se almacenan en un blob de almacenamiento o de forma local en la máquina invitada.

Puede iniciar esta funcionalidad de forma remota desde otros escenarios de automatización, como Azure Functions. Puede ejecutar capturas proactivas basadas en anomalías de red definidas. Otros usos son la recopilación de estadísticas de red, la obtención de información sobre las intrusiones de red y la depuración de las comunicaciones cliente-servidor.

Los recursos implementados en Azure se ejecutan continuamente. Es difícil supervisar activamente el estado de todos los recursos en todo momento. Por ejemplo, ¿qué ocurre si un problema se produce a las 2:00 a. m.?

Con Network Watcher, las alertas y las funciones del ecosistema de Azure, puede responder de manera proactiva con los datos y las herramientas para resolver los problemas de su red.

Requisitos previos

Escenario

En este ejemplo, una máquina virtual tiene más tráfico saliente de lo habitual y quiere recibir alertas al respecto. Puede usar un proceso similar para crear alertas para cualquier condición.

Cuando un incidente desencadena una alerta, los datos de nivel de paquete le ayudan a analizar por qué ha aumentado el tráfico saliente. Puede realizar los pasos necesarios para devolver la máquina virtual a su estado original.

En este escenario se supone que tiene una instancia existente de Network Watcher y un grupo de recursos con una máquina virtual válida.

Este es el flujo de trabajo para la captura de paquetes:

  1. Un incidente desencadena una alerta en la VM.
  2. La alerta llama a la función de Azure.
  3. La función de Azure procesa la alerta y se inicia una sesión de captura de paquetes de Network Watcher.
  4. La captura de paquetes se ejecuta en la máquina virtual y recopila los datos.
  5. El archivo de captura de paquetes se carga en una cuenta de almacenamiento para su revisión y diagnóstico.

Para automatizar este proceso, cree y conecte una alerta en la VM para que se desencadene cuando se produzca el incidente. También creará una función para llamar a Network Watcher.

Este escenario:

  • Creará una función de Azure que inicie una captura de paquetes.
  • Creará una regla de alerta en una máquina virtual y configurará la regla de alerta para llamar a la función de Azure.

Creación de una función de Azure

Para crear una función de Azure para procesar la alerta y crear una captura de paquetes, primero debe crear una aplicación de funciones:

  1. Inicie sesión en Azure Portal.

  2. En el cuadro de búsqueda de la parte superior del portal, escriba aplicación de funciones. Seleccione Aplicación de funciones en los resultados de la búsqueda.

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

  3. Seleccione + Create (+ Crear).

  4. En la pestaña Información básica de Crear una aplicación de funciones, escriba o seleccione valores para las siguientes opciones de configuración:

    • En Detalles del proyecto, seleccione la suscripción para la que quiere crear la aplicación de funciones y el grupo de recursos que contendrá la aplicación.
    • En Detalles de instancia:
      • En Nombre de la aplicación de funciones, escriba el nombre de la aplicación de funciones. A este nombre, se le anexa .azurewebsites.net.
      • En ¿Desea implementar código o una imagen de contenedor?, seleccione el modo de publicación: Código o Imagen contenedora.
      • En Pila de runtime, seleccione una pila de runtime.
      • En Versión, seleccione la versión de la pila de runtime.
      • En Región, seleccione la región en la que quiere crear la aplicación de funciones.
    • En Sistema operativo, seleccione el tipo de sistema operativo que está usando actualmente. Azure recomienda el tipo de sistema operativo en función de la selección de la pila de runtime.
    • En Hosting, seleccione el tipo de plan que quiere usar para la aplicación de funciones. Elija entre las siguientes opciones:
      • Consumo (sin servidor): para el escalado basado en eventos para el coste mínimo.
      • Funciones Premium: para aplicaciones sin servidor de nivel empresarial con escalado basado en eventos y aislamiento de red.
      • Plan de App Service: para reutilizar el proceso de un plan de Azure App Service existente.

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

  5. Seleccione Revisar y crear para crear la aplicación.

Ahora puede crear una función:

  1. En la aplicación de funciones que ha creado, seleccione Funciones y, luego, Crear para abrir el panel Crear función.

    Screenshot of the Create function pane.

  2. En Entorno de desarrollo, seleccione Develop in portal (Desarrollar en el portal).

  3. En Seleccionar una plantilla, seleccione Desencadenador de HTTP.

  4. En la sección Detalles de la plantilla:

    • En Nueva función, escriba el nombre de la función.
    • En Nivel de autorización, seleccione Función.
  5. Seleccione Crear.

  6. Vaya a la función que creó y seleccione Código y prueba.

    Screenshot of the Code + Test page for a function.

  7. Actualice el script y seleccione Guardar.

Configurar la autenticación

Para usar los cmdlets de PowerShell, debe configurar la autenticación en la aplicación de funciones. Para ello, debe configurar las variables de entorno y cargar un archivo de clave cifrada en la aplicación de función.

Nota

Este escenario proporciona solo un ejemplo de cómo implementar la autenticación con Azure Functions. Hay otras maneras de realizar la misma acción.

El siguiente script de PowerShell crea un archivo de claves denominado PassEncryptKey.key. También proporciona una versión cifrada de la contraseña indicada. Esta contraseña es la misma que se define para la aplicación de Microsoft Entra usada para la autenticación.

#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

Recuperación de valores para variables de entorno

Configure las siguientes variables de entorno, que son necesarias para acceder a los valores de autenticación:

  • AzureClientID
  • AzureTenant
  • AzureCredPassword

Si ya tiene un id. de aplicación, use los valores de AzureClientID, AzureTenant y AzureCredPassword de esa aplicación. Si no tiene una, vaya a la sección Almacenar las variables de entorno.

AzureClientID

El id. de cliente es el id. de una aplicación en Microsoft Entra ID. Para obtener el id. de cliente:

  1. Si aún no cuenta con una aplicación que pueda usar, ejecute el cmdlet siguiente para crear una:

    $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
    

    Nota:

    La contraseña utilizada al crear la aplicación debe ser la misma que se creó anteriormente al guardar el archivo de clave.

  2. En Azure Portal, seleccione Suscripciones. Seleccione la suscripción que desee usar y, a continuación, seleccione Control de acceso (IAM).

  3. Elija la cuenta que usará y seleccione Propiedades. Copie el identificador de la aplicación.

AzureTenant

Ejecute el siguiente cmdlet de PowerShell para obtener el id. de inquilino:

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

AzureCredPassword

El valor de la variable de entorno AzureCredPassword es el valor resultante de la ejecución del ejemplo siguiente de PowerShell. Este ejemplo es el mismo que se muestra en la sección Configuración de la autenticación anterior. El valor que necesita es la salida de la variable $Encryptedpassword. Esta salida es la contraseña de la entidad de servicio que cifró mediante el script de 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

Almacenamiento de las variables de entorno

Para almacenar las variables de entorno:

  1. Vaya a la aplicación de función. Seleccione Configuraciones>Configuración de la aplicación.

    Screenshot of the tab for application settings.

  2. Agregue las variables de entorno y sus valores a la configuración de la aplicación y seleccione Guardar.

Adición de PowerShell a la función

Ahora realice llamadas a Network Watcher desde la función de Azure. La implementación de esta función puede variar según los requisitos. Sin embargo, el flujo general del código es el siguiente:

  1. Procesar los parámetros de entrada.
  2. Consultar las capturas de paquetes existentes para comprobar los límites y resolver los conflictos de nombres.
  3. Crear una captura de paquetes con los parámetros adecuados.
  4. Sondee la captura de paquetes periódicamente hasta que finalice.
  5. Notificar al usuario que la sesión de captura de paquetes ha finalizado.

El ejemplo siguiente es un código de PowerShell que puede usar en la función. Debe reemplazar los valores de subscriptionId, resourceGroupName y 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 
    } 
} 

Use el siguiente código de PowerShell si usa el esquema anterior:

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

Configuración de una alerta en una máquina virtual

Puede configurar alertas para que notifiquen a los usuarios cuando una métrica determinada supere un umbral que le ha asignado. En este ejemplo, la alerta se encuentra en la métrica Salida de red total que se envía, pero puede desencadenar la alerta para muchas otras métricas.

Creación de la regla de alerta

Vaya a una máquina virtual existente y agregue una regla de alerta. En la página Crear una regla de alerta, siga estos pasos:

  1. En el panel Seleccionar una señal, busque el nombre de la señal y selecciónelo. En este ejemplo, Salida de red total es la señal seleccionada. Indica el número de bytes que la máquina virtual envía en todas las interfaces de red.

  2. En la pestaña Condiciones, establezca los valores siguientes y, luego, seleccione Siguiente: Acciones .

    Configuración Valor
    Umbral Estático
    Tipo de agregación Average
    Operador Mayor que
    Valor del umbral 3
    Comprobar cada 1 minuto
    Período de retrospectiva 5 minutos
  3. En la pestaña Acciones, seleccione Crear un grupo de acciones.

  4. En la página Crear grupo de acciones, seleccione los valores de Suscripción, Grupo de recursos y Región. Escriba también el nombre del grupo de acciones y el nombre para mostrar y, luego, seleccione Siguiente: Notificaciones .

  5. En la pestaña Notificaciones, en Tipo de acción, seleccione Función de Azure.

  6. En el panel Función de Azure, seleccione los valores de Suscripción, Grupo de recursos, Aplicación de funciones y Función de Azure.

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

  7. En el control deslizante Habilitar el esquema de alerta común, seleccione No. Después, seleccione Aceptar.

Revisión del resultado

Después de que los criterios desencadenen una alerta, Network Watcher creará una captura de paquetes. Vaya a Network Watcher y seleccione Captura de paquetes. En esta página, puede seleccionar el vínculo del archivo para descargar la captura de paquetes.

Si el archivo de captura se almacena localmente, puede iniciar sesión en la máquina virtual para obtenerlo.

Para obtener instrucciones sobre cómo descargar archivos de cuentas de Azure Storage, consulte la guía de inicio rápido para la biblioteca cliente de Azure Blob Storage para .NET. También puede usar la herramienta Explorador de Azure Storage.

Después de descargar la captura, puede examinarla mediante herramientas como Wireshark, que pueden leer un archivo .cap.

Paso siguiente

Para obtener información sobre cómo ver las capturas de paquetes, consulte Inspeccionar y analizar archivos de captura de paquetes de Network Watcher.