Gerenciar e analisar os logs de fluxo do grupo de segurança de rede usando o Observador de Rede e o Grafana

Importante

Em 30 de setembro de 2027, os logs de fluxo do grupo de segurança de rede (NSG) serão desativados. Como parte dessa aposentadoria, você não poderá mais criar novos registros de fluxo do NSG a partir de 30 de junho de 2025. Recomendamos migrar para logs de fluxo de rede virtual, que superam as limitações dos registros de fluxo do NSG. Após a data de aposentadoria, a análise de tráfego habilitada com logs de fluxo NSG não será mais suportada, e os recursos de logs de fluxo NSG existentes em suas assinaturas serão excluídos. No entanto, os registros de fluxo do NSG não serão excluídos e continuarão seguindo suas respectivas políticas de retenção. Para saber mais, confira o anúncio oficial.

Os logs de fluxo do NSG (Grupo de Segurança de Rede) fornecem informações que podem ser usadas para entender a entrada e a saída de tráfego IP em interfaces de rede. Esses logs de fluxo exibem os fluxos de entrada e saída baseados em regras do NSG. A NIC de fluxo se aplica às informações de 5 tuplas sobre o fluxo (IP de Origem/Destino, Porta de Origem/Destino e Protocolo) e se o tráfego foi permitido ou negado.

Você pode ter muitos NSGs em sua rede com o registro em log de fluxo habilitado. Essa quantidade de dados de registro em log torna difícil a análise e a obtenção de insights de seus logs. Este artigo fornece uma solução para gerenciar centralmente esses logs de fluxo do NSG usando o Grafana, uma ferramenta de grafo de software livre, o ElasticSearch, uma pesquisa distribuída e mecanismo de análise e o Logstash, que é um pipeline de processamento de dados do servidor do lado do servidor de software livre.

Cenário

Logs de fluxo do NSG são habilitados usando o Observador de Rede e são armazenados no armazenamento de blob do Azure. Um plug-in Logstash é usado para conectar e processar os logs de fluxo do armazenamento de blobs e enviá-los ao ElasticSearch. Depois que os logs de fluxo são armazenados no ElasticSearch, eles podem ser analisados e visualizados em painéis personalizados no Grafana.

Grafana do Observador de Rede do NSG

Etapas de instalação

Habilitar os registros em logs do fluxo do Grupo de Segurança de Rede

Nessa situação, você deve habilitar o Registro em Log do Fluxo do Grupo de Segurança de Rede em um ou mais Grupos de Segurança de Rede em sua conta. Confira o artigo Introdução ao registro em log do fluxo para Grupos de Segurança de Rede para obter instruções sobre como habilitar os Logs do Fluxo de Segurança de Rede.

Considerações sobre a instalação

Neste exemplo, o Grafana, o ElasticSearch e o Logstash são configurados em um servidor do Ubuntu LTS implantado no Azure. Esta configuração mínima é usada para executar todos os três componentes - todos são executados na mesma VM. Essa configuração só deve ser usada para cargas de trabalho de teste e não críticas. Logstash, Elasticsearch e Grafana podem ser projetados para dimensionar de modo independente entre várias instâncias. Para obter mais informações, consulte a documentação de cada um desses componentes.

Instalar Logstash

Você pode usar o Logstash para mesclar os logs de fluxo formatados em JSON para um nível de tupla de fluxo.

As seguintes instruções são usadas para instalar o Logstash no Ubuntu. Para obter instruções sobre como instalar esse pacote no Red Hat Enterprise Linux, consulte Instalação dos repositórios de pacotes – yum.

  1. Para instalar o Logstash, execute os seguintes comandos:

    curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb
    sudo dpkg -i logstash-5.2.0.deb
    
  2. Configure o Logstash para analisar os logs de fluxo e enviá-los ao ElasticSearch. Crie um arquivo Logstash.conf usando:

    sudo touch /etc/logstash/conf.d/logstash.conf
    
  3. Adicione o seguinte conteúdo ao arquivo. Altere a chave de acesso e o nome da conta de armazenamento para refletir os detalhes da conta de armazenamento:

     input {
       azureblob
       {
         storage_account_name => "mystorageaccount"
         storage_access_key => "VGhpcyBpcyBhIGZha2Uga2V5Lg=="
         container => "insights-logs-networksecuritygroupflowevent"
         codec => "json"
         # Refer https://video2.skills-academy.com/azure/network-watcher/network-watcher-read-nsg-flow-logs
         # Typical numbers could be 21/9 or 12/2 depends on the nsg log file types
         file_head_bytes => 12
         file_tail_bytes => 2
         # Enable / tweak these settings when event is too big for codec to handle.
         # break_json_down_policy => "with_head_tail"
         # break_json_batch_count => 2
       }
     }
     filter {
       split { field => "[records]" }
       split { field => "[records][properties][flows]"}
       split { field => "[records][properties][flows][flows]"}
       split { field => "[records][properties][flows][flows][flowTuples]"}
    
       mutate {
         split => { "[records][resourceId]" => "/"}
         add_field => { "Subscription" => "%{[records][resourceId][2]}"
           "ResourceGroup" => "%{[records][resourceId][4]}"
           "NetworkSecurityGroup" => "%{[records][resourceId][8]}"
         }
         convert => {"Subscription" => "string"}
         convert => {"ResourceGroup" => "string"}
         convert => {"NetworkSecurityGroup" => "string"}
         split => { "[records][properties][flows][flows][flowTuples]" => "," }
         add_field => {
           "unixtimestamp" => "%{[records][properties][flows][flows][flowTuples][0]}"
           "srcIp" => "%{[records][properties][flows][flows][flowTuples][1]}"
           "destIp" => "%{[records][properties][flows][flows][flowTuples][2]}"
           "srcPort" => "%{[records][properties][flows][flows][flowTuples][3]}"
           "destPort" => "%{[records][properties][flows][flows][flowTuples][4]}"
           "protocol" => "%{[records][properties][flows][flows][flowTuples][5]}"
           "trafficflow" => "%{[records][properties][flows][flows][flowTuples][6]}"
           "traffic" => "%{[records][properties][flows][flows][flowTuples][7]}"
     "flowstate" => "%{[records][properties][flows][flows][flowTuples][8]}"
     "packetsSourceToDest" => "%{[records][properties][flows][flows][flowTuples][9]}"
     "bytesSentSourceToDest" => "%{[records][properties][flows][flows][flowTuples][10]}"
     "packetsDestToSource" => "%{[records][properties][flows][flows][flowTuples][11]}"
     "bytesSentDestToSource" => "%{[records][properties][flows][flows][flowTuples][12]}"
         }
         add_field => {
           "time" => "%{[records][time]}"
           "systemId" => "%{[records][systemId]}"
           "category" => "%{[records][category]}"
           "resourceId" => "%{[records][resourceId]}"
           "operationName" => "%{[records][operationName]}"
           "Version" => "%{[records][properties][Version]}"
           "rule" => "%{[records][properties][flows][rule]}"
           "mac" => "%{[records][properties][flows][flows][mac]}"
         }
         convert => {"unixtimestamp" => "integer"}
         convert => {"srcPort" => "integer"}
         convert => {"destPort" => "integer"}
         add_field => { "message" => "%{Message}" }
       }
    
       date {
         match => ["unixtimestamp" , "UNIX"]
       }
     }
     output {
       stdout { codec => rubydebug }
       elasticsearch {
         hosts => "localhost"
         index => "nsg-flow-logs"
       }
     }
    

O arquivo de configuração do Logstash fornecido é composto de três partes: a entrada, o filtro e a saída. A seção de entrada designa a fonte de entrada de logs que o Logstash processará. Nesse caso, vamos usar um plug-in de entrada do "azureblob" (instalado nas etapas a seguir) que permitirá acessar os arquivos de JSON do log de fluxo do NSG armazenado no armazenamento de blobs.

A seção de filtro, em seguida, mescla cada arquivo de log do fluxo para que cada tupla de fluxo e suas propriedades associadas se tornem um evento de Logstash separado.

Por fim, a seção de saída encaminha cada evento de Logstash para o servidor do ElasticSearch. Fique à vontade para modificar o arquivo de configuração do Logstash para atender às suas necessidades específicas.

Instalar o plugin de entrada do Logstash para o armazenamento de blobs do Azure

Esse plug-in do Logstash permite o acesso direto aos logs do fluxo por meio da conta de armazenamento de blobs designada. Para instalar esse plug-in, do diretório de instalação Logstash padrão (nesse caso, /usr/share/logstash/bin), execute o comando:

sudo /usr/share/logstash/bin/logstash-plugin install logstash-input-azureblob

Para obter mais informações sobre esse plug-in, consulte Plug-in de entrada do Logstash para o Azure Storage Blobs.

Instalar ElasticSearch

Você pode usar o script a seguir para instalar o ElasticSearch. Para obter informações sobre como instalar o ElasticSearch, consulte Pilha elástica.

sudo apt-get install apt-transport-https openjdk-8-jre-headless uuid-runtime pwgen -y
wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://packages.elastic.co/elasticsearch/5.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-5.x.list
sudo apt-get update && apt-get install elasticsearch
sudo sed -i s/#cluster.name:.*/cluster.name:\ grafana/ /etc/elasticsearch/elasticsearch.yml
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service

Instalar o Grafana

Para instalar e executar o Grafana, execute os seguintes comandos:

wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.5.1_amd64.deb
sudo apt-get install -y adduser libfontconfig
sudo dpkg -i grafana_4.5.1_amd64.deb
sudo service grafana-server start

Para obter informações adicionais de instalação, consulte Instalar em Debian/Ubuntu.

Adicione o servidor do ElasticSearch como uma fonte de dados

Em seguida, você precisa adicionar o índice do ElasticSearch que contém os logs de fluxo como uma fonte de dados. Você pode adicionar uma fonte de dados selecionando Adicionar fonte de dados e preenchendo o formulário com as informações relevantes. Um exemplo dessa configuração pode ser encontrado na seguinte captura de tela:

Adicionar fonte de dados

Criar um painel

Agora que você configurou com êxito o Grafana para ler o índice do ElasticSearch que contém os logs de fluxo do NSG, você poderá criar e personalizar os painéis. Para criar um novo painel, selecione Criar seu primeiro painel. A configuração de exemplo de grafo a seguir mostra os fluxos segmentados por regra do NSG:

Grafo do painel

Conclusão

Ao integrar o Observador de Rede com o ElasticSearch e o Grafana, você tem uma maneira centralizada e conveniente de gerenciar e visualizar os logs de fluxo do NSG, bem como outros dados. O Grafana tem vários outros recursos de grafos avançados que também podem ser usados para gerenciar os logs de fluxo e entender melhor o tráfego de rede. Agora que você tem uma instância do Grafana configurada e conectada ao Azure, fique à vontade para continuar a explorar outras funcionalidades que ele oferece.

Próxima etapa