Share via


使用 網路監看員 和 Grafana 來管理和分析網路安全組流量記錄

警告

這篇文章參考 CentOS,這是接近生命週期結束 (EOL) 狀態的 Linux 發行版本。 請據以考慮您的使用方式和規劃。 如需詳細資訊,請參閱 CentOS 生命週期結束指引

網路安全組 (NSG) 流量記錄 提供資訊,可用來瞭解網路介面上的輸入和輸出IP流量。 這些流量記錄會根據每個 NSG 規則顯示輸出和輸入流量、流量適用的 NIC、流量的 5 個 Tuple 資訊(來源/目的地 IP、來源/目的地埠、通訊協定),以及允許或拒絕流量。

您可以在網路中啟用流量記錄的許多NSG。 這種記錄數據量使得剖析和取得記錄的深入解析相當麻煩。 本文提供使用 Grafana 集中管理這些 NSG 流量記錄的解決方案、開放原始碼 圖形工具 ElasticSearch、分散式搜尋和分析引擎,以及 Logstash,這是 開放原始碼 伺服器端數據處理管線。

案例

NSG 流量記錄會使用 網路監看員 啟用,並儲存在 Azure Blob 記憶體中。 Logstash 外掛程式可用來從 Blob 記憶體連線和處理流量記錄,並將其傳送至 ElasticSearch。 一旦流程記錄儲存在 ElasticSearch 中,就可以分析並可視化為 Grafana 中的自定義儀錶板。

NSG 網路監看員 Grafana

安裝步驟

啟用網路安全組流程記錄

在此案例中,您必須在您的帳戶中至少一個網路安全組上啟用網路安全組流量記錄。 如需啟用網路安全流記錄的指示,請參閱下列文章 網路安全組的流程記錄簡介。

設定考慮

在此範例中,Grafana、ElasticSearch 和 Logstash 是在部署在 Azure 中的 Ubuntu LTS 伺服器上設定。 此最小設定用於執行這三個元件 - 它們全都在相同的 VM 上執行。 此設定只應該用於測試和非關鍵工作負載。 Logstash、Elasticsearch 和 Grafana 都可以建構成跨多個實例獨立調整。 如需詳細資訊,請參閱這些元件的檔。

安裝Logstash

您可以使用 Logstash 將 JSON 格式化的流程記錄扁平化為流程 Tuple 層級。

下列指示可用來在Ubuntu中安裝Logstash。 如需如何在 RHEL/CentOS 中安裝此套件的指示,請參閱 從套件存放庫安裝 - yum 一文。

  1. 若要安裝 Logstash,請執行下列命令:

    curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb
    sudo dpkg -i logstash-5.2.0.deb
    
  2. 設定 Logstash 來剖析流程記錄,並將其傳送至 ElasticSearch。 使用下列專案建立 Logstash.conf 檔案:

    sudo touch /etc/logstash/conf.d/logstash.conf
    
  3. 將下列內容新增至該檔案。 變更記憶體帳戶名稱和存取金鑰,以反映您的記憶體帳戶詳細資料:

     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 規則所分割的流程:

儀錶板圖表

下列螢幕快照說明圖表和圖表,其中顯示頂端流程及其頻率。 NSG 規則和決策流程也會顯示流程。 Grafana 可高度自定義,因此建議您建立儀錶板以符合您的特定監視需求。 下列範例顯示一般儀錶板:

顯示範例圖形組態的螢幕快照,其中包含NSG規則區隔的流程。

推論

藉由整合 網路監看員 與 ElasticSearch 和 Grafana,您現在有一個方便且集中的方式,可管理和可視化 NSG 流量記錄和其他數據。 Grafana 有一些其他功能強大的圖形功能,也可以用來進一步管理流量記錄,並進一步瞭解您的網路流量。 現在您已設定 Grafana 實例並連線到 Azure,您可以繼續探索它所提供的其他功能。

下一步