ntopng + ELK + raspberry pi3 でなんちゃってSIEM環境をつくる



# 用意するもの

1.raspberry pi3(Raspbian環境） [Amazonでこれにしました](http://amzn.to/2FTsFkV)
2.[USB-LAN変換アダプタ](http://amzn.to/2FUIuYL)（キャプチャ用NICとして利用）

# 構成図
適当な構成図ですみません・・・。
L2には色々PCやらWifiAPやらがつながっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/48100/92917155-20b0-7cae-02e7-6de89b9ba372.png)



# 環境構築
## Raspberry Pi3設定
SSHでログインできるように、管理用固定IPを付与してください。
USB-LAN変換アダプタは接続すれば自動的に認識するはずなので、そのままでOK

## nDPIインストール
nDPIをインストールする前に、ntopngをインストールしようとすると下記メッセージが表示されてしまうので、先にnDPIをインストールします。

```bash
Please do cd ..; git clone https://github.com/ntop/nDPI.git; cd nDPI; ./autogen.sh; make; cd ../ntopng
and try again
```

## nDPI

```bash
git clone https://github.com/ntop/nDPI.git
./autogen.sh
PCAPない！
apt-get install libpcap-dev
Permission Deniedのエラーがでる
chmod 755 configure
./autogen.sh
./configure
make
cd tests/
./do.sh
OK表示がずらずらと
```

## ntopngインストール

```bash
apt-get install build-essential git bison flex libxml2-dev libpcap-dev libtool libtool-bin rrdtool librrd-dev autoconf automake autogen redis-server wget libsqlite3-dev libhiredis-dev libgeoip-dev libcurl4-openssl-dev libpango1.0-dev libcairo2-dev libnetfilter-queue-dev zlib1g-dev libssl-dev libcap-dev libnetfilter-conntrack-dev
apt-get install libpng-dev libzmq5-dev default-libmysqlclient-dev
git clone https://github.com/ntop/ntopng.git
cd ntopng
./autogen.sh
./configure
make geoip
もう一度
./configure
make
make install
```

## javaインストール
```bash
$ sudo apt-get install oracle-java8-jdk
$ sudo apt-get update
```

## elasticsearchインストール
リポジトリ追加で6.xをインストールしようとしたのですが、CPUアーキテクチャがARMのため
うまくインストールできませんでした。
そのため、5.x系で構築しています。

```bash
$ cd /usr/local/src
$ sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.deb
$ sudo dpkg -i elasticsearch-5.5.2.deb
```

標準だとメモリが、1G?2G?設定になっているため起動できません。
(ラズパイメモリ1GBしかないので・・・)
そのため、jvm.optionsを編集します。

```bash
$ sudo vi /etc/elasticsearch/jvm.options
下記のように変更します。
-Xms256M
-Xmx256M
```

### elasticsearch起動

```bash
$ sudo service elasticsearch start
```

## kibanaインストール

```bash
$ sudo wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.2-linux-x86.tar.gz
$ sudo tar –xzf kibana-5.5.2-linux-x86.tar.gz
$ sudo mkdir /opt/kibana/
$ sudo mv kibana-5.5.2-linux-x86/ /opt/kibana/
$ sudo wget https://nodejs.org/download/release/v6.10.2/node-v6.10.2-linux-armv6l.tar.gz
$ tar -xzf node-v6.10.2-linux-armv6l.tar.gz
$ sudo cp node-v6.10.2-linux-armv6l/bin/node /usr/local/bin/node
$ sudo cp node-v6.10.2-linux-armv6l/bin/npm /usr/local/bin/npm
$ sudo mv /opt/kibana/node/bin/node /opt/kibana/node/bin/node.orig
$ sudo mv /opt/kibana/node/bin/npm /opt/kibana/node/bin/npm.orig 
$ sudo ln -s /usr/local/bin/node /opt/kibana/node/bin/node 
$ sudo ln -s /usr/local/bin/npm /opt/kibana/node/bin/npm
$ sudo vi /opt/kibana/config/kibana.yml
```

リモートからkibanaにアクセス可能にするため、kibana.ymlを変更します。
今回はどこからでもアクセス可能としています。

```bash
$sudo vi /opt/kibana/config/kibana.
server.host: "0.0.0.0"
```
### kibana起動ファイル作成

```bash
$ sudo vi /etc/systemd/system/kibana.service
下記内容で保存します。
[Unit]
Description=Kibana

[Service]
ExecStart=/opt/kibana/bin/kibana
StandardOutput=null

[Install]
WantedBy=multi-user.target
```

### kibana起動

```bash
$ sudo service kibana start
$ sudo service kibana status
```

## logstashインストール

```bash
$ sudo wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.2.deb
$ sudo dpkg -i logstash-5.5.2.deb
$ sudo apt-get install ant
$ sudo git clone https://github.com/jnr/jffi.git
$ cd jffi
$ sudo ant jar
$ cp build/jni/libjffi-1.2.so /usr/share/logstash/vendor/jruby/lib/jni/arm-Linux
(when the .so file is not generated, delete the complete jffi folder and reinstall again)
$ cd /usr/share/logstash/vendor/jruby/lib
$ sudo zip -g jruby-complete-1.7.11.jar jni/arm-Linux/libjffi-1.2.so
```

elasticsearchと同様jvm.optionsを変更します。

```bash
$ sudo vi /etc/logstash/jvm.options
下記のように変更します。
-Xms256m
-Xmx256m
```

### logstash起動

```bash
$ sudo service logstash start
$ sudo service logstash status
```

### logstash設定
ntopngからのログを、logstashで受け取りelasticsearchに飛ばします。

```bash
$ sudo /etc/logstash/conf.d/ntopng.conf

下記内容で保存します。
input {
  tcp {
    port => 5000
    codec => json
    type => "ntopng"
  }
}

## Add your filters / logstash plugins configuration here

output {
  elasticsearch {
    hosts => "localhost:9200"
    index => "ntopng-%{+YYYY.MM.dd}"
  }
}
```
### logstash起動

```bash
$ sudo service logstash start
$ sudo service logstash status
```

## ntopng起動

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

## ntopngへWebUIからログイン
デフォルトだと3000番ポートで起動します。
ブラウザを起動して、http://ホスト:3000/ へアクセスします。

下記画面が表示されれば起動しています。
デフォルトは、admin/admin でログインできるので入力しログインします。
パスワード変更画面が表示されるので、自身が利用するパスワードを設定しておいてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/48100/e6db36f8-b896-2f31-1a2f-8a6abecb75f4.png)

TOP画面が表示されます。
![ntopGUI001.PNG](https://qiita-image-store.s3.amazonaws.com/0/48100/c4d0dc0f-bbee-5665-c2f2-f962b8fd205d.png)

ここまで確認できればひとまずntopngはOKです。

## elasticsearchにindexが作成されているか確認する
ntopngを起動してから、数分間（10分くらい）おいてから下記コマンドを実行しindexが作成されているか確認します。

```bash
$ curl http://localhost:9200/_cat/indices
yellow open .kibana           V4sLU9SfTOGEXBXVksubDQ 1 1     11 0 23.9kb 23.9kb
red    open ntopng-2018.03.05 2UdzLd0CSnCD5gW7IYiU_g 5 1  80500 0 34.7mb 34.7mb
red    open ntopng-2018.03.04 gxIJvo5tRaydYheruLDQ3A 5 1 231043 0 98.9mb 98.9mb
```

ntopng-YYYY.MM.DDという表示があればOKです。

## kibanaで可視化する
1.ブラウザを利用して、http://ホスト:5601/ にアクセスします。
2.左ペインからManagementをクリック
3.Create Index Patternをクリック
4.Time-field name ドロップダウンから@timestampフィールドを選択
5.Createをクリック

このあとVisualizeからグラフ等を作成することで、下記のようななんちゃってSIEMができあがります。
![SIEM.PNG](https://qiita-image-store.s3.amazonaws.com/0/48100/9a14a62a-36c5-7299-f203-b479f2cb3221.png)

異常なトラフィックを出しているプロトコルとかがあれば気づけそうですね。

少し試す分にはラズパイで十分かと思いますが、実際に本格運用する場合には、
きちんとしたサーバを用意することをオススメします！
オフィス等のトラフィックなんかを監視したら、SDカードなんかすぐにいっぱいになりますしね。


SIEMとはいわないかな・・・