以前、こちらの記事にまとめた通りオープンソース(OSS)のNetFlowコレクタを調査した。
改めて調査したところ、ElastiFlowという、Elasticsearch + Logstash + Kibana (ELKスタック) ベースのNetFlowコレクタ、ビジュアライザを見つけたので使用してみる。
ソフトウェアは完全なオープンソース(OSS)ではないものの、作者のRobert Cowart Public Licenseのもとフリー・無償で使用できる。
- 要求スキル
- NetFlowエクスポータ
- ElastiFlowインストール
- NetFlowトラフィック確認
- まとめ - ElastiFlow(Elasticsearch+Logstash+Kibana)でNetFlow可視化する
要求スキル
本記事では、ネットワーク機器(Router, Switch)の基本知識に加え、以下の知識が必要となりますのでご了承ください。(アプライアンスではなく、LinuxでのOSS活用のため)
それぞれ詳細は割愛してるため、他サイト等を参照ください。最近はネットワークエンジニアと言っても、従来のCisco, Juniper等のCLI操作、F5 BIG-IP, 各種アプライアンスのGUI操作だけではなく、IaaS・Linux・プログラミングスキルが問われる...
NetFlowエクスポータ
NetFlowエクスポータとしては、VyOSでNetFlow v5を使用する。NetFlow v9で送信するとLogstashで処理されなかった...
VyOSのNetFlow設定については、こちらの記事を参考にさせていただきました。
ElastiFlowインストール
ElastiFlowはELKスタックに対して、プラグイン・テンプレートをインストールすることで構築できる。オフィシャルにシステム要件やインストールについての記載あり。
Elasticsearch, Logstash, Kibanaはそれぞれオープンソースライセンス(X-PackのElasticライセンスでなく)で使用することができる。ELKスタックの構築手順は多くの記事が公開されているため割愛する。
なお、今回は手軽に試験利用できるようDockerでElastiFlowを構築する。
環境情報
ElastiFlow Dockerコンテナを稼働させるホストは以下の通り。
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.yml
でrestart: always
とし、OS再起動後も自動起動にしておくとよい。
Kibanaデータインポート
Kibanaにアクセスし、Template, Index pattern, Visualize, Dashboardのデータをインポートする。
https://<Dockerホスト>:5601
にWebブラウザでアクセスし、 Management > Saved Objects > Import
から elastiflow/kibana/elastiflow.kibana.6.6.x.json
(最新バージョン) をインポートする。
NetFlowトラフィック確認
NetFlowレコードの生成・送信・受信が正常に動作していれば、Kibanaのダッシュボードから参照可能になる。
各種Dashboardが用意されており、簡単にNetFlowレコードを元にしたネットワークトラフィックの可視化・分析が可能となる。独自にVisualize、Dashboardを作成する場合にも参考になる部分が多い。Dashboardの詳細はオフィシャルで説明されている通り。
まとめ - ElastiFlow(Elasticsearch+Logstash+Kibana)でNetFlow可視化する
ElastiFlowをNetFlowコレクター、ビジュアライザとして使用し、ネットワークを可視化した。NetFlow可視化において、オープンソース(OSS)のElasticsearch + Logstash + Kibanaを使用する事例はいくつか紹介されているが、ElastiFlowではDashboardが充実しており、商用製品と同等の分析をすぐに開始することができる。