Partilhar via


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

O recurso de captura de pacotes do Azure Network Watcher cria sessões de captura para rastrear o tráfego de entrada e saída de máquinas virtuais (VMs). O arquivo de captura pode ter um filtro que você define para rastrear apenas o tráfego que você deseja monitorar. Esses dados são armazenados em um blob de armazenamento ou localmente na máquina convidada.

Você pode iniciar esse recurso remotamente 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 a 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 Inspetor 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 a analisar por que o tráfego de saída aumentou. Você pode tomar medidas para retornar a máquina virtual ao seu estado original.

Este cenário pressupõe que você tenha uma instância existente do Inspetor 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 na sua VM.
  2. O alerta chama sua função do Azure.
  3. Sua função do Azure processa o alerta e inicia uma sessão de captura de pacotes do Inspetor de Rede.
  4. A captura de pacotes é executada na VM e coleta dados.
  5. O arquivo de captura de pacotes é carregado em uma conta de armazenamento para revisão e diagnóstico.

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

Este cenário:

  • Cria uma função do Azure que inicia uma captura de pacote.
  • 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ção:

  1. Inicie sessão no portal do Azure.

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

    Captura de ecrã que mostra como procurar aplicações funcionais no portal do Azure.

  3. Selecione + Criar.

  4. Na guia Noções básicas de Criar aplicativo de função, 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ção e o grupo de recursos para conter o aplicativo.
    • Em Detalhes da instância:
      • Em Nome do aplicativo de função, digite o nome do aplicativo de função. Este nome é acrescentado com .azurewebsites.net.
      • Em Deseja implantar código ou imagem de contêiner?, selecione o modo de publicação: Código ou Imagem de contêiner.
      • Para Pilha de tempo de execução, selecione uma pilha de tempo de execução.
      • Em Version, selecione a versão da pilha de tempo de execução.
      • Em Região, selecione a região na qual você deseja criar o aplicativo de função.
    • Em Sistema operacional, selecione o tipo de sistema operacional que você usa atualmente. O Azure recomenda o tipo de sistema operacional com base na sua seleção de pilha de tempo de execução.
    • Em Hospedagem, selecione o tipo de plano que você deseja usar para o aplicativo de função. Escolha entre as seguintes opções:
      • Consumo (sem servidor): Para dimensionamento controlado por eventos pelo menor custo.
      • Funções Premium: Para aplicativos sem servidor de nível empresarial com dimensionamento baseado em eventos 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.

    Captura de ecrã da página Criar Aplicação de Função no portal do Azure.

  5. Selecione Rever + criar para criar a aplicação.

Agora você pode criar uma função:

  1. Na aplicação de funções que criou, selecione Funções e, em seguida, selecione Criar para abrir o painel Criar funções .

    Captura de ecrã do painel de funções Criar.

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

  3. Em Selecione um modelo, selecione Gatilho HTTP.

  4. Na seção Detalhes do modelo:

    • Em Nova Função, insira o nome da função.
    • Para 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.

    Captura de ecrã da página Código + Teste de uma função.

  7. Atualize o script e selecione Salvar.

Configurar a autenticação

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

Nota

Este cenário fornece apenas um exemplo de como implementar a autenticação com o Azure Functions. Existem outras maneiras de fazer a mesma ação.

O script PowerShell a seguir cria um arquivo de chave chamado PassEncryptKey.key. Ele também fornece uma versão criptografada da senha fornecida. Essa senha é a mesma 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 para 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 de aplicativo, use os AzureClientIDvalores , AzureTenante AzureCredPassword desse aplicativo. Se você não tiver uma, vá para a seção Armazenar as variáveis de ambiente.

AzureClientID

A ID do cliente é a ID de um aplicativo no Microsoft Entra ID. Para obter o 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
    

    Nota

    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 subscrição a utilizar e, em seguida, selecione Controlo de acesso (IAM).

  3. Escolha a conta a utilizar e, em seguida, selecione Propriedades. Copie o ID da aplicação.

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 AzureCredPassword ambiente é o valor que você obtém ao executar o exemplo do PowerShell a seguir. Este exemplo é o mesmo que a seção Configurar autenticação anterior mostrou. O valor que você precisa é a saída da $Encryptedpassword variável. 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ção. Selecione Configurações Configurações>do aplicativo.

    Captura de ecrã do separador para definições da aplicação.

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

Adicionar PowerShell à função

Agora, faça chamadas para o Observador de Rede a partir da função do Azure. Dependendo dos requisitos, a implementação desta função pode variar. No entanto, o fluxo geral do código é o seguinte:

  1. Parâmetros de entrada do processo.
  2. Consulte capturas de pacotes existentes para verificar limites e resolver conflitos de nome.
  3. Crie uma captura de pacote com parâmetros apropriados.
  4. Sonde a captura de pacotes periodicamente até que esteja concluída.
  5. Notifique o usuário de que a sessão de captura de pacotes está concluída.

O exemplo a seguir é o código do PowerShell que você pode usar na função. Você precisa substituir os valores de subscriptionId, resourceGroupNamee 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 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 que você atribuiu a ela. 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

Vá para 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, procure o nome do sinal e selecione-o. Neste exemplo, Network out Total é o sinal selecionado. Ele indica o número de bytes fora em todas as interfaces de rede pela máquina virtual.

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

    Definição Valor
    Threshold Estático
    Tipo de agregação Média
    Operador Maior que
    Valor limite 3
    Verifique cada 1 minuto
    Período de retrospetiva 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. Introduza também o nome do grupo de ações e o nome para apresentação e, em seguida, selecione Seguinte: Notificações.

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

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

    Captura de ecrã da página para criar um grupo de ações e do painel para obter detalhes sobre uma função do Azure.

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

Rever os resultados

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

Se o arquivo de captura estiver 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 cliente do Armazenamento de Blobs do Azure para .NET. Você também pode usar a ferramenta Gerenciador de Armazenamento do Azure.

Depois de baixar sua captura, você pode visualizá-la usando ferramentas como o Wireshark , que pode ler um arquivo .cap .

Próximo passo

Saiba como visualizar suas capturas de pacotes lendo Inspecionar e analisar arquivos de captura de pacotes do Network Watcher.