本記事はWORDIAN Advent Calendar 2017の6日目の記事です。
WORDIANとは、筑波大学情報科学類において学類誌を発行する組織WORD編集部の部員のことを指します。WORD編集部のバックナンバーは、以下のリンクから読むことができます。
https://www.word-ac.net/
というわけで、本記事ではntopngを用いたネットワークトラフィック解析の方法を解説します。
ntopng
ntopngとは、ntop社により開発されているネットワークトラフィック解析ツールです。このツールは内部的にnDPIという同社開発のDeep Packet Inspectionツールを使用しており、これにより多様なプロトコルを判別することができます。また、最近のアップデートにより早速Nintendo Switchのプロトコルのサポートも追加されるなど、随時サポートするプロトコルを増やしています。nDPIがサポートするプロトコルのリストはこのページ (nDPI) に記載されています。
ntopngのようなトラフィック解析ツールの用法としては、以下のようなものが考えられます。
- 管理しているネットワークの通信の統計情報の取得
- マルウェアに感染したネットワークノードの検出 (C2CサーバへのアクセスやSMTPによるスパム等)
- 違法なBitTorrent等ネットワークの悪用の検出
ntopngにはCommunity(無料), Professional, Enterpriseの3つのEditionがあり、有料のEditionではミドルウェアのサポートやスケーラビリティのための機能が追加されています。また、同社開発の有料のnProbeを併せて使うことでNetFlowの収集も行うことができます。
本記事では、ntopngからElastic Stackに解析したトラフィックのデータを出力し、データの閲覧、可視化を行う方法を解説します。
インストール
ntopngは、公式のリポジトリをパッケージマネジャに追加してインストールすることが推奨されています。
また、Macの場合はHomebrewからもインストールすることができます。
以下の公式ページにてインストールの方法が解説されています。
https://www.ntop.org/get-started/download/
実行
以下のようなコマンドでトラフィックのキャプチャを開始します。 eth0
の部分はキャプチャしたいインターフェース名で置き換えてください。
$ sudo ntopng -i eth0
キャプチャするインターフェースは通常のインターフェースでも問題ありませんが、より実用的な用例としてはミラーリングされたネットワーク内のトラフィックを受け取るpromiscuousなインターフェースをキャプチャすることが考えられます。その場合もntopng側では特別な指定の必要はありません。
ntopngには独自のウェブインターフェースが用意されており、現在アクティブなflowや統計情報が閲覧できます。デフォルトでは3000番ポートで動作しますが、 -w 3001
のように変更することもできます。
このウェブインターフェースでもトラフィック情報を閲覧できますが、これは以下の理由からあまり優れていません。
- 無料のCommunity editionでは解析対象のflow数に制限がある
- 無料のCommunity editionでは主な統計情報の閲覧ができない
- Professional editionでも提供される統計の種類が少なく、またカスタマイズ性も低い
- 検索機能が弱い
そのため、ここからはntopngから解析データをElastic Stackに出力する方法を解説します。
Elastic Stackであれば、トラフィックの解析データから自由に検索・可視化を行うことができます。
ntopngがLogstashへの出力をサポートしているため、これは容易に行うことができます。
Elastic Stack
インストール
Elastic Stack (Elasticsearch, Logstash, Kibana)は公式のドキュメントに従ってパッケージマネジャにリポジトリを追加してインストールすることが推奨されています。
Debian系:
https://www.elastic.co/guide/en/elasticsearch/reference/current/deb.html
Red Hat系:
https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html
他、環境を汚さずに試したい場合は全部入りのDocker Composeを使うのがおすすめです。
https://github.com/deviantony/docker-elk
設定
Logstash pipeline
ntopngからの出力を受け取る設定の例は以下のようになります。
input {
tcp {
port => 5000
codec => line
tags => ["ntopng"]
}
}
filter {
if "ntopng" in [tags] {
json {
source => "message"
}
date {
match => ["ntop_timestamp" , "yyyy-MM-dd'T'HH:mm:ss.SSSZ"]
target => "@timestamp"
}
# Clear redundant field value
mutate {
remove_field => ["ntop_timestamp"]
}
}
}
output {
if "ntopng" in [tags] {
elasticsearch {
hosts => "localhost:9200"
index => "ntopng-%{+YYYY.MM.dd}"
}
}
}
以上の設定を保存して、Elastic Stackを起動することができたら、次のようなコマンドでntopngからデータを出力します
$ sudo ntopng -i eth0 --community -F "logstash;localhost;tcp;5000"
ntopngとElastic Stackそれぞれのログに特にエラーが表示されず、数分待って次のように ntopng-YYYY.MM.dd
のようなindexが作成されていたら大丈夫です。
$ curl 'localhost:9200/_cat/indices'
yellow open .kibana PAEnJSktQrGYLDNqJQrYDg 1 1 3 0 15.7kb 15.7kb
yellow open ntopng-2017.12.04 vWkqeq8CTjy3N7gyvrUbCg 5 1 9384 0 3.4mb 3.4mb
ntopngをsystemdなどで起動する場合は、次のように設定ファイルを書きます。
-i=eth0
--community
-F="logstash;localhost;tcp;5000"
起動方法:
$ sudo systemctl start ntopng
Kibana
indexが作成されたら、Kibanaからデータにアクセスしましょう。デフォルトでは、 http://localhost:5601 に起動します。
初回アクセス時に"Configure an index pattern"と聞かれたらIndex patternにntopng-*
, Time filter field nameに @timestamp
を指定します。
分析
ntopngを使用すると、パケットから様々な情報が取得できます。例えば、以下ではSSLの通信であってもアプリケーションレイヤのプロトコル、通信先のドメイン名、IPアドレス、国などといった情報が取得できています。
DNSクエリの内容なども取得できます。
他、BitTorrentの通信を判別した上で、BitTorrentのinfo hashも検出することができます。このinfo hashをGoogleなどで調べることで、これが違法なファイル共有の通信かどうかを調べることができます。例えば、以下の例では 145b85116626651912298f9400805254fb1192ae
をGoogle検索することで、これがubuntu-16.04.3-server-amd64のインストールイメージのダウンロードだと分かります。
他にも、ntopngはSSH, LDAP, DHCP, SMB, Skype, 各種SNS等様々なプロトコルを判別することができます。
可視化
Kibanaの機能で統計情報を可視化することもできます。以下の画像は、本記事と近い構成で会場wifiのトラフィックの解析を行った某カンファレンスの画像を拝借しています。
https://twitter.com/codeblue_noc/status/928792818222473216
まとめ
ntopngを用いることでトラフィックから様々な情報が取得できます。また、Logstashへの出力をサポートしているためElastic Stackとの親和性も高く、数十行の設定を書くだけで実用的なシステムを構築することができます。
TODO
個人的には試したことがありませんが、最近はElastic StackのX-Packのおかげで時系列データの異常検知の敷居が下がっているらしいので、ネットワークトラフィックで試してみると面白いかもしれません。