Monitorar redes proativamente com alertas e Azure Functions usando a captura de pacotes

O recurso de captura de pacotes do Observador de Rede do Azure cria sessões de captura para controlar o tráfego dentro e fora de VMs (máquinas virtuais). O arquivo de captura pode ter um filtro que você define para acompanhar apenas o tráfego que você deseja monitorar. Esses dados são armazenados em um blob de armazenamento ou localmente no computador convidado.

Você pode iniciar essa funcionalidade remotamente a partir de outros cenários de automação, como do Azure Functions. Você pode executar capturas proativas com base em anomalias de rede definidas. Outros usos incluem coleta de estatísticas de rede, obtenção de informações sobre invasões de rede e depuração de comunicações cliente/servidor.

Os recursos implantados no Azure são executados continuamente. É difícil monitorar ativamente o status de todos os recursos em todos os momentos. Por exemplo, o que acontece se ocorrer um problema às 2:00 da manhã?

Usando alertas e funções do Observador de Rede de dentro do ecossistema do Azure, você pode responder proativamente com os dados e as ferramentas para resolver problemas em sua rede.

Pré-requisitos

Cenário

Neste exemplo, uma máquina virtual tem mais tráfego de saída do que o normal e você deseja ser alertado. Você pode usar um processo semelhante para criar alertas para qualquer condição.

Quando um incidente dispara um alerta, os dados no nível do pacote ajudam você a analisar por que o tráfego de saída aumentou. Você pode executar etapas para retornar a máquina virtual ao estado original.

Este cenário pressupõe que você tem uma instância existente do Observador de Rede e um grupo de recursos com uma máquina virtual válida.

Aqui está o fluxo de trabalho para captura de pacotes:

  1. Um incidente dispara um alerta em sua VM.
  2. O alerta chama sua função do Azure.
  3. A função do Azure processa o alerta e inicia uma sessão de captura de pacotes do Observador de Rede.
  4. A captura de pacotes é executada na VM e coleta os dados.
  5. O pacote de captura é carregado em uma conta de armazenamento para um diagnóstico e análise.

Para automatizar esse processo, você cria e conecta um alerta em sua VM a ser disparado quando o incidente ocorre. Você também cria uma função para chamar o Observador de Rede.

Este cenário:

  • Cria uma função do Azure que inicia uma captura de pacotes.
  • Cria uma regra de alerta em uma máquina virtual e configura a regra de alerta para chamar a função do Azure.

Criar uma função do Azure

Para criar uma função do Azure para processar o alerta e criar uma captura de pacote, primeiro você precisa criar um aplicativo de funções:

  1. Entre no portal do Azure.

  2. Na caixa de pesquisa na parte superior do portal, insira aplicativo de funções. Selecione o Aplicativo de Funções nos resultados da pesquisa.

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

  3. Selecione + Criar.

  4. Na guia Básico de Criar aplicativo de funções, insira ou selecione valores para as seguintes configurações:

    • Em Detalhes do Projeto, selecione a assinatura para a qual você deseja criar o aplicativo de funções e o grupo de recursos para conter o aplicativo.
    • Em detalhes da instância:
      • Para nome do Aplicativo de Funções, insira o nome do aplicativo de funções. Esse nome é acrescentado com .azurewebsites.net.
      • Para implantar código ou imagem de contêiner?, selecione o modo de publicação: código ou imagemde contêiner.
      • Para a pilha Runtime, selecione uma pilha de runtime.
      • Para Versão, selecione a versão da pilha de runtime.
      • Para Região, selecione a região na qual você deseja criar o aplicativo de funções.
    • No sistema operacional, selecione o tipo de sistema operacional que você usa no momento. O Azure recomenda o tipo de sistema operacional com base na seleção de pilha de runtime.
    • Em Hospedagem, selecione o tipo de plano que você deseja usar para o aplicativo de funções. Escolha uma das seguintes opções:
      • Consumo (sem servidor): para dimensionamento controlado por eventos para o menor custo.
      • Functions Premium: para aplicativos sem servidor de nível empresarial com dimensionamento baseado em evento e isolamento de rede.
      • Plano do Serviço de Aplicativo: para reutilizar a computação de um plano existente do Serviço de Aplicativo do Azure.

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

  5. Selecione Revisar + criar para criar o aplicativo.

Agora você pode criar uma função:

  1. No aplicativo de funções que você criou, selecione Funções e, em seguida, selecione Criar para abrir o painel Criar função.

    Screenshot of the Create function pane.

  2. Para Ambiente de desenvolvimento, selecione Desenvolver no portal.

  3. Em Selecionar um modelo, selecione Gatilho HTTP.

  4. Na seção Detalhes do modelo:

    • Para Nova Função, insira o nome da função.
    • Para o Nível de autorização, selecione Função.
  5. Selecione Criar.

  6. Vá para a função que você criou e selecione Código + Teste.

    Screenshot of the Code + Test page for a function.

  7. Atualize o script e escolha Salvar.

Configurar autenticação

Para usar os cmdlets do PowerShell, você precisa configurar a autenticação no aplicativo de funções. Para configurar a autenticação, você deverá configurar as variáveis de ambiente e carregar um arquivo de chave criptografado no aplicativo de funções.

Observação

Este cenário só fornece um exemplo de como implementar a autenticação com o Azure Functions. Há outras maneiras de executar a mesma ação.

O seguinte script do PowerShell cria um arquivo de chave chamado PassEncryptKey.key. Ele também fornece uma versão criptografada da senha fornecida. Essa senha é a mesma senha definida para o aplicativo Microsoft Entra usado para autenticação.

#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

Recuperar valores de variáveis de ambiente

Configure as seguintes variáveis de ambiente, que são necessárias para acessar os valores para autenticação:

  • AzureClientID
  • AzureTenant
  • AzureCredPassword

Se você já tiver uma ID do aplicativo, use os valores AzureClientID, AzureTenant e AzureCredPassword desse aplicativo. Se você não tiver um, vá para a seção Armazenar as variáveis de ambiente.

AzureClientID

A ID do cliente é a ID de um aplicativo na Microsoft Entra ID. Para obter a ID do cliente:

  1. Se você ainda não tiver um aplicativo para usar, execute o seguinte cmdlet para criar um aplicativo:

    $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
    

    Observação

    A senha que você usa ao criar o aplicativo deve ser a mesma senha que você criou anteriormente quando salvou o arquivo de chave.

  2. No Portal do Azure, selecione Assinaturas. Selecione a assinatura para usar e, em seguida, selecione Controle de Acesso (IAM).

  3. Escolha a conta a ser usada e selecione Propriedades. Copie o ID do aplicativo.

AzureTenant

Obtenha a ID do locatário executando o seguinte cmdlet do PowerShell:

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

AzureCredPassword

O valor da variável de ambiente AzureCredPassword é o valor obtido com a execução do exemplo do PowerShell a seguir. Este exemplo é o mesmo que a seção Configurar Autenticação anterior mostrou. O valor necessário é a saída da variável $Encryptedpassword. Essa saída é a senha da entidade de serviço que você criptografou usando o script do 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

Armazenar as variáveis de ambiente

Para armazenar as variáveis de ambiente:

  1. Vá para o aplicativo de funções. Selecione Configurações>Configurações de aplicativo.

    Screenshot of the tab for application settings.

  2. Adicione as variáveis de ambiente e seus valores às configurações do aplicativo e selecione Salvar.

Adicione o PowerShell para a função

Agora, faça chamadas no Observador de Rede na função do Azure. Dependendo dos requisitos, a implementação dessa função pode variar. No entanto, o fluxo geral do código é assim:

  1. Processar os parâmetros de entrada.
  2. Consultar as capturas de pacotes existentes para verificar os limites e resolver os conflitos de nomenclatura.
  3. Criar uma captura de pacotes com os devidos parâmetros.
  4. Sondar a captura de pacote periodicamente até que ela seja concluída.
  5. Notificar o usuário que a sessão de captura de pacotes foi concluída.

O exemplo a seguir é o código do PowerShell que você pode usar na função. Você precisa substituir os valores por subscriptionId, resourceGroupName e 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 o seguinte código do PowerShell se você estiver usando o esquema antigo:

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

Configurar um alerta em uma VM

Você pode configurar alertas para notificar indivíduos quando uma métrica específica ultrapassar um limite atribuído a ele. Neste exemplo, o alerta está na métrica Total de Saída de Rede enviada, mas você pode disparar o alerta para muitas outras métricas.

Criar a regra de alerta

Acesse uma máquina virtual existente e adicione uma regra de alerta. Na página Criar uma regra de alerta, execute as seguintes etapas:

  1. No painel Selecionar um sinal, pesquise o nome do sinal e selecione-o. Neste exemplo, Total de Saída de Rede é o sinal selecionado. Ele indica o número de bytes em todos os adaptadores de rede pela máquina virtual.

  2. Na guia Condições, defina os seguintes valores e selecione Avançar: Ações.

    Configuração Valor
    Limite Estático
    Tipo de agregação Média
    Operador Maior que
    Valor limite 3
    Verificar a cada 1 minuto
    Período de retrospectiva 5 minutos
  3. Na guia Ações, selecione Criar um grupo de ações.

  4. Na página Criar grupo de ações, selecione os valores Assinatura, Grupo de recursos e Região. Insira também o nome do grupo de ações e o nome de exibição e selecione Avançar: Notificações.

  5. Na guia Notificações, para Tipo de ação, selecione Função do Azure.

  6. No painel de Função do Azure, selecione os valores Assinatura, grupo de recursos, Aplicativo de funções e Função do Azure.

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

  7. Em Habilitar o controle deslizante de esquema de alerta comum, selecione Não. Em seguida, selecione OK.

Revise os resultados

Depois que os critérios disparam um alerta, o Observador de Rede cria uma captura de pacote. Acesse o Observador de Rede e escolha Captura de pacotes. Nesta página, você pode selecionar o link do arquivo para baixar a captura de pacotes.

Se o arquivo de captura for armazenado localmente, você poderá obtê-lo entrando na máquina virtual.

Para obter instruções sobre como baixar arquivos de contas de armazenamento do Azure, consulte o início rápido da biblioteca de clientes do Armazenamento de Blobs do Azure para .NET. Você também pode usar a ferramenta Gerenciador de Armazenamento do Microsoft Azure.

Depois de baixar a captura, você pode exibi-la usando ferramentas como o Wireshark que podem ler um arquivo .cap.

Próxima etapa

Saiba como exibir suas capturas de pacote lendo Inspecionar e analisar arquivos de captura de pacotes do Observador de Rede.