ntopng + Elastic Stackによるネットワークトラフィック解析

本記事は[WORDIAN Advent Calendar 2017](https://adventar.org/calendars/2573)の6日目の記事です。
WORDIANとは、筑波大学情報科学類において学類誌を発行する組織WORD編集部の部員のことを指します。WORD編集部のバックナンバーは、以下のリンクから読むことができます。
https://www.word-ac.net/

というわけで、本記事ではntopngを用いたネットワークトラフィック解析の方法を解説します。

# ntopng
[ntopng](https://www.ntop.org/products/traffic-analysis/ntop/)とは、ntop社により開発されているネットワークトラフィック解析ツールです。このツールは内部的に[nDPI](https://www.ntop.org/products/deep-packet-inspection/ndpi/)という同社開発のDeep Packet Inspectionツールを使用しており、これにより多様なプロトコルを判別することができます。また、[最近のアップデート](https://www.ntop.org/announce/announcing-ndpi-2-2/)により早速Nintendo Switchのプロトコルのサポートも追加されるなど、随時サポートするプロトコルを増やしています。nDPIがサポートするプロトコルのリストはこのページ ([nDPI](https://www.ntop.org/products/deep-packet-inspection/ndpi/)) に記載されています。

ntopngのようなトラフィック解析ツールの用法としては、以下のようなものが考えられます。

- 管理しているネットワークの通信の統計情報の取得
- マルウェアに感染したネットワークノードの検出 (C2CサーバへのアクセスやSMTPによるスパム等)
- 違法なBitTorrent等ネットワークの悪用の検出

ntopngにはCommunity(無料), Professional, Enterpriseの3つのEditionがあり、有料のEditionではミドルウェアのサポートやスケーラビリティのための機能が追加されています。また、同社開発の有料の[nProbe](https://www.ntop.org/products/netflow/nprobe/)を併せて使うことでNetFlowの収集も行うことができます。

本記事では、ntopngからElastic Stackに解析したトラフィックのデータを出力し、データの閲覧、可視化を行う方法を解説します。

## インストール
ntopngは、公式のリポジトリをパッケージマネジャに追加してインストールすることが推奨されています。
また、Macの場合はHomebrewからもインストールすることができます。
以下の公式ページにてインストールの方法が解説されています。
https://www.ntop.org/get-started/download/

## 実行
以下のようなコマンドでトラフィックのキャプチャを開始します。 `eth0` の部分はキャプチャしたいインターフェース名で置き換えてください。

```bash
$ 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からの出力を受け取る設定の例は以下のようになります。

```ruby:/etc/logstash/conf.d/ntopng.conf
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からデータを出力します

```bash
$ sudo ntopng -i eth0 --community -F "logstash;localhost;tcp;5000"
```

ntopngとElastic Stackそれぞれのログに特にエラーが表示されず、数分待って次のように `ntopng-YYYY.MM.dd` のようなindexが作成されていたら大丈夫です。

```bash
$ 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などで起動する場合は、次のように設定ファイルを書きます。

```text:/etc/ntopng/ntopng.conf
-i=eth0
--community
-F="logstash;localhost;tcp;5000"
```

起動方法:

```bash
$ 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アドレス、国などといった情報が取得できています。

![ssl_twitter.png](https://qiita-image-store.s3.amazonaws.com/0/53690/318dfa52-85cd-e3a6-1daa-91651b323a33.png)

DNSクエリの内容なども取得できます。

<img width="889" alt="dns.png" src="https://qiita-image-store.s3.amazonaws.com/0/53690/b24970c8-3e6c-8608-2a07-0c503d4e56c7.png">

他、BitTorrentの通信を判別した上で、BitTorrentのinfo hashも検出することができます。このinfo hashをGoogleなどで調べることで、これが違法なファイル共有の通信かどうかを調べることができます。例えば、以下の例では `145b85116626651912298f9400805254fb1192ae` をGoogle検索することで、これがubuntu-16.04.3-server-amd64のインストールイメージのダウンロードだと分かります。

<img width="887" alt="bittorrent.png" src="https://qiita-image-store.s3.amazonaws.com/0/53690/a1a1508a-3160-6922-27a5-d7f9d60cfca6.png">

他にも、ntopngはSSH, LDAP, DHCP, SMB, Skype, 各種SNS等様々なプロトコルを判別することができます。

### 可視化
Kibanaの機能で統計情報を可視化することもできます。以下の画像は、本記事と近い構成で会場wifiのトラフィックの解析を行った某カンファレンスの画像を拝借しています。
https://twitter.com/codeblue_noc/status/928792818222473216

![cbnoc_2017_day1.jpg](https://qiita-image-store.s3.amazonaws.com/0/53690/a79611df-fc92-3787-6f3b-1d86d14b43d5.jpeg)

# まとめ
ntopngを用いることでトラフィックから様々な情報が取得できます。また、Logstashへの出力をサポートしているためElastic Stackとの親和性も高く、数十行の設定を書くだけで実用的なシステムを構築することができます。

## TODO
個人的には試したことがありませんが、最近はElastic StackのX-Packのおかげで時系列データの異常検知の敷居が下がっているらしいので、ネットワークトラフィックで試してみると面白いかもしれません。