Gestire e analizzare i log dei flussi dei gruppi di sicurezza di rete usando Network Watcher e Grafana

Attenzione

Questo articolo fa riferimento a CentOS, una distribuzione Linux vicina allo stato end of life (EOL). Prendere in considerazione l'uso e la pianificazione di conseguenza. Per altre informazioni, vedere le linee guida per la fine della vita di CentOS.

I log di flusso dei gruppi di sicurezza di rete (NSG) contengono informazioni utili per comprendere il traffico IP in ingresso e in uscita nelle interfacce di rete. Questi log mostrano i flussi in ingresso e in uscita in base alle regole NSG, alla scheda di interfaccia di rete a cui si applica il flusso, a informazioni a 5 tuple sul flusso (IP di origine/destinazione, porta di origine/destinazione e protocollo) e al fatto che il traffico sia stato consentito o rifiutato.

È possibile avere molti gruppi di sicurezza di rete in rete con i log di flusso abilitati. Questa quantità di dati di log rende più difficile l'analisi e il reperimento delle informazioni dettagliate nei log. Questo articolo offre una soluzione per gestire centralmente i log di flusso dei gruppi di sicurezza di rete usando Grafana, uno strumento grafico open source, ElasticSearch, un motore di analisi e di ricerca distribuita e Logstash, una pipeline di elaborazione di dati lato server open-source.

Scenario

I log di flusso dei gruppi di sicurezza di rete sono abilitati tramite Network Watcher e vengono archiviati nell'archiviazione BLOB di Azure. Per connettersi ed elaborare log di flusso dall'archiviazione BLOB e inviarli a ElasticSearch viene usato un plug-in Logstash. Una volta che i log di flusso vengono archiviati in ElasticSearch possono essere analizzati e visualizzati in dashboard personalizzati in Grafana.

Grafana Network Watcher gruppo di sicurezza di rete

Passaggi di installazione

Abilitare la registrazione dei flussi dei gruppi di sicurezza di rete

Per questo scenario, è necessario abilitare la registrazione dei flussi dei gruppi di sicurezza di rete in almeno un gruppo di sicurezza di rete nel proprio account. Per istruzioni in proposito, vedere Introduzione alla registrazione dei flussi per i gruppi di sicurezza di rete.

Considerazioni sull'installazione

In questo esempio Grafana, ElasticSearch e Logstash sono configurati in un server Ubuntu LTS distribuito in Azure. Questa configurazione minima viene usata per l'esecuzione di tutti e tre i componenti, che sono tutti in esecuzione nella stessa macchina virtuale. Questo programma di installazione deve essere usato solo per i carichi di lavoro non critici e di test. Logstash Elasticsearch e Grafana possono essere progettati per la scalabilità in modo indipendente su numerose istanze. Per altre informazioni vedere la documentazione relativa ognuno di questi componenti.

Installare Logstash

Logstash consente di rendere flat i log di flusso in formato JSON a un livello di tupla dei flussi.

Le istruzioni seguenti vengono usate per installare Logstash in Ubuntu. Per istruzioni su come installare questo pacchetto in RHEL/CentOS, vedere l'articolo Installazione da repository di pacchetti - yum .

  1. Per installare Logstash, eseguire questi comandi:

    curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb
    sudo dpkg -i logstash-5.2.0.deb
    
  2. Configurare Logstash per analizzare i log di flusso e inviarli a ElasticSearch. Creare un file logstash.conf usando:

    sudo touch /etc/logstash/conf.d/logstash.conf
    
  3. Aggiungere il contenuto seguente al file. Modificare il nome e la chiave di accesso dell'account di archiviazione in modo da riflettere i dettagli dell'account di archiviazione:

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

Il file di configurazione di Logstash è composto da tre parti, ovvero input, filtro e output. La sezione input indica l'origine di input dei log che verranno elaborati da Logstash. In questo caso occorre usare un plug-in "azureblob" (che verrà installato nei passaggi successivi) che consentirà di accedere ai file JSON dei log di flusso dei gruppi di sicurezza di rete archiviati nell'archiviazione BLOB.

La sezione filtro rende quindi flat tutti i file di log di flusso in modo che ogni tupla dei flussi e le relative proprietà associate diventino un evento Logstash separato.

La sezione di output inoltra infine ogni evento Logstash al server ElasticSearch. È possibile modificare il file di configurazione Logstash in base alle esigenze specifiche.

Installare il plug-in di input Logstash per l'archiviazione BLOB di Azure

Questo plug-in Logstash consentirà di accedere direttamente ai log dei flussi dall'account di archiviazione BLOB designato. Per installare questo plug-in, nella directory di installazione Logstash predefinita (in questo caso /usr/share/logstash/bin) eseguire il comando seguente:

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

Per altre informazioni su questo plug-in vedere Logstash input plugin for Azure Storage Blobs (Plug-in di input Logstash per i BLOB del servizio di archiviazione di Azure).

Installare ElasticSearch

È possibile usare lo script seguente per installare ElasticSearch. Per informazioni sull'installazione di ElasticSearch vedere 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

Installare Grafana

Per installare ed eseguire Grafana usare questi comandi:

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

Per altre informazioni sull'installazione vedere Installing on Debian / Ubuntu (Installazione su Debian/Ubuntu).

Aggiungere il server ElasticSearch come un'origine dati

È necessario quindi aggiungere l'indice ElasticSearch contenente i log di flusso come origine dati. È possibile aggiungere un'origine dati selezionando Aggiungi origine dati e completando il modulo con le informazioni pertinenti. Un esempio di questa configurazione è reperibile nella schermata seguente:

Aggiungere un'origine dati

Creare un dashboard

Ora che Grafana è stata configurata correttamente per leggere l'indice ElasticSearch contenente i log di flusso dei gruppi di sicurezza di rete è possibile creare e personalizzare i dashboard. Per creare un nuovo dashboard, selezionare Create your first dashboard (Crea il primo dashboard). La configurazione per i grafi di esempio seguente mostra flussi segmentati per regola NSG:

Grafo del dashboard

La schermata seguente illustra un grafo e un grafico che mostrano i flussi principali e la loro frequenza. I flussi vengono visualizzati anche dalla regola NSG e dai flussi per decisione. Grafana è altamente personalizzabile, pertanto è consigliabile creare dashboard in base alle esigenze di monitoraggio specifiche. L'esempio seguente illustra un dashboard tipico:

Screenshot che mostra la configurazione del grafo di esempio con flussi segmentati dalla regola del gruppo di sicurezza di rete.

Conclusione

Grazie all'integrazione di Network Watcher con ElasticSearch e Grafana è ora possibile gestire e visualizzare in modo semplice e centralizzato i log di flusso dei gruppi di sicurezza di rete e altri dati. Grafana ha numerose altre potenti funzionalità grafiche che possono essere usate anche per gestire ulteriormente i log di flusso e capire meglio il traffico di rete. Dopo aver configurato e connesso ad Azure un'istanza di Grafana è possibile continuare a esplorare le altre funzionalità che offre.

Passaggi successivi