使用網路監看員和 Grafana 來管理和分析網路安全性群組流量記錄
重要
網路安全性群組 (NSG) 流量記錄將於 2027 年 9 月 30 日淘汰。 經此淘汰後,自 2025 年 6 月 30 日起您將無法再建立新的 NSG 流量記錄。 建議您移轉 (部分機器翻譯) 至虛擬網路流量記錄,以因應 NSG 流量記錄的限制。 過了淘汰日期之後,將不再支援啟用了 NSG 流量記錄的流量分析,且將會刪除您的訂用帳戶中現有的 NSG 流量記錄資源。 不過,NSG 流量記錄將不會刪除,且將繼續遵循其各自的保留原則。 如需詳細資訊,請參閱官方公告。
網路安全性群組 (NSG) 流量記錄提供的資訊可讓您用來了解網路介面上的輸入和輸出 IP 流量。 這些流量記錄會顯示每一個 NSG 規則的輸出和輸入流量、套用流量的 NIC、有關流量的 5 Tuple 資訊 (來源/目的地 IP、來源/目的地連接埠、通訊協定),以及流量是獲得允許還是遭到拒絕。
您可以在已啟用流量記錄的網路中擁有許多個 NSG。 這樣的記錄資料量會讓您在剖析以及從記錄中取得見解時變得很麻煩。 本文提供使用 Grafana 集中管理這些 NSG 流量記錄的解決方案、開放原始碼 圖形工具、Elasticsearch、分散式搜尋和分析引擎,以及 Logstash,這是 開放原始碼 伺服器端數據處理管線。
案例
NSG 流量記錄可使用網路監看員來啟用,並且會儲存在 Azure Blob 儲存體中。 Logstash 外掛程式可用來從 Blob 記憶體連線和處理流程記錄,並將其傳送至 Elasticsearch。 一旦流程記錄儲存在 Elasticsearch 中,就可以分析並可視化為 Grafana 中的自定義儀錶板。
安裝步驟
啟用網路安全性群組流量記錄
在此案例中,您必須在您的帳戶中至少一個網路安全性群組上啟用「網路安全性群組流量記錄」。 如需有關啟用網路安全性流量記錄的指示,請參閱下列文章︰網路安全性群組的流量記錄簡介。
設定考量
在此範例中,Grafana、Elasticsearch 和 Logstash 是在部署在 Azure 中的 Ubuntu LTS 伺服器上設定。 我們會使用這個最小型的設定來執行這三個元件,它們全都在相同的 VM 上執行。 此設定只應用於測試和非關鍵性的工作負載。 Logstash、Elasticsearch 和 Grafana 全都可以建構為可跨多個執行個體獨立擴充。 如需詳細資訊,請參閱這些元件各自的文件。
安裝 Logstash
您可以使用 Logstash 將 JSON 格式的流量記錄壓平合併至流量 Tuple 層級。
下列指示可用來在 Ubuntu 中安裝 Logstash。 如需如何在 Red Hat Enterprise Linux 中安裝此套件的指示,請參閱從套件存放庫安裝 - yum。
若要安裝 Logstash,請執行下列命令︰
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb sudo dpkg -i logstash-5.2.0.deb
設定 Logstash 來剖析流程記錄,並將其傳送至 Elasticsearch。 使用下列命令建立 Logstash.conf 檔案︰
sudo touch /etc/logstash/conf.d/logstash.conf
將下列內容新增至該檔案。 變更儲存體帳戶名稱和存取金鑰,以反映您的儲存體帳戶詳細資料:
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" } }
所提供的 Logstash 設定檔是由三個部分組成的:輸入、篩選和輸出。 「輸入」區段會指定 Logstash 將要處理之記錄的輸入來源,在此案例中,我們會使用「azureblob」輸入外掛程式 (會於後續步驟中安裝),它能讓我們存取 Blob 儲存體中所儲存的 NSG 流量記錄 JSON 檔案。
「篩選」區段接著會將每個流量記錄壓平合併,讓每個個別的流量 Tuple 和其相關聯的屬性變成個別的 Logstash 事件。
最後,輸出區段會將每個Logstash事件轉送至 Elasticsearch 伺服器。 請放心地修改 Logstash 設定檔以符合您的特定需求。
安裝 Azure Blob 儲存體的 Logstash 輸入外掛程式
這個 Logstash 外掛程式可讓您直接從流量記錄的指定 Blob 儲存體帳戶存取流量記錄。 若要安裝此外掛程式,請從預設的 Logstash 安裝目錄 (在此案例中為 /usr/share/logstash/bin) 執行下列命令:
sudo /usr/share/logstash/bin/logstash-plugin install logstash-input-azureblob
如需此外掛程式的詳細資訊,請參閱 Azure 儲存體 Blob 的 Logstash 輸入外掛程式。
安裝 Elasticsearch
您可以使用下列腳本來安裝 Elasticsearch。 如需安裝 Elasticsearch 的相關信息,請參閱 彈性堆疊。
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
安裝 Grafana
若要安裝和執行 Grafana,請執行下列命令︰
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
如需其他安裝資訊,請參閱在 Debian/Ubuntu 上安裝。
將 Elasticsearch 伺服器新增為數據源
接下來,您必須將包含流量記錄的 Elasticsearch 索引新增為數據源。 您可以藉由選取 [新增資料來源] 並在表單內填妥相關資訊,來新增資料來源。 您可以在下列螢幕擷取畫面找到這項設定的範例:
建立儀表板
現在,您已成功設定 Grafana 以從包含 NSG 流量記錄的 Elasticsearch 索引讀取,您可以建立和個人化儀錶板。 若要建立新的儀表板,請選取 [建立第一個儀表板]。 下列圖形設定範例會顯示依 NSG 規則所區分的流量:
推論
藉由整合 網路監看員 與 Elasticsearch 和 Grafana,您現在有一個方便且集中的方式,可管理和可視化 NSG 流量記錄和其他數據。 Grafana 還有許多功能強大的繪圖功能,可供您用來進一步管理流量記錄並深入了解您的網路流量。 您已經設定好 Grafana 執行個體並將其連線到 Azure,接下來請放心地繼續瀏覽它所提供的其他功能。
後續步驟
- 深入了解如何使用網路監看員。