Help us understand the problem. What is going on with this article?

OSSでNetFlowを解析しよう!ElastiFlow

はじめに

ElastiFlowというOSSをあなたはご存知でしょうか。

NetFlowやsFlow等のフロー情報は通常有料の製品で解析されているかと思います。
製品ではNetFlowAnalyzerFlowMon等が有名ですね。
ちょっとフロー情報を解析したいだけなのにそんなにお金かけられないよ!って頭を抱えてる担当者向けにOSSでフロー情報を解析するElastiFlowを紹介します。
ElastiFlowはElasticsearch,Kibana,LogstashのいわゆるELKスタックで構成されています。
ElastiFlowのGUIは直感的でマニュアルなしでもなんとかなりますが、インストール方法がちょっと複雑でELKスタックを利用したことない人にとっては敷居が高いものとなっています。
このノートではそんなELKスタック初心者の方のためにインストール方法を紹介します。

OSの準備

ubuntu 18.04.3 64bit

サイジングの確認

flows/sec (v)CPUs Memory Disk (30-days) ES JVM Heap LS JVM Heap
250 4 24 GB 305 GB 8 GB 4 GB
1000 8 32 GB 1.22 TB 12 GB 4 GB
2500 12 64 GB 3.05 TB 24 GB 6 GB

Javaのインストール

※JDK8でなければ動作しないため、既存で他のバージョンのJDKがインストールされている場合は先にアンインストールしてください。

$ sudo apt install openjdk-8-jdk
$ java -version
$ dirname $(readlink $(readlink $(which java)))

dirnameを実行すると/usr/lib/jvm/java-8-openjdk-amd64/jre/binのように出力されると思います。
これがjavaのPATHであるため、以下の通り追記してPATHを通します。

$ sudo vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

追記が終わったら保存してエディタを抜けてPATHが通っている事を確認しましょう。

$ source /etc/profile
$ sudo echo $JAVA_HOME
$ sudo echo $PATH

Elasticsearchのインストール

$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo apt install apt-transport-https
$ echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
$ sudo apt update
$ sudo apt install elasticsearch

下記の通り追記します。

$ sudo vi /etc/elasticsearch/elasticsearch.yml
network.host: localhost
http.port: 9200
indices.query.bool.max_clause_count: 8192
search.max_buckets: 100000

サイジング情報を確認するとElasticsearchは250Flows/sで8GBのメモリを必要とするため、確保するように設定します。

$ sudo vi /etc/elasticsearch/jvm.options
-Xms8g
-Xmx8g

設定が終わったら起動します。

$ sudo systemctl start elasticsearch
$ systemctl status elasticsearch
$ sudo systemctl enable elasticsearch
$ curl "http://localhost:9200/"

curlの結果はjson形式で返ってきたら成功です。ちょっと時間かかります。(1分くらい

Kibanaのインストール

インストールと平行してGUIを日本語化します。

$ sudo apt install kibana
$ wget https://github.com/elastic/kibana/raw/master/x-pack/plugins/translations/translations/ja-JP.json
$ sudo install -m 644 -D ja-JP.json /usr/share/kibana/node_modules/x-pack/plugins/translations/translations/ja-JP.json

下記の通り追記します。

$ sudo vi /etc/kibana/kibana.yml
server.port: 5601
server.host: 0.0.0.0
elasticsearch.hosts: ["http://localhost:9200"]
i18n.locale: "ja-JP"

設定が終わったら起動します。

$ sudo systemctl start kibana
$ systemctl status kibana
$ sudo systemctl enable kibana

Logstashのインストール

$ sudo apt install logstash

サイジング情報を確認するとElasticsearchは250Flows/sで4GBのメモリを必要とするため、確保するように設定します。

$ sudo vi /etc/logstash/jvm.options
-Xms4g
-Xmx4g

設定が終わったら起動します。

$ sudo /usr/share/logstash/bin/system-install
$ sudo systemctl start logstash
$ systemctl status logstash
$ sudo systemctl enable logstash

ElastiFlowのインストール

$ sudo /usr/share/logstash/bin/logstash-plugin install logstash-codec-sflow
$ sudo /usr/share/logstash/bin/logstash-plugin update
$ git clone https://github.com/robcowart/elastiflow.git
$ sudo cp -r ./elastiflow/logstash/elastiflow/ /etc/logstash/
$ cd /etc/logstash/elastiflow/conf.d

NetFlow以外は使わないので.disabledをつけて無効化します。

$ sudo mv 10_input_ipfix_ipv4.logstash.conf 10_input_ipfix_ipv4.logstash.conf.disabled
$ sudo mv 10_input_sflow_ipv4.logstash.conf 10_input_sflow_ipv4.logstash.conf.disabled
$ sudo mv 20_filter_30_ipfix.logstash.conf 20_filter_30_ipfix.logstash.conf.disabled
$ sudo mv 20_filter_40_sflow.logstash.conf 20_filter_40_sflow.logstash.conf.disabled

環境に合わせて設定変更していきます。

$ sudo vi 30_output_10_single.logstash.conf
hosts => [ "${ELASTIFLOW_ES_HOST:localhost:9200}" ]

9995ポートで待ち受ける場合。

$ sudo vi 10_input_netflow_ipv4.logstash.conf
host => "${ELASTIFLOW_NETFLOW_IPV4_HOST:0.0.0.0}"
port => "${ELASTIFLOW_NETFLOW_IPV4_PORT:9995}"

systemd内にコピーします。

$ cd ~/
$ sudo cp -r ./elastiflow/sysctl.d/* /etc/sysctl.d/
$ sudo cp -r ./elastiflow/logstash.service.d/ /etc/systemd/system/

NAMESERVERはホストのIPアドレスを逆引きする時に参照するDNSサーバです。
ELASTIFLOW_RESOLVE_IP2HOSTはデフォルトではfalseとなっており、exporters(only flow exporter IPs are resolved),endpoints(only endpoint IPs, src/dst, are resolved),true(both are resolved),falseから選択します。

$ sudo vi /etc/systemd/system/logstash.service.d/elastiflow.conf
Environment="ELASTIFLOW_RESOLVE_IP2HOST=endpoints"
Environment="ELASTIFLOW_NAMESERVER=1.1.1.1"
Environment="ELASTIFLOW_ES_HOST=localhost:9200"
Environment="ELASTIFLOW_NETFLOW_IPV4_HOST=0.0.0.0"
Environment="ELASTIFLOW_NETFLOW_IPV4_PORT=9995"

フローを吐き出す機器のIPアドレスを設定しときます。

$ sudo vi /etc/logstash/elastiflow/dictionaries/app_id.srctype.yml
"192.0.2.1": "cisco_nbar2"
"192.0.2.2": "fortinet"

サンプリングを行っている場合はその割合を設定します。

$ sudo vi /etc/logstash/elastiflow/dictionaries/sampling_interval.yml
"192.0.2.1": 1024
"192.0.2.2": 512

インタフェースのMIB IDがわかる場合は設定しておくと、その名前で記録されます。

$ sudo vi /etc/logstash/elastiflow/dictionaries/ifName.yml
"192.0.2.1::ifName.0": "eth0"

logstashにelastiflowの設定を読み込ませます。

$ sudo vi /etc/logstash/pipelines.yml
- pipeline.id: elastiflow
  path.config: "/etc/logstash/elastiflow/conf.d/*.conf"

設定が終わったら起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart logstash
$ tail -f /var/log/logstash/logstash-plain.log

ログを確認してエラーが発生してなければ大丈夫でしょう。

Kibanaにテンプレートを読み込ませる

http://host:5601 にWebブラウザでアクセスし、
Management > Saved Objects > Import から
elastiflow/kibana/elastiflow.kibana.7.4.x.ndjson(インストールしたELKスタックのバージョンに合わせる) をインポートする。
import.png

以上、フローデータが貯れば解析可能となります。お疲れさまでした。

プラグインのアップデート

Elasticsearchをアップデートした場合、プラグイン関連もアップデートする必要があります。
shell scriptで準備しておけば楽ちんです。

$ vi plugin-update.sh

#!/bin/bash
wget https://github.com/elastic/kibana/raw/master/x-pack/plugins/translations/translations/ja-JP.json
sudo install -m 644 -D ja-JP.json /usr/share/kibana/node_modules/x-pack/plugins/translations/translations/ja-JP.json
rm -rf ja-JP.json
sudo /usr/share/logstash/bin/logstash-plugin install logstash-codec-sflow
sudo /usr/share/logstash/bin/logstash-plugin update
sudo systemctl daemon-reload
sudo systemctl restart logstash
sudo systemctl restart kibana

$ chmod +x plugin-update.sh

DBのアップデート

ASNやGeoIPはMaxMind社のGeoLite2 Free Downloadable Databasesを利用しています。
こちらもアップデート用scriptを用意しておきましょう。
DBは毎週火曜日(米国時間)に更新されています。
※ダウンロードに認証が必要になりました。MaxMindのサイトでアカウント作成した後にWEBサイト上でライセンスキーを生成してlicense_key=xxxxxxxを変更して下さい。

$ vi db-update.sh

#!/bin/bash

# ASN
wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-ASN&license_key=xxxxxxx&suffix=tar.gz" -O GeoLite2-ASN.tar.gz
tar -zxvf GeoLite2-ASN.tar.gz
cd GeoLite2-ASN_*
sudo mv -f GeoLite2-ASN.mmdb /etc/logstash/elastiflow/geoipdbs/
cd ~
rm -rf GeoLite2-ASN*

# GeoIP
wget "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=xxxxxxx&suffix=tar.gz" -O GeoLite2-City.tar.gz
tar -zxvf GeoLite2-City.tar.gz
cd GeoLite2-City_*
sudo mv -f GeoLite2-City.mmdb /etc/logstash/elastiflow/geoipdbs/
cd ~
rm -rf GeoLite2-City*

# restart
sudo systemctl daemon-reload
sudo systemctl restart logstash

$ chmod +x db-update.sh

ライフサイクルの設定

フロー情報を集め続けるとディスク容量がなくなってしまうため、一定期間ごとに削除するライフサイクルを設定します。
codecmappingの間にlifecycleを追加します。

$ sudo vi /etc/logstash/elastiflow/templates/elastiflow.template.json
      "codec": "best_compression",
      "lifecycle": {
        "name": "elastiflow"
      },
      "mapping": {

Kibanaにアクセスし、管理>Elasticsearch>インデックスライフサイクルポリシーにてポリシーを作成を選択。
ポリシー名をelastiflowに設定、ロールオーバーを有効にするチェックを外し、削除フェーズを有効にするチェックを入れます。
削除フェーズのタイミングをインデックスの作成からの経過日数として任意の日数を設定しましょう。

エラー対応

logstash7.4.0以降でnetflowのテンプレート受信時にエラーが発生しています。
7.3.2だとエラーは発生していないようなので、7.3.2で固定します。
※2020/02/14 7.6.0にてエラーが修正されているのを確認しました。

wget https://artifacts.elastic.co/downloads/logstash/logstash-7.3.2.deb
sudo dpkg -i logstash-7.3.2.deb
sudo apt-mark hold logstash
#7.4.0以降でエラー修正が行われたら、下記コマンドでバージョン固定を解除します。
#sudo apt-mark unhold logstash

確認はこちら

$ dpkg --get-selections | grep hold
logstash                                        hold
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした