前回の記事( ハニーポットcowrieのログを、mariaDBで管理しよう。 )でcowrieのログをmariaDBに出力するようにした。
今回は、そのデータをfluentd(td-agent2)を利用して、elasticsearchにデータを入れる手順をご紹介。

fluentdとは…ログを収集して様々な形式で格納できるソフトウェア
td-agent2とは…fluentdのラッパープログラム
elasticsearchとは…全文検索を提供するソフトウェア(サーチエンジン)

これらを入れることで次回ご紹介する解析に非常に有用になってくる。

Elasticsearchをインストール

Elasticsearchが動作するのに必要であるjavaをインストールする。

1
yum -y install java

GPG-KEYをインポートしたあと、yumのレポジトリの設定を行う。

1
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
1
2
3
4
5
6
7
8
$ cat<<_HERE_>/etc/yum.repos.d/elasticsearch.repo
[elasticsearch-1.6]
name=Elasticsearch repository for 1.6.x packages
baseurl=http://packages.elastic.co/elasticsearch/1.6/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
_HERE_

Elasticsearchをインストール

1
yum -y install elasticsearch

Elasticsearchを起動する。

1
systemctl start elasticsearch.service

自動起動の設定をする。

1
systemctl enable elasticsearch.service

Elasticsearchにアクセスしてみて、以下のようなJSON形式の結果が返って来ればOK

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ curl "http://localhost:9200"
{
"status" : 200,
"name" : "Speed",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.6.1",
"build_hash" : "e72f2849e1c52f2a7b87196b36e687f851a30a6a",
"build_timestamp" : "2015-07-16T14:06:55Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}

以上で、Elasticsearchの使用準備は出来た。
次にtd-agent2のインストール方法を紹介する。

td-agent2をインストールする

1
curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

起動

1
systemctl start td-agent

必要パッケージをインストールする。

1
yum -y install ruby ruby-devel mariadb-devel

fluent-plugin-mysql-replicator をインストール

1
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-mysql-replicator

td-agent2のconfの設定をする。

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
35
36
37
38
39
40
41
42
43
44
45
46
vim /etc/td-agent/td-agent.conf

<source>
type mysql_replicator

host localhost
username cowrie
password cowrie
database cowrie

# SELECTクエリの設定
query select b.id,DATE_FORMAT(starttime, '%Y-%m-%dT%k:%i:%s+09:00')as timestamp ,ip,username,password from sessions a, auth b where a.id = b.session;
primary_key id # 主キーを指定する (デフォルト: id)
interval 1m # クエリを実行する間隔 (デフォルト: 1m)

# 削除された主キーを検知する機能の有効化設定 (デフォルト: yes)
enable_delete yes

# 各イベントをどのようなタグで配送するか指定する
tag replicator.mysites.search_test.${event}.${primary_key}
# ${event} : 検知したイベント種別が insert/update/delete のいずれかが入る
# ${primary_key} : この設定の`primary_key`の値が入る
</source>

<match replicator.**>
type copy
<store>
type stdout
</store>
<store>
type mysql_replicator_elasticsearch

# Elasticsearchサーバの接続情報を指定
host localhost
port 9200

# Elasticsearchへレコードを登録する際の index(Database)、type(テーブル)、そしてunique id (primary_key)をどのようにタグから分解するか指定
tag_format (?<index_name>[^\.]+)\.(?<type_name>[^\.]+).(?<event>[^\.]+)\.(?<primary_key>[^\.]+)$

# どの程度バッファに溜めてElasticsearchサーバへ転送するかを指定
flush_interval 5s

# リトライ間隔の最大秒数 (fluentd >= 0.10.41)
max_retry_wait 1800
</store>
</match>

td-agentを再起動する。

1
systemctl restart td-agent.service

ログを確認するとinsertされる様子を見ることができる。

1
2
3
4
5
6
$ tail /var/log/td-agent/td-agent.log
2015-07-22 01:14:08 +0900 [info]: listening fluent socket on 0.0.0.0:24224
2015-07-22 01:14:08 +0900 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
2015-07-22 01:14:08 +0900 replicator.cowrie.search.insert.id: {"id":2,"timestamp":"2015-07-21T5:15:19+09:00","ip":"163.177.38.221","username":"a","password":"a"}
2015-07-22 01:14:08 +0900 replicator.cowrie.search.insert.id: {"id":3,"timestamp":"2015-07-21T5:16:22+09:00","ip":"163.177.38.221","username":"test","password":"test"}
2015-07-22 01:14:08 +0900 replicator.cowrie.search.insert.id: {"id":4,"timestamp":"2015-07-21T5:16:22+09:00","ip":"163.177.38.221","username":"test","password":"test123"}

Elasticsearchにcowrieのデータが入っているか確認するにはcurlを使って確認する。

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
35
36
37
38
39
40
41
42
43
44
45
$ curl "http://localhost:9200/cowrie/search/_search?size=5&pretty"
{
"took" : 400,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 944,
"max_score" : 1.0,
"hits" : [ {
"_index" : "cowrie",
"_type" : "search",
"_id" : "4",
"_score" : 1.0,
"_source":{"id":4,"timestamp":"2015-07-21T5:16:22+09:00","ip":"163.177.38.221","username":"test","password":"test123"}
}, {
"_index" : "cowrie",
"_type" : "search",
"_id" : "9",
"_score" : 1.0,
"_source":{"id":9,"timestamp":"2015-07-21T5:20:01+09:00","ip":"163.177.38.221","username":"student","password":"123456"}
}, {
"_index" : "cowrie",
"_type" : "search",
"_id" : "11",
"_score" : 1.0,
"_source":{"id":11,"timestamp":"2015-07-21T5:21:43+09:00","ip":"163.177.38.221","username":"postgres","password":"123456"}
}, {
"_index" : "cowrie",
"_type" : "search",
"_id" : "16",
"_score" : 1.0,
"_source":{"id":16,"timestamp":"2015-07-21T5:25:44+09:00","ip":"163.177.38.221","username":"user3","password":"user3"}
}, {
"_index" : "cowrie",
"_type" : "search",
"_id" : "23",
"_score" : 1.0,
"_source":{"id":23,"timestamp":"2015-07-21T11:40:34+09:00","ip":"123.56.106.178","username":"www-data","password":"www-data"}
} ]
}
}

参照URL