designetwork

ネットワークを軸としたIT技術メモ

ElastiFlowでNetFlow可視化する

f:id:daichi703n:20190316180848p:plain

以前、こちらの記事にまとめた通りオープンソース(OSS)のNetFlowコレクタを調査した。

designetwork.daichi703n.com

改めて調査したところ、ElastiFlowという、Elasticsearch + Logstash + Kibana (ELKスタック) ベースのNetFlowコレクタ、ビジュアライザを見つけたので使用してみる。

github.com

ソフトウェアは完全なオープンソース(OSS)ではないものの、作者のRobert Cowart Public Licenseのもとフリー・無償で使用できる。

要求スキル

本記事では、ネットワーク機器(Router, Switch)の基本知識に加え、以下の知識が必要となりますのでご了承ください。(アプライアンスではなく、LinuxでのOSS活用のため)

それぞれ詳細は割愛してるため、他サイト等を参照ください。最近はネットワークエンジニアと言っても、従来のCisco, Juniper等のCLI操作、F5 BIG-IP, 各種アプライアンスGUI操作だけではなく、IaaS・Linux・プログラミングスキルが問われる...

  • VMの基本操作
  • Linuxの基本操作
  • Dockerの基本操作
  • Elasticsearch, Logstash, Kibanaの基礎知識

NetFlowエクスポータ

NetFlowエクスポータとしては、VyOSでNetFlow v5を使用する。NetFlow v9で送信するとLogstashで処理されなかった...

VyOSのNetFlow設定については、こちらの記事を参考にさせていただきました。

qiita.com

ElastiFlowインストール

ElastiFlowはELKスタックに対して、プラグイン・テンプレートをインストールすることで構築できる。オフィシャルにシステム要件やインストールについての記載あり。

ElastiFlow Installation

Elasticsearch, Logstash, Kibanaはそれぞれオープンソースライセンス(X-PackのElasticライセンスでなく)で使用することができる。ELKスタックの構築手順は多くの記事が公開されているため割愛する。

なお、今回は手軽に試験利用できるようDockerでElastiFlowを構築する。

環境情報

ElastiFlow Dockerコンテナを稼働させるホストは以下の通り。

  • CentOS: 7.3.1611 (vSphere6.5 VM)
  • RAM: 8GB
  • CPU: 2vCPU (Intel(R) Xeon(R) CPU E31220 @ 3.10GHz)

Dockerはコミュニティエディションの最新版を使用する。※古いv1.13.xではBuild時にエラーとなる。(Dockerfile修正で対応は可能) Docker環境構築についても多くの記事があるため割愛。

$ docker version
Client:
 Version:           18.09.3
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        774a1f4
 Built:             Thu Feb 28 06:33:21 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.3
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       774a1f4
  Built:            Thu Feb 28 06:02:24 2019
  OS/Arch:          linux/amd64
  Experimental:     false

$ docker-compose version
docker-compose version 1.14.0, build c7bdf9e
docker-py version: 2.4.2
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013

ElastiFlowコンテナ起動

ElastiFlowのリポジトリをcloneし、build、起動する。

$ git clone https://github.com/robcowart/elastiflow
$ cd ./elastiflow
$ ./docker_build.sh
Sending build context to Docker daemon  821.8MB
Step 1/11 : FROM docker.elastic.co/logstash/logstash-oss:6.1.3
 ---> bfbbe5b25fe6
Step 2/11 : ARG BUILD_DATE
 ---> Using cache
 ---> 31982c13d210
Step 3/11 : LABEL org.opencontainers.image.created="$BUILD_DATE"       org.opencontainers.image.authors="rob@koiossian.com"       org.opencontainers.image.url="https://github.com/robcowart/elastiflow-docker/elastiflow-logstash"       org.opencontainers.image.documentation="https://github.com/robcowart/elastiflow-docker/elastiflow-logstash/README.md"       org.opencontainers.image.source="https://github.com/robcowart/elastiflow"       org.opencontainers.image.version="v3.4.1_6.1.3"       org.opencontainers.image.vendor="Robert Cowart"       org.opencontainers.image.title="ElastiFlow™ - Logstash"       org.opencontainers.image.description=""
 ---> Running in b035b0d67d0c
Removing intermediate container b035b0d67d0c
 ---> 8dbda1604495
Step 4/11 : ENV ELASTIFLOW_ES_HOST="http://127.0.0.1:9200"
 ---> Running in 51935ee56198
Removing intermediate container 51935ee56198
 ---> 11da570d161a
Step 5/11 : RUN $HOME/bin/logstash-plugin install logstash-codec-sflow     && $HOME/bin/logstash-plugin update logstash-codec-netflow     && $HOME/bin/logstash-plugin update logstash-input-udp     && $HOME/bin/logstash-plugin update logstash-input-tcp     && $HOME/bin/logstash-plugin update logstash-filter-dns     && $HOME/bin/logstash-plugin update logstash-filter-geoip     && $HOME/bin/logstash-plugin update logstash-filter-translate
 ---> Running in 1c080aa843d5
Validating logstash-codec-sflow
Installing logstash-codec-sflow
Installation successful
Updating logstash-codec-netflow
Updated logstash-codec-netflow 3.10.0 to 4.2.1
Updating logstash-input-udp
Updated logstash-input-udp 3.2.1 to 3.3.4
Updating logstash-input-tcp
Updated logstash-codec-json_lines 3.0.5 to 3.0.6
Updated logstash-codec-multiline 3.0.9 to 3.0.10
Updated logstash-input-tcp 5.0.3 to 6.0.2
Updating logstash-filter-dns
Updated logstash-filter-dns 3.0.7 to 3.0.12
Updating logstash-filter-geoip
Updated logstash-filter-geoip 5.0.3 to 6.0.0
Updating logstash-filter-translate
Updated logstash-filter-translate 3.0.4 to 3.2.3
Removing intermediate container 1c080aa843d5
 ---> a021db633283
Step 6/11 : WORKDIR /usr/share/logstash/config
 ---> Running in 38e6b342d99e
Removing intermediate container 38e6b342d99e
 ---> f17a3a0602b9
Step 7/11 : COPY --chown=logstash:logstash ./docker_assets/logstash.yml ./
 ---> fe94fcf606a9
Step 8/11 : COPY --chown=logstash:logstash ./docker_assets/pipelines.yml ./
 ---> 1b607617f663
Step 9/11 : WORKDIR /etc/logstash/elastiflow
 ---> Running in 46dae18bc5f7
Removing intermediate container 46dae18bc5f7
 ---> 148f2f7f7ba1
Step 10/11 : COPY --chown=logstash:root ./logstash/elastiflow/ ./
 ---> 47f4642be2f5
Step 11/11 : ENTRYPOINT ["/usr/local/bin/docker-entrypoint"]
 ---> Running in 5f221fd60c53
Removing intermediate container 5f221fd60c53
 ---> f3d7a9193483
Successfully built f3d7a9193483
Successfully tagged robcowart/elastiflow-logstash-oss:3.4.1_6.1.3

必要に応じてdocker-compose.ymlのパラメータを修正する。私の環境では、メモリー削減と、データボリュームコンテナ使用に変更した。

$ git diff
diff --git a/docker-compose.yml b/docker-compose.yml
index af66265..434ca39 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -28,12 +28,12 @@ services:
         hard: -1
     network_mode: host
     volumes:
-      - /var/lib/elastiflow_es:/usr/share/elasticsearch/data
+      - elastiflow-elasticsearch-oss-data:/usr/share/elasticsearch/data
     environment:
       # JVM Heap size
       #   - this should be at least 2GB for simple testing, receiving only a few flo
       #   - for production environments upto 31GB is recommended.
-      ES_JAVA_OPTS: '-Xms2g -Xmx2g'
+      ES_JAVA_OPTS: '-Xms1g -Xmx1g'

       cluster.name: elastiflow

@@ -70,7 +70,7 @@ services:
     network_mode: host
     environment:
       # JVM Heap size - this MUST be at least 3GB (4GB preferred)
-      LS_JAVA_OPTS: '-Xms3g -Xmx3g'
+      LS_JAVA_OPTS: '-Xms2g -Xmx2g'

       # ElastiFlow global configuration
       ELASTIFLOW_DEFAULT_APPID_SRCTYPE: "__UNKNOWN"
@@ -82,3 +82,8 @@ services:
       ELASTIFLOW_NETFLOW_IPV4_PORT: 2055
       ELASTIFLOW_SFLOW_IPV4_PORT: 6343
       ELASTIFLOW_IPFIX_TCP_IPV4_PORT: 4739
+
+volumes:
+  elastiflow-elasticsearch-oss-data:
+    driver: local

一式を起動する。Logstashは先ほどBuildしたイメージが使用される。Firewallを設定している場合は使用ポートを許可する。

$ sudo docker-compose up
Starting elastiflow-elasticsearch-oss ...
Starting elastiflow-elasticsearch-oss ... done
Starting elastiflow-kibana-oss ...
Recreating elastiflow-logstash-oss ...
Recreating elastiflow-logstash-oss
Recreating elastiflow-logstash-oss ... done
Attaching to elastiflow-elasticsearch-oss, elastiflow-kibana-oss, elastiflow-logstash-oss
elastiflow-elasticsearch-oss    | OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
elastiflow-elasticsearch-oss    | OpenJDK 64-Bit Server VM warning: UseAVX=2 is not supported on this CPU, setting it to UseAVX=1
elastiflow-elasticsearch-oss    | [2019-03-16T05:08:33,729][INFO ][o.e.e.NodeEnvironment    ] [B0ID7Xo] using [1] data paths, mounts [[/usr/share/elasticsearch/data (/dev/mapper/VG1-var)]], net usable_space [59.5gb], net total_space [83.9gb], types [xfs]
...

Logstashの以下のようなログが出力されるとElasticsearchにNetFlow用のindexが作成される。

elastiflow-logstash-oss         | [2019-03-16T05:30:32,652][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"order"=>0, "version"=>30401, "index_patterns"=>"elastiflow-3.4.1-*", "settings"=>{"index"=>{"number_of_shards"=>3, "number_of_replicas"=>1, "refresh_interval"=>"10s", "codec"=>"best_compression"}}, "mappings"=>{"_default_"=>{"numeric_detection"=>true, ...

ログ確認用にdocker-compose upとしたが、継続起動する場合はdocker-compose up -dとする。また、docker-compose.ymlrestart: alwaysとし、OS再起動後も自動起動にしておくとよい。

Kibanaデータインポート

Kibanaにアクセスし、Template, Index pattern, Visualize, Dashboardのデータをインポートする。

https://<Dockerホスト>:5601Webブラウザでアクセスし、 Management > Saved Objects > Import から elastiflow/kibana/elastiflow.kibana.6.6.x.json(最新バージョン) をインポートする。

f:id:daichi703n:20190316165718p:plain

f:id:daichi703n:20190316165731p:plain

NetFlowトラフィック確認

NetFlowレコードの生成・送信・受信が正常に動作していれば、Kibanaのダッシュボードから参照可能になる。

各種Dashboardが用意されており、簡単にNetFlowレコードを元にしたネットワークトラフィックの可視化・分析が可能となる。独自にVisualize、Dashboardを作成する場合にも参考になる部分が多い。Dashboardの詳細はオフィシャルで説明されている通り。

f:id:daichi703n:20190316173141p:plain

f:id:daichi703n:20190316173208p:plain

f:id:daichi703n:20190316173225p:plain

f:id:daichi703n:20190316173245p:plain

まとめ - ElastiFlow(Elasticsearch+Logstash+Kibana)でNetFlow可視化する

ElastiFlowをNetFlowコレクター、ビジュアライザとして使用し、ネットワークを可視化した。NetFlow可視化において、オープンソース(OSS)のElasticsearch + Logstash + Kibanaを使用する事例はいくつか紹介されているが、ElastiFlowではDashboardが充実しており、商用製品と同等の分析をすぐに開始することができる。