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

Zabbixで、itemを上記設定のように作成し
trapperのデータとしてZabbixが受け取れる為に設定します。

Zabbixでグラフ化

Zabbix上で上手く値が取得できていれば

zabbix

このようにグラフに値が出力され、期待通りの動作をすることが確認できました。

awesome fluentd!