SOCセンターのモニタリング環境を真似して作ってみる

今回はグロービスのIS(情報システム)からお送りする[グロービス Advent Calendar 2017](https://qiita.com/advent-calendar/2017/globis) 22日目の記事です。

# はじめに
グロービスのISも一般的な情シス同様に社内のインフラ・セキュリティ・ヘルプデスク周りの業務を行なっています、
時にはsyslogを謎解きしながらトラシューしますが、辛い…><
syslog取れているものの、もっと活用しなきゃと思いながらシマンテック社の新SOCセンターの記事を見て、
「このモニタリング環境作ったらいいな！」とテンションアゲアゲ！

![symantec_soc03.jpg](https://qiita-image-store.s3.amazonaws.com/0/199912/dd9c32e5-ef2c-db71-de6c-2c8d6952bdc4.jpeg)
*画像出典元：[サイバー空間を縦横無尽に監視--シマンテックの新SOC](https://japan.zdnet.com/article/35104841/)

というわけで趣味と実益を兼ねた第一歩としてログ可視化をしてみました。

# とりあえずのゴール

- Firewallからsyslogを収集
- ログを解析してDenyした通信の送信元を抽出
- 送信元の地理情報を取得して送信元を可視化（地図上にプロット）

# 構成
至ってシンプル、とりあえずsyslog設定&Logstash - Elasticsearch - Kibana 一通りインストールします。
![kibana000.jpg](https://qiita-image-store.s3.amazonaws.com/0/199912/afd4ca19-9675-2448-7543-9332d511905e.jpeg)

# logstashでの下ごしらえ（/etc/logstash/conf.d/XXX.conf)
最終的にアクセス元を地図にプロットしたいので、
↓な感じで送信元IPアドレスからgeoipモジュールを使って地理情報を解析します。

```sh
filter {
  grok {
    match => { "message" => '%{SYSLOGTIMESTAMP:ts}.+?srcip=%{IPV4:srcip}.+?srcintf="%{WORD:srcintf}".+?action=%{WORD:act}' }
# 適当に送信元情報とactionを抽出
  }

  if [srcintf] != "wan1" {
    drop {}
  }
  if [act] != "deny" {
    drop {}
  }
# 今回は外から通信をDenyしたログだけ使用

  date {
    match => [ "ts", "MMM dd HH:mm:ss" ]
  }

  geoip {
    source => [ "srcip" ]
  }
  if "_geoip_lookup_failure" in [tags] {
    drop {}
  }
# 送信元IPアドレスから地理情報を取得
}
```

# elasticsearchのtemplate設定 (jsonファイル)
elasticsearchでの取り込みデータ型や属性を再定義します。

```sh
{
  "template" : "fortideny-*",
  "mappings" : {
    "forti" : {
      "properties" : {
        "srcip" : { "type" : "text" },
        "srcintf" : { "type" : "text" },
        "geoip" : {
          "properties" : {
            "city_name" : {
                "analyzer" : "keyword", # 都市名がスペースで分割されないように変更
                "type" : "text",
                "fielddata" : true }, # 都市名を使ったグラフを作れるように設定
            "continent_code" : { "type" : "text" },
            "country_code2" : { "type" : "text" },
            "country_code3" : { "type" : "text" },
            "country_name" : {
                "analyzer" : "keyword", # 国名がスペースで分割されないように変更
                "type" : "text",
                "fielddata" : true }, # 国名を使って地図プロットやグラフを作れるように設定 
            "ip" : { "type" : "text" },
            "latitude" : { "type" : "float" },
            "location" : { "type" : "geo_point" }, # 型をgeo_pointに変更して地図プロット可能に
            "longitude" : { "type" : "float" },
            "postal_code" : { "type" : "text" },
            "region_code" : { "type" : "text" },
            "region_name" : { "type" : "text" },
            "timezone" : { "type" : "text" }
          }
        },
        "ts" : { "type" : "text" }
      }
    }
  }
}
,
```

# kibanaでVisualize設定
logstashからelasticsearchにデータをexportし、kibanaで可視化します

| 地図プロット| グラフ |
|:---------|:---------|
| <img width="546" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/199912/f484c0b7-3530-6ca8-85ce-e934303449a4.png">| <img width="610" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/199912/89497481-21f5-4924-88de-cd1055b64100.png"> |


あとはDashboardに貼り付けてあげれば完成です(データはダミー)
<img width="1725" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/199912/d6dbee21-b6f2-a316-91b3-6a675a112d7f.png">

#最後に
[グロービス Advent Calendar 2017](https://qiita.com/advent-calendar/2017/globis) の他の記事もぜひどーぞ！