Partilhar via


Gerencie e analise logs de fluxo de grupos de segurança de rede usando o Network Watcher e o Grafana

Os logs de fluxo do NSG (Network Security Group) fornecem informações que podem ser usadas para entender o tráfego IP de entrada e saída em interfaces de rede. Esses logs de fluxo mostram os fluxos de entrada e saída por regra NSG, a NIC à qual o fluxo se aplica, informações de 5 tuplas sobre o fluxo (IP de origem/destino, porta de origem/destino, protocolo) e se o tráfego foi permitido ou negado.

Você pode ter muitos NSGs em sua rede com o registro de fluxo habilitado. Essa quantidade de dados de registro torna complicado analisar e obter informações de seus logs. Este artigo fornece uma solução para gerenciar centralmente esses logs de fluxo NSG usando o Grafana, uma ferramenta gráfica de código aberto, o ElasticSearch, um mecanismo de pesquisa e análise distribuído, e o Logstash, que é um pipeline de processamento de dados do lado do servidor de código aberto.

Cenário

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

NSG Network Watcher Grafana

Passos de instalação

Habilitar o log de fluxo do Grupo de Segurança de Rede

Para esse cenário, você deve ter o Log de Fluxo do Grupo de Segurança de Rede habilitado em pelo menos um Grupo de Segurança de Rede em sua conta. Para obter instruções sobre como habilitar os Logs de Fluxo de Segurança de Rede, consulte o seguinte artigo Introdução ao log de fluxo para Grupos de Segurança de Rede.

Considerações sobre a configuração

Neste exemplo, Grafana, ElasticSearch e Logstash são configurados em um Ubuntu LTS Server implantado no Azure. Essa configuração mínima é usada para executar todos os três componentes - todos eles estão sendo executados na mesma VM. Essa configuração só deve ser usada para testes e cargas de trabalho não críticas. Logstash, Elasticsearch e Grafana podem ser projetados para serem dimensionados de forma independente em muitas instâncias. Para obter mais informações, consulte a documentação de cada um desses componentes.

Instalar o Logstash

Use o Logstash para nivelar os logs de fluxo formatados em JSON para um nível de tupla de fluxo.

As instruções a seguir são usadas para instalar o Logstash no Ubuntu. Para obter instruções sobre como instalar este pacote no Red Hat Enterprise Linux, consulte Instalando 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 para o ElasticSearch. Crie um arquivo Logstash.conf usando:

    sudo touch /etc/logstash/conf.d/logstash.conf
    
  3. Adicione o seguinte conteúdo ao arquivo. Altere o nome da conta de armazenamento e a chave de acesso para refletir os detalhes da sua 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 Logstash fornecido é composto por três partes: entrada, filtro e saída. A seção de entrada designa a fonte de entrada dos logs que o Logstash processará – neste caso, usaremos um plug-in de entrada "azureblob" (instalado nas próximas etapas) que nos permitirá acessar os arquivos JSON do log de fluxo NSG armazenados no armazenamento de blob.

Em seguida, a seção de filtro nivela cada arquivo de log de fluxo para que cada tupla de fluxo individual e suas propriedades associadas se tornem um evento Logstash separado.

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

Instalar o plug-in de entrada Logstash para armazenamento de Blob do Azure

Este plugin Logstash permite que você acesse diretamente os logs de fluxo de sua conta de armazenamento de blob designada. Para instalar este plug-in, a partir do diretório de instalação padrão do Logstash (neste 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 Logstash input plugin for Azure Storage Blobs.

Instalar o ElasticSearch

Você pode usar o script a seguir para instalar o ElasticSearch. Para obter informações sobre como instalar o ElasticSearch, consulte Elastic Stack.

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 sobre a instalação, consulte Instalando no Debian / Ubuntu.

Adicionar o servidor ElasticSearch como fonte de dados

Em seguida, você precisa adicionar o índice do ElasticSearch que contém logs de fluxo como 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 captura de tela a seguir:

Adicionar origem de dados

Criar um dashboard

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

Gráfico do painel

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

Captura de tela que mostra a configuração do gráfico de exemplo com fluxos segmentados pela regra NSG.

Conclusão

Ao integrar o Network Watcher com o ElasticSearch e o Grafana, você agora tem uma maneira conveniente e centralizada de gerenciar e visualizar logs de fluxo NSG, bem como outros dados. O Grafana tem uma série de outros recursos gráficos poderosos que também podem ser usados para gerenciar ainda mais os logs de fluxo e entender melhor o tráfego da sua rede. Agora que você tem uma instância do Grafana configurada e conectada ao Azure, sinta-se à vontade para continuar a explorar as outras funcionalidades que ele oferece.

Próximo passo