備忘録/にわかエンジニアが好きなように書く

個人的にとりあえず仕組みを知るためにとりあえず動くまで構築や動作をみただけの単なる操作ログです。個人用の備忘録となり、最新の導入手順は個別に確認してください。 ※変な内容や間違いを書いているなどありましたらコメントやご指摘いただけると幸いです。

ElastiFlowでNetFlow(Frotigate)を視覚化

概要 

NetFlow監視が可能な環境を構築していきます。

・Elasticスタック"Elasticsearch + Logstash + Kibana"環境下

・ElastiFlow

・FortigateにNetFlow設定を行いNetFlowエクスポーターとして動作させる。

 (NetFlow レコードは、LANとWANからの入力トラフィック(RX)をもとに生成する)

構成とフロー

f:id:pocket01:20200505122905p:plain

環境

  • 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)
    1. 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

f:id:pocket01:20200505142433p:plain

 

 [Management] > [Kibana] > [Saved Object] を選択し、右上の[Import]をクリックする。

f:id:pocket01:20200505143416p:plain

 [Please select a file to import]からダウンロードしたファイルを選択し、下部の[Import]をクリックする。

f:id:pocket01:20200505143627p:plain

 

 完了後、一度ログアウトして再ログインする。

ダッシュボードで確認

さまざまな種類のダッシュボードが用意されているため、NetFlowレコードに基づいてトラフィックを簡単に可視化し分析できます。

https://github.com/robcowart/elastiflow

フィルター条件で、Input/Outputのインターフェースや入力対象の装置など絞り込むことで色々な確認できます。

f:id:pocket01:20200505184424p:plain

 

f:id:pocket01:20200505184506p:plain

 

f:id:pocket01:20200505184912p:plain

 

f:id:pocket01:20200505184956p:plain

 

f:id:pocket01:20200505185031p:plain

 

f:id:pocket01:20200505185107p:plain

 

f:id:pocket01:20200505185538p:plain

 

f:id:pocket01:20200505185722p:plain