次の方法で共有


オープン ソース ツールを使用した Azure Network Watcher NSG フロー ログの視覚化

重要

2027 年 9 月 30 日にネットワーク セキュリティ グループ (NSG) フロー ログは廃止されます。 この提供終了の一環として、2025 年 6 月 30 日以降新しい NSG フロー ログを作成できなくなります。 NSG フロー ログの制限を克服するために、仮想ネットワーク フロー ログ移行することをお勧めします。 提供終了日を過ぎると、NSG フロー ログで有効になっているトラフィック分析がサポートされなくなり、サブスクリプション内の既存の NSG フロー ログ リソースが削除されます。 ただし、NSG フロー ログのレコードは削除されず、引き続きそれぞれのアイテム保持ポリシーに従います。 詳細については、公式告知を参照してください。

ネットワーク セキュリティ グループのフロー ログで提供される情報は、ネットワーク セキュリティ グループでのイングレスとエグレス IP トラフィックを理解するのに役立ちます。 これらのフロー ログには、規則ごとの送信フローと受信フロー、フローの適用先の NIC、フローに関する 5 組の情報 (送信元/送信先 IP、送信元/送信先ポート、プロトコル) のほか、トラフィックが許可されたか拒否されたかどうかの情報が記録されます。

これらのフロー ログを手動で解析したり、そこから手動で有用な情報を取得したりするのは難しいかもしれません。 しかし、いくつかのオープン ソース ツールによって、こうしたデータを視覚化できます。 この記事では、Elastic Stack を使用してこれらのログを視覚化するソリューションについて説明します。このソリューションによって、Kibana ダッシュボードのフロー ログに簡単にインデックスを作成して視覚化できます。

シナリオ

この記事では、Elastic Stack を使ってネットワーク セキュリティ グループのフロー ログを視覚化できるソリューションを設定します。 Logstash 入力プラグインは、フロー ログを格納するように構成されているストレージ BLOB から直接、フロー ログを取得します。 Elastic Stack を使用して、フロー ログにインデックスを作成し、Kibana ダッシュボードを作成して、情報を視覚化します。

Elastic Stack を使ってネットワーク セキュリティ グループのフロー ログを視覚化できるシナリオの図。

手順

ネットワーク セキュリティ グループ フロー ログを有効にする

このシナリオでは、アカウント内の少なくとも 1 つのネットワーク セキュリティ グループで、ネットワーク セキュリティ グループのフロー ログが有効になっている必要があります。 ネットワーク セキュリティ フロー ログを有効にする手順については、ネットワーク セキュリティ グループのフロー ログの概要に関する記事をご覧ください。

Elastic Stack の設定

NSG のフロー ログを Elastic Stack に接続すると、Kibana ダッシュボードを作成して、ログから得た有用な情報を検索、グラフ化、分析、取得できます。

Elasticsearch のインストール

次の手順を使用して、Ubuntu Azure VM に Elasticsearch をインストールします。 Red Hat Enterprise Linux にエラスティック検索をインストールする方法については、「RPM を使用した Elasticsearch のインストール」を参照してください。

  1. Elastic Stack のバージョン 5.0 以降では、Java 8 が必要です。 java -version コマンドを実行して、現在のバージョンを確認します。 Java がインストールされていない場合は、Azure でサポートされている JDK に関するドキュメントを参照してください。

  2. お使いのシステムに適合するバイナリ パッケージをダウンロードします。

    curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.2.0.deb
    sudo dpkg -i elasticsearch-5.2.0.deb
    sudo /etc/init.d/elasticsearch start
    

    他のインストール方法についてはElasticsearch のインストールのページを参照してください。

  3. 次のコマンドを使用して、Elasticsearch が実行されていることを確認します。

    curl http://127.0.0.1:9200
    

    次のような応答が表示されます。

    {
    "name" : "Angela Del Toro",
    "cluster_name" : "elasticsearch",
    "version" : {
        "number" : "5.2.0",
        "build_hash" : "8ff36d139e16f8720f2947ef62c8167a888992fe",
        "build_timestamp" : "2016-01-27T13:32:39Z",
        "build_snapshot" : false,
        "lucene_version" : "6.1.0"
    },
    "tagline" : "You Know, for Search"
    }
    

Elasticsearch のインストール方法について詳しくは、インストールの方法に関するページをご覧ください。

Logstash のインストール

次の手順は、Ubuntu で Logstash をインストールするために使用します。 このパッケージを Red Hat Enterprise Linux にインストールする方法については、「パッケージ リポジトリからのインストール - 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 を構成する必要があります。 以下のコマンドで 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]}"
                    }
       convert => {"unixtimestamp" => "integer"}
       convert => {"srcPort" => "integer"}
       convert => {"destPort" => "integer"}
      }
    
      date{
        match => ["unixtimestamp" , "UNIX"]
      }
     }
    output {
      stdout { codec => rubydebug }
      elasticsearch {
        hosts => "localhost"
        index => "nsg-flow-logs"
      }
    }
    

Logstash のインストール方法の詳細については、公式ドキュメントを参照してください。

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

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

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

Logstash を開始するには、次のコマンドを実行します。

sudo /etc/init.d/logstash start

このプラグインの詳細については、ドキュメントを参照してください。

Kibana のインストール

Red Hat Enterprise Linux に Kibana をインストールする方法については、「RPM を使用した Kibana のインストール」を参照してください。 リポジトリ パッケージを使用して Ubuntu/Debian システムに Kibana をインストールする方法については、「APT リポジトリからの Kibana のインストール」を参照してください。

その後、Ubuntu で次の手順がテストされ、Ubuntu 固有ではないさまざまな Linux ディストリビューションで使用できます。

  1. Kibana をインストールするには、次のコマンドを実行します。

    curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-5.2.0-linux-x86_64.tar.gz
    tar xzvf kibana-5.2.0-linux-x86_64.tar.gz
    
  2. Kibana を実行するには、次のコマンドを使用します。

    cd kibana-5.2.0-linux-x86_64/
    ./bin/kibana
    
  3. Kibana Web インターフェイスを表示するには、http://localhost:5601 に移動します。

  4. ここでは、フロー ログで使用されているインデックスのパターンは "nsg-flow-logs" です。 インデックスのパターンは、logstash.conf ファイルの "output" セクションで変更できます。

  5. Kibana ダッシュボードをリモートで確認する場合は、NSG 受信ルールを作成して、ポート 5601 にアクセスできるようにします。

Kibana ダッシュボードの作成

アラートの傾向と詳細を表示するサンプル ダッシュボードを、次の図に示します。

図 1

ダッシュボード ファイル視覚化ファイル保存された検索ファイルをそれぞれダウンロードします。

Kibana の [Management (管理)] タブの下で [Saved Objects (保存されたオブジェクト)] に移動して、3 つのファイルすべてをインポートします。 これで、 [Dashboard (ダッシュボード)] タブからサンプル ダッシュボードを開いて読み込むことができます。

関心のあるメトリックに合わせて独自の視覚化とダッシュボードを作成することもできます。 Kibana の視覚化を作成する方法の詳細については、Kibana の公式ドキュメントを参照してください。

NSG フロー ログの視覚化

サンプルのダッシュボードには、フロー ログの視覚化データが複数用意されています。

  1. Flows by Decision/Direction Over Time (決定/方向別のフロー (時系列)) - 一定時間内のフローの数を時系列のグラフで表示します。 これらのグラフでは、時間の単位と範囲を編集できます。 Flows by Decision (決定別のフロー) は、許可または拒否の決定の割合を示しています。Flows by Direction (方向別のフロー) は、受信トラフィックと送信トラフィックの割合を示しています。 これらのグラフで、時間の経過に伴う傾向を精査し、急激な増加や異常なパターンがないかどうかを確認できます。

    サンプル ダッシュボードのスクリーンショット。時間の経過に伴うフローが決定別と方向別に表示されています。

  2. Flows by Destination/Source Port (送信先ポート/送信元ポート別のフロー) - 該当するポートごとにフローを分割した円グラフです。 このビューでは、最もよく使用されるポートを確認できます。 円グラフ内の特定のポートをクリックすると、ダッシュボードの空いている部分に、そのポートのフローの詳細が表示されます。

    サンプル ダッシュボードのスクリーンショット。フローが送信先別と送信元別に表示されています。

  3. Number of Flows (フローの数) と Earliest Log Time (最も早いログ時刻) - 記録されたフローの数と、ログが取得された最も早い時刻を示すメトリックです。

    サンプル ダッシュボードのスクリーンショット。フローの数と最も早いログ時刻を確認できます。

  4. Flows by NSG and Rule (NSG ごとのフローとルール) - 各 NSG 内のフローの分布、および各 NSG 内のルールの分布を示す棒グラフです。 、どの NSG とルールがトラフィックの多くの部分を生成しているかを確認できます。

    サンプル ダッシュボードのスクリーンショット。フローが NSG 別とルール別に表示されています。

  5. Top 10 Source/Destination IPs (送信元/送信先 IP の上位 10 個) - 送信元/送信先 IP の上位 10 個を示す棒グラフです。 グラフを調整して、表示される IP を増やしたり減らしたりできます。 ここから、最もよく使われる IP や、各 IP へのトラフィックの決定 (許可または拒否) を確認できます。

  6. Flow Tuples (フロー タプル) - 各フロー タプルに含まれる情報と、対応する NSG およびルールを示す表。

ダッシュボードの最上部にあるクエリ バーを使用して、フローのパラメーター (サブスクリプション ID、リソース グループ、ルール、また関連するその他の変数など) に基づいて、ダッシュボードをフィルターできます。 Kibana のクエリとフィルターの詳細については、公式ドキュメントを参照してください。

まとめ

ネットワーク セキュリティ グループのフロー ログと Elastic Stack を組み合わせると、ネットワーク トラフィックを視覚化する強力でカスタマイズ可能な方法が実現します。 これらのダッシュボードによって、ネットワーク トラフィックに関する有用な情報をすばやく取得して共有したり、潜在的な異常をフィルターして調査したりできます。 Kibana を使用して、これらのダッシュボードをカスタマイズし、セキュリティ、監査、およびコンプライアンスのニーズを満たすための特別な視覚化されたデータを作成できます。

次のステップ

Power BI による NSG フロー ログの視覚化に関するページから、Power BI で NSG フロー ログを視覚化する方法について確認する