fluentdのプラグインを書く練習をする為にsecureログをparseしてZabbixで値が取得できるようにしてみた(設定編)
https://github.com/kenjiskywalker/fluent-plugin-securelog-parser
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;; {;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; 全く触ったことがなくてもpluginを書いたらfluentdがわかる ヾ;;;ハ ノ .::!lリ;;r゙ `Z;i 〈.,_..,. ノ;;;;;;;;> そんなふうに考えていた時期が ,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f. 俺にもありました ~''戈ヽ `二´ r'´:::. `!
最初Postfixのmaillogつくってやろうかなんて
思っていたりした時期もオレにはありました。
しかしログが多様すぎるので、ちょっとこれ最初にやるには敷居高いなー
と思い、だからってあんまり理にかなわないことをしても意味ないな
ということで、/var/log/secure
のログを指定した文字列の出現具合を
Zabbixで取得したら面白いかなというアイデアが思いついたので
取り敢えずコードは汚いにしろ、動くまで書いてみたメモです。
テスト環境
/etc/fluent-agent-lite.conf
/etc/fluent-agent-lite.conf TAG_PREFIX="" LOGS=$(cat <<"EOF" secure /var/log/secure EOF ) PRIMARY_SERVER="0.0.0.0:24224"
/etc/td-agent/td-agent.conf
<source> type forward port 24224 </source> <match secure> type securelog-parser tag seclog.local </match> <match seclog.*> type copy <store> type datacounter count_key message aggregate all tag check.seclog pattern1 acce Accepted pattern2 fail failure pattern3 inva Invalid </store> <store> type file path /tmp/hoge </store> </match> <match check.**> type copy <store> type file path /var/log/td-agent/check_seclog </store> <store> type zabbix zabbix_server 192.0.2.2 host watashi name_key_pattern (fail|acce|inva)_count add_key_prefix securelog </store> </match>
環境および設定内容の解説
fluent-agent-lite
in_tail
で見に行くとパーミッションが足りないとのことなので
fluent-agent-liteを噛ましました。
localhostに転送するので
PRIMARY_SERVER="0.0.0.0:24224"
として自分自身へ転送。
td-agent
fluent-agent-lite
から値を取得。
<source> type forward port 24224 </source>
自作pluginを通す
fluent-agent-lite
で付与したsecure
のタグをmatchさせて
自作したテスト用のpluginへ渡します。
<match secure> type securelog-parser tag seclog.local </match>
fluent-plugin-datacounterを通す
seclog.*
にmatchさせ
もりす先生のfluent-plugin-datacounterを利用し
それぞれ確認したいログのpatternを登録します。
<match seclog.*> type copy <store> type datacounter count_key message aggregate all tag check.seclog pattern1 acce Accepted pattern2 fail failure pattern3 inva Invalid </store> <store> type file path /tmp/hoge </store> </match>
pattern1 acce Accepted
接続が許可されたログ(Acceptedという文字列を含んだログ)を
pattern1としてacceというprefixで渡します。pattern2 fail failure
接続に失敗したログ(failureという文字列を含んだログ)を
pattern2としてfailというprefixで渡します。pattern3 inva Invalid
無効な接続のログ(Invalidという文字列を含んだログ)を
pattern3としてinvaというprefixで渡します。
また、デバッグの為に、/tmp/hoge
ファイルへ
現時点での状態をファイル出力しておきます。
2013-01-20T18:12:24+09:00 seclog.local {"message":"Accepted publickey for hogehoge from 192.0.2.100 port 64884 ssh2"} 2013-01-20T18:12:24+09:00 seclog.local {"message":"pam_unix(sshd:session): session opened for user hogehoge by (uid=0)"} 2013-01-20T18:12:28+09:00 seclog.local {"message":"Received disconnect from 192.0.2.100: 11: disconnected by user"}
上記のような内容で、出力されています。
この時点で期待した内容のログ出力がされていない場合は
どこかに誤りがあるので、修正していく流れになります。
fluent-plugin-zabbixへデータを渡す
fujiwaraさん作成のfluent-plugin-zabbixを利用し、Zabbixへデータを渡します。
<match check.**> type copy <store> type file path /var/log/td-agent/check_seclog </store> <store> type zabbix zabbix_server 192.0.2.2 host watashi name_key_pattern (fail|acce|inva)_count add_key_prefix securelog </store> </match>
/tmp/hoge
へのデバッグ出力と同様に
fluent-plugin-datacounterを通したログを
/var/log/td-agent/check_seclog
へ出力しておきます。
<store> type file path /var/log/td-agent/check_seclog </store>
こちらも、値が正常に取得されているかを確認します。
2013-01-20T18:09:56+09:00 check.seclog {"unmatched_count":4,"unmatched_rate":0.06,"unmatched_percentage":66.66666666666667,"acce_count":0,"acce_rate":0.0,"acce_percentage":0.0,"fail_count":0,"fail_rate":0.0,"fail_percentage":0.0,"inva_count":2,"inva_rate":0.03,"inva_percentage":33.333333333333336} 2013-01-20T18:10:56+09:00 check.seclog {"unmatched_count":0,"unmatched_rate":0.0,"acce_count":0,"acce_rate":0.0,"fail_count":0,"fail_rate":0.0,"inva_count":0,"inva_rate":0.0} 2013-01-20T18:11:56+09:00 check.seclog {"unmatched_count":0,"unmatched_rate":0.0,"acce_count":0,"acce_rate":0.0,"fail_count":0,"fail_rate":0.0,"inva_count":0,"inva_rate":0.0} 2013-01-20T18:12:56+09:00 check.seclog {"unmatched_count":14,"unmatched_rate":0.23,"unmatched_percentage":73.6842105263158,"acce_count":4,"acce_rate":0.06,"acce_percentage":21.05263157894737,"fail_count":0,"fail_rate":0.0,"fail_percentage":0.0,"inva_count":1,"inva_rate":0.01,"inva_percentage":5.2631578947368425}
zabbix_server 192.0.2.2
zabbixサーバのIPアドレスを指定します。host watashi
データ送り元のホスト名を指定します。name_key_pattern (fail|acce|inva)_count
name_key_pattern (fail|acce|inva)_countの設定と
add_key_prefix securelogの設定は
Zabbixで、itemを上記設定のように作成し
trapperのデータとしてZabbixが受け取れる為に設定します。
Zabbixでグラフ化
Zabbix上で上手く値が取得できていれば
このようにグラフに値が出力され、期待通りの動作をすることが確認できました。
awesome fluentd!