オープン ソース ツールを使用した Azure Network Watcher NSG フロー ログの視覚化
ネットワーク セキュリティ グループのフロー ログで提供される情報は、ネットワーク セキュリティ グループでのイングレスとエグレス IP トラフィックを理解するのに役立ちます。 これらのフロー ログには、規則ごとの送信フローと受信フロー、フローの適用先の NIC、フローに関する 5 組の情報 (送信元/送信先 IP、送信元/送信先ポート、プロトコル) のほか、トラフィックが許可されたか拒否されたかどうかの情報が記録されます。
これらのフロー ログを手動で解析したり、そこから手動で有用な情報を取得したりするのは難しいかもしれません。 しかし、いくつかのオープン ソース ツールによって、こうしたデータを視覚化できます。 この記事では、Elastic Stack を使用してこれらのログを視覚化するソリューションについて説明します。このソリューションによって、Kibana ダッシュボードのフロー ログに簡単にインデックスを作成して視覚化できます。
シナリオ
この記事では、Elastic Stack を使ってネットワーク セキュリティ グループのフロー ログを視覚化できるソリューションを設定します。 Logstash 入力プラグインは、フロー ログを格納するように構成されているストレージ BLOB から直接、フロー ログを取得します。 Elastic Stack を使用して、フロー ログにインデックスを作成し、Kibana ダッシュボードを作成して、情報を視覚化します。
手順
ネットワーク セキュリティ グループ フロー ログを有効にする
このシナリオでは、アカウント内の少なくとも 1 つのネットワーク セキュリティ グループで、ネットワーク セキュリティ グループのフロー ログが有効になっている必要があります。 ネットワーク セキュリティ フロー ログを有効にする手順については、ネットワーク セキュリティ グループのフロー ログの概要に関する記事をご覧ください。
Elastic Stack の設定
NSG のフロー ログを Elastic Stack に接続すると、Kibana ダッシュボードを作成して、ログから得た有用な情報を検索、グラフ化、分析、取得できます。
Elasticsearch のインストール
次の手順を使用して、Ubuntu Azure VM に Elasticsearch をインストールします。 Red Hat Enterprise Linux にエラスティック検索をインストールする方法については、「RPM を使用した Elasticsearch のインストール」を参照してください。
Elastic Stack のバージョン 5.0 以降では、Java 8 が必要です。
java -version
コマンドを実行して、現在のバージョンを確認します。 Java がインストールされていない場合は、Azure でサポートされている JDK に関するドキュメントを参照してください。お使いのシステムに適合するバイナリ パッケージをダウンロードします。
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 のインストールのページを参照してください。
次のコマンドを使用して、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」の記事を参照してください。
Logstash をインストールするには、次のコマンドを実行します。
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.2.0.deb sudo dpkg -i logstash-5.2.0.deb
次に、フロー ログにアクセスし、解析するように Logstash を構成する必要があります。 以下のコマンドで 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]}" } 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 ディストリビューションで使用できます。
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
Kibana を実行するには、次のコマンドを使用します。
cd kibana-5.2.0-linux-x86_64/ ./bin/kibana
Kibana Web インターフェイスを表示するには、
http://localhost:5601
に移動します。ここでは、フロー ログで使用されているインデックスのパターンは "nsg-flow-logs" です。 インデックスのパターンは、logstash.conf ファイルの "output" セクションで変更できます。
Kibana ダッシュボードをリモートで確認する場合は、NSG 受信ルールを作成して、ポート 5601 にアクセスできるようにします。
Kibana ダッシュボードの作成
アラートの傾向と詳細を表示するサンプル ダッシュボードを、次の図に示します。
ダッシュボード ファイル、視覚化ファイル、保存された検索ファイルをそれぞれダウンロードします。
Kibana の [Management (管理)] タブの下で [Saved Objects (保存されたオブジェクト)] に移動して、3 つのファイルすべてをインポートします。 これで、 [Dashboard (ダッシュボード)] タブからサンプル ダッシュボードを開いて読み込むことができます。
関心のあるメトリックに合わせて独自の視覚化とダッシュボードを作成することもできます。 Kibana の視覚化を作成する方法の詳細については、Kibana の公式ドキュメントを参照してください。
NSG フロー ログの視覚化
サンプルのダッシュボードには、フロー ログの視覚化データが複数用意されています。
Flows by Decision/Direction Over Time (決定/方向別のフロー (時系列)) - 一定時間内のフローの数を時系列のグラフで表示します。 これらのグラフでは、時間の単位と範囲を編集できます。 Flows by Decision (決定別のフロー) は、許可または拒否の決定の割合を示しています。Flows by Direction (方向別のフロー) は、受信トラフィックと送信トラフィックの割合を示しています。 これらのグラフで、時間の経過に伴う傾向を精査し、急激な増加や異常なパターンがないかどうかを確認できます。
Flows by Destination/Source Port (送信先ポート/送信元ポート別のフロー) - 該当するポートごとにフローを分割した円グラフです。 このビューでは、最もよく使用されるポートを確認できます。 円グラフ内の特定のポートをクリックすると、ダッシュボードの空いている部分に、そのポートのフローの詳細が表示されます。
Number of Flows (フローの数) と Earliest Log Time (最も早いログ時刻) - 記録されたフローの数と、ログが取得された最も早い時刻を示すメトリックです。
Flows by NSG and Rule (NSG ごとのフローとルール) - 各 NSG 内のフローの分布、および各 NSG 内のルールの分布を示す棒グラフです。 、どの NSG とルールがトラフィックの多くの部分を生成しているかを確認できます。
Top 10 Source/Destination IPs (送信元/送信先 IP の上位 10 個) - 送信元/送信先 IP の上位 10 個を示す棒グラフです。 グラフを調整して、表示される IP を増やしたり減らしたりできます。 ここから、最もよく使われる IP や、各 IP へのトラフィックの決定 (許可または拒否) を確認できます。
Flow Tuples (フロー タプル) - 各フロー タプルに含まれる情報と、対応する NSG およびルールを表示する表です。
ダッシュボードの最上部にあるクエリ バーを使用して、フローのパラメーター (サブスクリプション ID、リソース グループ、ルール、また関連するその他の変数など) に基づいて、ダッシュボードをフィルターできます。 Kibana のクエリとフィルターの詳細については、公式ドキュメントを参照してください。
まとめ
ネットワーク セキュリティ グループのフロー ログと Elastic Stack を組み合わせると、ネットワーク トラフィックを視覚化する強力でカスタマイズ可能な方法が実現します。 これらのダッシュボードによって、ネットワーク トラフィックに関する有用な情報をすばやく取得して共有したり、潜在的な異常をフィルターして調査したりできます。 Kibana を使用して、これらのダッシュボードをカスタマイズし、セキュリティ、監査、およびコンプライアンスのニーズを満たすための特別な視覚化されたデータを作成できます。
次のステップ
Power BI による NSG フロー ログの視覚化に関するページから、Power BI で NSG フロー ログを視覚化する方法について確認する