Správa a analýza protokolů toků skupin zabezpečení sítě pomocí služby Network Watcher a Grafana
Důležité
30. září 2027 se protokoly toku skupiny zabezpečení sítě (NSG) vyřadí z provozu. V rámci tohoto vyřazení už nebudete moct vytvářet nové protokoly toku NSG od 30. června 2025. Doporučujeme migrovat na protokoly toku virtuální sítě, které překonat omezení protokolů toku NSG. Po datu vyřazení se už nebudou podporovat analýzy provozu s protokoly toků NSG a stávající prostředky protokolů toku NSG ve vašich předplatných se odstraní. Záznamy protokolů toku NSG se ale neodstraní a budou dál dodržovat příslušné zásady uchovávání informací. Další informace najdete v oficiálním oznámení.
Protokoly toku skupiny zabezpečení sítě (NSG) poskytují informace, které je možné použít k pochopení příchozího a odchozího provozu IP v síťových rozhraních. Tyto protokoly toků zobrazují odchozí a příchozí toky na základě jednotlivých pravidel NSG, tok se vztahuje na 5 informací o toku (zdrojová/cílová IP adresa, zdrojový/cílový port, protokol) a o tom, jestli byl provoz povolený nebo zakázaný.
V síti můžete mít mnoho skupin zabezpečení sítě s povoleným protokolováním toku. Díky tomuto množství dat protokolování je obtížné analyzovat a získat přehledy z protokolů. Tento článek poskytuje řešení pro centrální správu těchto protokolů toku NSG pomocí Grafany, opensourcového nástroje pro grafy, ElasticSearch, distribuovaného vyhledávacího a analytického modulu a logstash, což je opensourcový kanál zpracování dat na straně serveru.
Scénář
Protokoly toku NSG jsou povolené pomocí služby Network Watcher a ukládají se do úložiště objektů blob v Azure. Modul plug-in Logstash slouží k připojení a zpracování protokolů toku z úložiště objektů blob a jejich odesílání do ElasticSearch. Jakmile jsou protokoly toku uložené v ElasticSearch, můžete je analyzovat a vizualizovat do přizpůsobených řídicích panelů v Grafana.
Instalační kroky
Povolení protokolování toku skupiny zabezpečení sítě
Pro tento scénář musíte mít v účtu povolené protokolování toku skupiny zabezpečení sítě aspoň u jedné skupiny zabezpečení sítě. Pokyny k povolení protokolů toku zabezpečení sítě najdete v následujícím článku Úvod k protokolování toku pro skupiny zabezpečení sítě.
Důležité informace o nastavení
V tomto příkladu jsou Grafana, ElasticSearch a Logstash nakonfigurované na Ubuntu LTS Serveru nasazeného v Azure. Toto minimální nastavení se používá pro spouštění všech tří komponent – všechny běží na stejném virtuálním počítači. Toto nastavení by se mělo používat jenom pro testování a nekritické úlohy. Protokoly Logstash, Elasticsearch a Grafana se dají navrhovat tak, aby se škálovaly nezávisle na mnoha instancích. Další informace najdete v dokumentaci pro každou z těchto komponent.
Instalace Logstash
Logstash slouží k zploštění protokolů toku ve formátu JSON na úroveň řazené kolekce členů toku.
Následující pokyny se používají k instalaci Logstash v Ubuntu. Pokyny k instalaci tohoto balíčku v Red Hat Enterprise Linuxu najdete v tématu Instalace z úložišť balíčků – yum.
Pokud chcete nainstalovat Logstash, spusťte následující příkazy:
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb sudo dpkg -i logstash-5.2.0.deb
Nakonfigurujte Logstash tak, aby parsoval protokoly toku a odeslal je do ElasticSearch. Vytvořte soubor Logstash.conf pomocí:
sudo touch /etc/logstash/conf.d/logstash.conf
Do souboru přidejte následující obsah. Změňte název účtu úložiště a přístupový klíč tak, aby odpovídal podrobnostem vašeho účtu úložiště:
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" } }
Zadaný konfigurační soubor Logstash se skládá ze tří částí: vstupu, filtru a výstupu. Vstupní oddíl určuje vstupní zdroj protokolů, které bude Logstash zpracovávat – v tomto případě použijeme vstupní modul plug-in Azureblob (nainstalovaný v dalších krocích), který nám umožní přístup k souborům JSON protokolu toku NSG uloženým v úložišti objektů blob.
Oddíl filtru pak zploštějí každý soubor protokolu toku tak, aby se každá jednotlivá řazená kolekce členů toku a její přidružené vlastnosti stala samostatnou událostí Logstash.
Výstupní část nakonec přesměruje každou událost Logstash na server ElasticSearch. Konfigurační soubor Logstash můžete upravit tak, aby vyhovoval vašim konkrétním potřebám.
Instalace vstupního modulu plug-in Logstash pro Azure Blob Storage
Tento modul plug-in Logstash umožňuje přímý přístup k protokolům toku z určeného účtu úložiště objektů blob. Pokud chcete nainstalovat tento modul plug-in, spusťte z výchozího instalačního adresáře Logstash (v tomto případě /usr/share/logstash/bin) příkaz:
sudo /usr/share/logstash/bin/logstash-plugin install logstash-input-azureblob
Další informace o tomto modulu plug-in najdete v tématu Vstupní modul plug-in Logstash pro objekty blob služby Azure Storage.
Instalace ElasticSearch
K instalaci ElasticSearch můžete použít následující skript. Informace o instalaci ElasticSearch najdete v tématu 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
Instalace Grafany
Pokud chcete nainstalovat a spustit Grafana, spusťte následující příkazy:
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
Další informace o instalaci naleznete v tématu Instalace na Debian / Ubuntu.
Přidání serveru ElasticSearch jako zdroje dat
Dále musíte přidat index ElasticSearch obsahující protokoly toku jako zdroj dat. Zdroj dat můžete přidat výběrem možnosti Přidat zdroj dat a vyplněním formuláře s příslušnými informacemi. Ukázku této konfigurace najdete na následujícím snímku obrazovky:
Vytvoření řídicího panelu
Teď, když jste grafana úspěšně nakonfigurovali pro čtení z indexu ElasticSearch obsahujícího protokoly toku NSG, můžete vytvářet a přizpůsobovat řídicí panely. Pokud chcete vytvořit nový řídicí panel, vyberte Vytvořit první řídicí panel. Následující ukázková konfigurace grafu ukazuje toky segmentované pravidlem NSG:
Závěr
Díky integraci služby Network Watcher s ElasticSearch a Grafana teď máte pohodlný a centralizovaný způsob správy a vizualizace protokolů toku NSG a dalších dat. Grafana má řadu dalších výkonných funkcí grafů, které se dají použít také k další správě protokolů toku a lepšímu pochopení síťového provozu. Teď, když máte instanci Grafana nastavenou a připojenou k Azure, můžete pokračovat v prozkoumání dalších funkcí, které nabízí.
Další krok
- Přečtěte si další informace o používání služby Network Watcher.