以前紹介した記事でAIDEで改竄検知した情報をFluentdでまとめることができましたが、
グラフ化やアラート通知(閾値超え)を素早く行うため、CloudWatchでデータを管理したいと考えました。
そこで以下のツールを利用して実現してみます。
suz-lab.github : fluent-plugin-clooudwatch_ya
インストール等は、以前紹介した「FluentdのCloudWatchプラグイン(fluent-plugin-cloudwatch_ya)を
RubyGems.orgに公開してみた」を参照下さい。
冒頭で紹介した記事ではAIDEでの改竄検知情報を下記の形式ログへと調整しました。
2013-02-09T22:41:46+09:00 parsed.syslog {"total":"384","added":"2","removed":"2","changed":"3"}
2013-02-09T22:42:41+09:00 parsed.syslog {"total":"384","added":"2","removed":"2","changed":"3"}
CloudWatchに情報を登録するのは大変なので、added、removed、changedの和(ベースラインからの
「違い」の総数)にして簡略化しておきます。
つまり、上記のログを下記のように調整します。
2013-02-10T02:40:01+09:00 mapped.syslog {"sum":7}
2013-02-10T02:50:01+09:00 mapped.syslog {"sum":5}
2013-02-10T02:51:01+09:00 mapped.syslog {"sum":9}
そして、この変換を実現するため、以下pluginを利用します。
tomity / fluent-plugin-map : fluent-plugin-map
インストールは、以下のように実施します。
# /usr/lib64/fluent/ruby/bin/gem install fluent-plugin-map
...
そして次のような設定で、上記の変換が実現できます。
type map
tag "mapped.syslog"
time time
record {"sum" => record["added"].to_i + record["removed"].to_i + record["changed"].to_i}
設定ファイル全体は下記のようにしています。
type copy
type file
path /tmp/tail.syslog
type parser
key_name message
format /011(?[^ ]*).012.+011(? [^ ]*).012.+011(? [^ ]*).012.+011(? [^ ]*).012/
tag parsed.syslog
type copy
type file
path /tmp/parsed.syslog
type map
tag "mapped.syslog"
time time
record {"sum" => record["added"].to_i + record["removed"].to_i + record["changed"].to_i}
type copy
type file
path /tmp/mapped.syslog
type cloudwatch_ya
buffer_type file
buffer_path /opt/suz-lab/var/lib/td-agent/buf/cloudwatch.syslog
flush_interval 1m
cloud_watch_endpoint monitoring.ap-northeast-1.amazonaws.com
namespace SUZ-LAB/AIDE
metric_name All
value_key $['sum']
unit None
outcast_no_dimension_metric yes
instance_id yes
上記の設定でfluentd(td-agent)を起動し、aide –updateを毎分動かすと、次のようにCloudWatchに
1分毎にデータが登録され、グラフとしても確認できることがわかります。
さらに、CloudWatchの機能としてアラームを設定することができるため、(ベースラインとの違いの数の)閾値を
超えた場合、SNSでメール通知することも可能です。
※ここではテストのため閾値を6にしていますが、本来ならば1以上にすることを推奨します。