fluentdとKibanaでSSHアクセス元マップ

  • 78
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

大学外にポートが空いている研究室のサーバに対して,不正なSSHのアクセスが結構来ています.
今回は以下のステップで,不正アクセス元の国をKibana mapで可視化してみました.

  1. fluentdでSSHのログから不正アクセスのIPアドレスを解析
  2. GeoIPを使ってIPアドレスから国を特定
  3. Elasticsearchにログを収集
  4. Kibanaのmap panelを使って可視化

GeoIPとは

サイトアクセス者の位置情報を取得するGeoIP | SourceForge.JP Magazineより引用.

GeoIPとは、IPアドレスを国、都市、インターネットサービスプロバイダ(ISP)にマッピングしたデータベース群である。
そうしたデータとともにC、PHP、Javaその他いくつかの言語を使ってデータベースにアクセスするためのLGPLライセンスのAPIも用意されている。

fluentdでSSHログ解析

fluentd(td-agent)については前回書いたので割愛します.

SSHのログは,以下のような形式になっていると思います.
ここでは,Invalid user(存在しないユーザ)のログを抽出します.

/var/log/auth.log
Feb  8 07:47:28 air sshd[29484]: Invalid user admin from 58.206.126.29

fluentdの設定は以下の通り.
formatでは,時刻とユーザ名,IPアドレスを取っています.

/etc/td-agent/td-agent.conf
<source>
  type tail
  format /^(?<time>[^0-9]+ [^ ]+ [^ ]+) .+ sshd\[.+\]: Invalid user (?<user>[^ ]+) from (?<ip_address>[^$]+)$/
  time_format %b %d %H:%M:%S
  path /var/log/auth.log
  pos_file /tmp/auth.log.pos
  tag geo.ssh.access
</source>

fluent-geoip-pluginの導入

fluentd用にgeoipプラグインを作られている方が居ました.

今回は,ログのIPアドレスからcountry_code(JP,USなど)を取得します.
fluentdの設定に以下の内容を追記します.

/etc/td-agent/td-agent.conf
<match geo.ssh.*>
  type geoip
  geoip_lookup_key ip_address
  <record>
    country ${country_code['ip_address']}
  </record>
  remove_tag_prefix geo.
  add_tag_prefix host.
</match>

Elasticsearchに投入

fluent-plugin-elasticsearchについては前回書いたので割愛します.
今回使用した設定は下記の通りです.

/etc/td-agent/td-agent.conf
<match host.ssh.*>
  type elasticsearch
  host 133.92.147.250
  port 9200
  type_name ssh-invalid
  include_tag_key true
  tag_key @log_name
  logstash_format true
  logstash_prefix ssh-invalid
  flush_interval 10s
</match>

インデックスのMappingは自動で問題無いと思いますが,手動で行いました.

mapping.sh
curl -XPUT http://127.0.0.1:9200/_template/ssh-invalid -d '{
  "template": "ssh-invalid-*",
  "mappings": {
    "_default_": {
      "numeric_detection" : true,
      "properties": {
        "@timestamp": { "type":"date", "format":"dateOptionalTime" },
        "@log_name": {type: "string"},
        "user": {type: "string"},
        "ip_address": {type: "string"},
        "country": {type: "string"}
      }
    }
  }
}'

Kibanaのmapで可視化

Kibanaには,世界地図などにマッピングできるmap panelがあります.

今回は世界地図を使って,countryの値でマッピングします.
作ったDashboardはGitHubで公開しています.

実際の画面はこんな感じになりました.
某国だけでなく,アジアや南米からも多くアクセスがあることが分かりますね.

ユーザ名のランキングも作ってみたら,adminがダントツでした.
(rootは存在するユーザなので,ここでは含まれない.)

kibana_map.png