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

Cuidado

Este artigo faz referência ao CentOS, uma distribuição do Linux que está se aproximando do status de EOL (fim da vida útil). Considere seu uso e planejamento adequadamente. Para obter mais informações, confira as Diretrizes de Fim do Suporte do CentOS.

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 este pacote no RHEL/CentOS, confira o artigo Instalação a partir de 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://learn.microsoft.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

A captura de tela a seguir mostra um gráfico e um grafo mostrando os fluxos principais e sua frequência. Os fluxos também são mostrados por regra do NSG e fluxos por decisão. O Grafana é altamente personalizável, portanto, é recomendável que você crie painéis para atender às suas necessidades de monitoramentos específicas. O exemplo a seguir mostra um painel típico:

Captura de tela que mostra a configuração de grafo de amostra com fluxos segmentados pela regra NSG.

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óximas etapas