概要
NetFlow監視が可能な環境を構築していきます。
・Elasticスタック"Elasticsearch + Logstash + Kibana"環境下
・ElastiFlow
・FortigateにNetFlow設定を行いNetFlowエクスポーターとして動作させる。
(NetFlow レコードは、LANとWANからの入力トラフィック(RX)をもとに生成する)
構成とフロー
環境
- CentOS 7.8 (memory : 32G , SSD:300G , IP : 172.16.200.100)
- Logstash 7.6.2
- Elasticsearch 7.6.2
- Kibana 7.6.2
- Elastiflow 3.5.2
- FortiGate-60D (Version : 6.0.9)
- NetFlow[Port : 2055 , SrcIP : 172.16.0.1]) , Interface[Internal1[rx],Internal2[rx] ,wan2[rx])
※Elastiflowのダッシュボード用ファイルが 7.5.x用なので、Elasticsearchとかはバージョンは 7.5.xを使ったほうが良いかも。
前提
- Elasticsearch/Logstash/Kibanaの初期インストールが完了していること。
- elasticsearch.yml の設定修正(search.max_buckets = 1000000)
- Kibanaのダッシュボードへログインが可能であること。
- FortigateにNetflow設定が完了している
(参考)
https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html
https://www.elastic.co/guide/en/kibana/current/install.html
参考情報
公式サイト
https://github.com/robcowart/elastiflow
インストール手順/マシンスペックのサイジング/互換性情報
https://github.com/robcowart/elastiflow/blob/master/INSTALL.md
手順
手順は、ElastiFlow GitHub上にあるインストール手順に基づいて実施しています。
ElastiFlow取得(インストールファイルをダウンロード)
# git clone https://github.com/robcowart/elastiflow.git
※git が使えない場合はwget、圧縮ファイル等でのダウンロードを行う。
ElasticsearchとLogstashチューニング
Elasticsearch
# vi /etc/elasticsearch/elasticsearch.yml
//--- 追記 ---//
indices.query.bool.max_clause_count: 8192
search.max_buckets: 100000
//-----------//
※以下のような記載があるため max_buckets: 100000 としている
At high ingest rates (>10K flows/s), or for data redundancy and high availability, a multi-node cluster is recommended.
Logstash
# vi /etc/logstash/jvm.options
//--- 修正 ---//
-Xms4g
-Xmx4g
//-----------//
Logstashプラグイン追加
プラグイン追加/更新
# /usr/share/logstash/bin/logstash-plugin install logstash-codec-sflow
# /usr/share/logstash/bin/logstash-plugin update logstash-codec-netflow
# /usr/share/logstash/bin/logstash-plugin update logstash-input-udp
# /usr/share/logstash/bin/logstash-plugin update logstash-input-tcp
# /usr/share/logstash/bin/logstash-plugin update logstash-filter-dns
# /usr/share/logstash/bin/logstash-plugin update logstash-filter-geoip
# /usr/share/logstash/bin/logstash-plugin update logstash-filter-translate
※必要に応じて選択する。
ElastiFlow設定ファイルをLogstashディレクトリにコピー
# cp -r ./elastiflow/logstash/elastiflow/ /etc/logstash/
# ls /etc/logstash/elastiflow/
conf.d definitions dictionaries geoipdbs templates
環境変数ファイルをコピー
# cp -r ./elastiflow/logstash.service.d/. /etc/systemd/system/logstash.service.d/
# ls /etc/systemd/system/logstash.service.d/
elastiflow.conf
pipelines.ymlに追加
# vi /etc/logstash/pipelines.yml
//--- 追記 ---// ※以下の2行をpipelines.ymlの下部に追記します
- pipeline.id: main
path.config: "/etc/logstash/conf.d/*.conf"
//------------//
Logstash構成ファイル名の編集
IPv6は無効のため使う場合は、ファイル名を変更すること(disabledを削除する)
# cd /etc/logstash/elastiflow/conf.d
//-----ファイル一覧-------// ※ファイル名の末尾にdisabledがあるものは無効
10_input_ipfix_ipv4.logstash.conf
10_input_sflow_ipv6.logstash.conf.disabled
10_input_netflow_ipv6.logstash.conf.disabled
10_input_sflow_ipv4.logstash.conf
10_input_ipfix_ipv6.logstash.conf.disabled
10_input_netflow_ipv4.logstash.conf
20_filter_90_post_process.logstash.conf
20_filter_10_begin.logstash.conf
20_filter_30_ipfix.logstash.conf
20_filter_40_sflow.logstash.conf
20_filter_20_netflow.logstash.conf
30_output_10_single.logstash.conf
30_output_20_multi.logstash.conf.disabled
//------------//
ipfixは使わないため無効とする
# mv 10_input_ipfix_ipv4.logstash.conf 10_input_ipfix_ipv4.logstash.conf.disabled
# mv 20_filter_30_ipfix.logstash.conf 20_filter_30_ipfix.logstash.conf.disabled
NetFlow関連設定
機器のIPアドレスを設定
# vi /etc/logstash/elastiflow/dictionaries/ifName.yml
//--- 追記 ---//
"172.16.0.1": "fortinet"
//------------//
機器のInterface名を設定
# vi /etc/logstash/elastiflow/dictionaries/ifName.yml
//--- 追記 ---//
"172.16.0.1::ifName.1": "dmz"
"172.16.0.1::ifName.2": "wan1"
"172.16.0.1::ifName.3": "wan2"
"172.16.0.1::ifName.4": "modem"
"172.16.0.1::ifName.5": "ssl.root"
"172.16.0.1::ifName.6": "internal"
"172.16.0.1::ifName.7": "internal1"
"172.16.0.1::ifName.8": "internal2"
"172.16.0.1::ifName.9": "internal3"
"172.16.0.1::ifName.10": "internal4"
"172.16.0.1::ifName.11": "internal5"
"172.16.0.1::ifName.12": "internal6"
//------------//
※interface番号は、実装置からコマンドにより取得する。
以下は internal = ifName.7となる(と思う)
fortigate001 # show system interface internal1
config system interface
edit "internal1"
set vdom "root"
set ip 192.168.255.1 255.255.255.0
set allowaccess ping https ssh snmp
set type physical
set netflow-sampler rx
set scan-botnet-connections monitor
set alias "wifi_Seg"
set snmp-index 7
next
end
Logstash再起動
# systemctl daemon-reload
# systemctl restart logstash
# tail -f /var/log/logstash/logstash-plain.log
※起動するまで6-8分程度かかるので、起動完了はログを確認する。
ダッシュボードのテンプレートを読み込ませる
以下から "elastiflow.kibana.7.5.x.ndjson"をダウンロードする
https://github.com/robcowart/elastiflow/tree/master/kibana
[Management] > [Kibana] > [Saved Object] を選択し、右上の[Import]をクリックする。
[Please select a file to import]からダウンロードしたファイルを選択し、下部の[Import]をクリックする。
完了後、一度ログアウトして再ログインする。
ダッシュボードで確認
さまざまな種類のダッシュボードが用意されているため、NetFlowレコードに基づいてトラフィックを簡単に可視化し分析できます。
https://github.com/robcowart/elastiflow
フィルター条件で、Input/Outputのインターフェースや入力対象の装置など絞り込むことで色々な確認できます。