らくがきちょう

なんとなく

Docker Compose で Elastic Stack を起動し、NetFlow データを可視化する

ネットワーク機器の 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"
        }
    }
}

参考