Contents
環境
項目 | バージョン |
---|---|
OS | CentOS 7.6.1810 |
Logstash | 6.5.4-1 |
Elasticsearch | 6.5.4-1 |
Kibana | 6.5.4-1 |
設定
Logstash設定
Logstashの設定は以下のようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
input { file { path => "/opt/iptables.log" start_position => "beginning" } } filter { grok { match => [ "message", "%{SYSLOGTIMESTAMP:time}.*IN=%{DATA:IN} OUT=%{DATA:OUT} SRC=%{DATA:SRC} DST=%{DATA:DST} .* PROTO=%{DATA:PROTO} SPT=%{DATA:SPT} DPT=%{DATA:DPT} .*$", "message", "%{SYSLOGTIMESTAMP:time}.*IN=%{DATA:IN} OUT=%{DATA:OUT} MAC=%{DATA:MAC} SRC=%{DATA:SRC} DST=%{DATA:DST} .* PROTO=%{DATA:PROTO} TYPE=%{DATA:TYPE} CODE=%{DATA:CODE} .*" ] } date { match => [ "time", "MMM dd HH:mm:ss" ] timezone => "Asia/Tokyo" } geoip { source => "SRC" } } output { elasticsearch { hosts => ["192.168.0.117"] index => "iptables-log-%{+YYYY.MM.dd}" } } |
input
/opt/iptables.log
のログを頭から読み込みます。
filter
grok
iptablesログの正規表現を定義しています。
date
ログの時間を使用するためgrokの time
で指定したフィールドを @timestamp
に格納します。
geoip
geoipでマッピングするフィールドはgrokで定義した SRC
フィールドを指定しています。
output
Elasticsearchに格納します。
indexテンプレート
geoipを独自のindex名で使用する場合はindexテンプレートを作成してテンプレートを作成します。
そうしないと、可視化で必要なフィールド(geoip.location)が作成されません。
標準のindex名(logstash)を使う場合は、デフォルトで設定されているためテンプレートを作成しなくても大丈夫です。
以下の手順でindexテンプレートを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
curl -H "Content-Type: application/json" -XPUT http://localhost:9200/_template/iptables -d ' { "template" : "iptables-*", "mappings" : { "_default_": { "properties": { "@version": { "type": "keyword" }, "geoip": { "properties": { "ip": { "type": "ip" }, "longitude": { "type": "half_float" }, "location": { "type": "geo_point" }, "latitude": { "type": "half_float" } }, "dynamic": true }, "@timestamp": { "type": "date" } } } } }' |
このindexテンプレートは iptables-*
のindex名に対応します。
可視化
Visualize
をクリックして Create a visualization
をクリックします。
Coordinate Map
をクリックします。
index
を選択します。
Buckets
で Geohash
を選択します。
Field
に geoip.location
を選択します。
Apply changes
をクリックします。
可視化した結果が以下になります。
接続拒否した国がぱっと見わかるようになりました 🙂