Network Watcher と Grafana を使用してネットワーク セキュリティ グループのフロー ログを管理および分析する

注意

この記事では、間もなくサポート終了 (EOL) 状態になる Linux ディストリビューションである CentOS について説明します。 適宜、使用と計画を検討してください。 詳細については、「CentOS のサポート終了に関するガイダンス」を参照してください。

ネットワーク セキュリティ グループ (NSG) のフロー ログの情報を使用して、ネットワーク インターフェイスでのイングレスおよびエグレス IP トラフィックについて理解できます。 こうしたフロー ログからは、NSG ルールごとの送信および受信フロー、フローが適用されている NIC、フローに関する 5 組の情報 (送信元/送信先 IP、送信元/送信先ポート、プロトコル)、およびトラフィックの許可/拒否の状況がわかります。

フロー ログが有効になっているネットワークには多くの NSG がある場合があります。 このログ データ量により、ログを解析して洞察を得ることが煩雑になります。 この記事では、オープン ソースのグラフ作成ツールである Grafana、分散型の検索および分析エンジンである ElasticSearch、オープン ソースのサーバー側のデータ処理パイプラインである Logstash を使用してこれらの NSG フロー ログを一元的に管理するソリューションについて説明します。

シナリオ

NSG フロー ログは、Network Watcher を使用して有効化され、Azure Blob Storage に格納されます。 Logstash プラグインを使用して、Blob Storage に接続してそこからのフロー ログを処理し、ElasticSearch に送信します。 ElasticSearch にフロー ログが格納されたら、これらを分析し、Grafana のカスタマイズされたダッシュ ボードに視覚化できます。

NSG Network Watcher Grafana

インストール手順

ネットワーク セキュリティ グループのフロー ログの有効化

このシナリオでは、アカウント内の少なくとも 1 つのネットワーク セキュリティ グループで、ネットワーク セキュリティ グループのフロー ログを有効にする必要があります。 ネットワーク セキュリティ フロー ログを有効にする手順については、「Introduction to flow logging for Network Security Groups (ネットワーク セキュリティ グループのフロー ログの概要)」をご覧ください。

設定の考慮事項

この例では、Azure にデプロイされた Ubuntu LTS サーバーで Grafana、ElasticSearch、Logstash が構成されます。 この最小限のセットアップが、3 つのコンポーネントすべてを実行するために使用されます。これらはすべて、同じ VM で実行されます。 この設定は、テストおよび重大ではないワークロードにのみ使用する必要があります。 Logstash、Elasticsearch、Grafana はすべて、多くのインスタンスで個別に拡大縮小するように構築できます。 詳細については、これらの各コンポーネントのドキュメントをご覧ください。

Logstash のインストール

Logstash を使用して、JSON 形式のフロー ログをフロー タプル レベルにフラット化します。

次の手順は、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. フロー ログを解析し、ElasticSearch に送信するように Logstash を構成します。 以下のコマンドで 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 構成ファイルは、input、filter、output の 3 つの部分で構成されます。 input セクションでは、Logstash が処理するログの入力ソースを指定します。この例では、(次の手順でインストールする) "azureblob" 入力プラグインを使用します。この入力プラグインを使用すると、Blob Storage に保存されている NSG フロー ログの JSON ファイルにアクセスできます。

filter セクションは、個々のフロー タプルとそれに関連付けられたプロパティが別の Logstash イベントになるように、各フロー ログ ファイルをフラット化します。

最後に、output セクションは、各 Logstash イベントを ElasticSearch サーバーに転送します。 Logstash 構成ファイルは、特定のニーズに合わせて自由に変更できます。

Azure Blob Storage 向けの Logstash 入力プラグインのインストール

この Logstash プラグインを使用すると、指定された Blob Storage アカウントから、フロー ログに直接アクセスできます。 このプラグインをインストールするには、既定の Logstash インストール ディレクトリ (この場合、/usr/share/logstash/bin) から、次のコマンドを実行します。

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

このプラグインの詳細については、Azure Storage Blob の Logstash 入力のプラグインに関するページをご覧ください。

ElasticSearch のインストール

次のスクリプトを使用して、ElasticSearch をインストールすることができます。 ElasticSearch のインストールの詳細については、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

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

追加のインストール情報については、「Installing on Debian / Ubuntu (Debian/Ubuntu へのインストール)」をご覧ください。

ElasticSearch サーバーをデータ ソースとして追加する

次に、フロー ログを含む ElasticSearch インデックスをデータ ソースとして追加する必要があります。 [データ ソースの追加] を選択し、関連情報をフォームに入力して、データ ソースを追加することができます。 この構成のサンプルは、次のスクリーン ショットをご覧ください。

データ ソースを追加する

ダッシュボードを作成する

NSG フロー ログを含む ElasticSearch インデックスから読み取るように Grafana が正常に構成されたら、ダッシュボードを作成し、カスタマイズできます。 新しいダッシュボードを作成するには、 [Create your first dashboard](最初のダッシュボードの作成) を選択します。 次のサンプル グラフ構成は、NSG ルールによってセグメント化されたフローを示しています。

ダッシュボード グラフ

次のスクリーンショットは、最上位のフローとその頻度を示すグラフとチャートを示しています。 フローは、NSG ルールごと、および決定別のフローごとにも表示されます。 Grafana はカスタマイズの自由度が高いため、特定の監視ニーズに合わせてダッシュボードを作成することをお勧めします。 次の例は、一般的なダッシュボードを示しています。

NSG ルールによってセグメント化されたフローを含むサンプル グラフ構成を示すスクリーンショット。

まとめ

Network Watcher を ElasticSearch および Grafana と統合すると、NSG フロー ログだけでなく他のデータを簡単かつ一元的に管理および視覚化することができます。 Grafana には、他にもいくつかの強力なグラフ機能があります。その機能を使用して、フロー ログをさらに細かく管理し、ネットワーク トラフィックをより深く理解できます。 Grafana インスタンスを設定し、Azure に接続したので、提供される他の機能の探索に進むことができます。

次のステップ