Gestire e analizzare i log di flusso dei gruppi di sicurezza di rete con Network Watcher e Grafana
Importante
Il 30 settembre 2027 i log dei flussi del gruppo di sicurezza di rete (NSG) verranno ritirati. Come parte di questo ritiro, non sarà più possibile creare nuovi log dei flussi del gruppo di sicurezza di rete a partire dal 30 giugno 2025. È consigliabile la migrazione ai log dei flussi della rete virtuale, che superano le limitazioni dei log dei flussi del gruppo di sicurezza di rete. Dopo la data di ritiro, l'analisi del traffico abilitata con i log dei flussi del gruppo di sicurezza di rete non sarà più supportata e le risorse dei log dei flussi del gruppo di sicurezza di rete esistenti nelle sottoscrizioni verranno eliminate. Tuttavia, i record dei log dei flussi del gruppo di sicurezza di rete non verranno eliminati e continueranno a seguire i rispettivi criteri di conservazione. Per altre informazioni, consultare l'annuncio ufficiale.
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.
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. Per l'esecuzione dei tre componenti che sono tutti in esecuzione nella stessa macchina virtuale viene usata l'installazione minima. 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 Red Hat Enterprise Linux, vedere Installazione da repository di pacchetti - yum.
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
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
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:
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:
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.
Passaggio successivo
- Ulteriori informazioni sull'uso di Network Watcher.