ネットワーク機器の NetFlow 情報を Elastic Stack で簡単に可視化出来るよう、Docker Compose 用のファイルを用意しました。 とは言っても、deviantony/docker-elk の設定ファイルを少し修正しただけです。 具体的な利用方法は以下の通りです。
ネットワーク機器での設定例 (Cisco ASA)
Cisco ASA で NetFlow 情報を生成し、10.0.0.100
の 2055/UDP 宛に送信するには最低限、以下のように設定します。
flow-export destination inside 10.0.0.100 2055 ! policy-map global_policy class class-default flow-export event-type all destination 10.0.0.100
Docker Compose で Elastic Stack を起動する
GitHub から clone し、docker-compose up -d
してバックグランドで実行します。
git clone https://github.com/sig9org/docker-elk-netflow cd docker-elk-netflow/versions/5.5.2/ docker-compose up -d
但し(理由を追求出来ていないのですが)これだけだとホストでは NetFlow (2055/UDP) を受信しているにも関わらず、logstash にパケットが届いておらず、結果的に kibana で見えない… という事象に何度か遭遇しました。 こういった場合は何度か再起動すると上手くいくようになりました…
docker-compose restart
kibana にアクセスする
しばらくして elasticsearch / logstash / kibana の全てが起動完了したら、http://[ADDRESS]:5601
で kibana にアクセス出来るはずです。
deviantony/docker-elk との差分
ベースにさせて頂いた deviantony/docker-elk との差分は下記 2 ファイルだけ、です。
docker-elk-netflow/versions/5.5.2/docker-compose.yml
logstash で NetFlow (2055/UDP) を受信出来るよう、以下の設定を追加しています。
ports: - "2055:2055/udp"
docker-compose.yml
全体は以下の通りです。
version: '2' services: elasticsearch: build: elasticsearch/ volumes: - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml ports: - "9200:9200" - "9300:9300" environment: ES_JAVA_OPTS: "-Xmx256m -Xms256m" networks: - elk logstash: build: logstash/ volumes: - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml - ./logstash/pipeline:/usr/share/logstash/pipeline ports: - "5000:5000" - "2055:2055/udp" environment: LS_JAVA_OPTS: "-Xmx256m -Xms256m" networks: - elk depends_on: - elasticsearch kibana: build: kibana/ volumes: - ./kibana/config/:/usr/share/kibana/config ports: - "5601:5601" networks: - elk depends_on: - elasticsearch networks: elk: driver: bridge
docker-elk-netflow/versions/5.5.2/logstash/pipeline/logstash.conf
logstash の pipeline 用の logstash.conf は以下の通りです。 IndexPattern は「logstash_nf-*」としてあります。
input { udp { port => 2055 codec => netflow { versions => [5, 9] } type => netflow } } output { if [type] == "netflow" { elasticsearch { index => "logstash_nf-%{+YYYY.MM.dd}" hosts => "elasticsearch:9200" } } else { elasticsearch { hosts => "elasticsearch:9200" } } }