Cuturnの適当日記

徒然なるままに適当に駄文を吐き出しております

vyatta の syslog を Fluentd で分解する正規表現

vyattaの通信ログをFluentdでパースして解析するにゃどうするか、というメモ。vyOSと入れておいた方が未来の役に立つかな。vyattaの通信ログの例は以下のような感じ。ちょっとrsyslogの独自形式入ってますが。見られてやばそうな部分は日本語で抽象化してます。

2014-08-21,18:44:49,ホスト名,kern,warning,kernel, [21043965.836650] [ルール名-ルール番号-よくわからんアルファベット1文字]IN=eth0 OUT=eth1 MAC=00:0c:29:10:46:cf:00:0c:29:eb:23:d2:08:00 SRC=192.168.1.129 DST=172.31.16.28 LEN=48 TOS=0x00 PREC=0x00 TTL=127 ID=3810 DF PROTO=TCP SPT=52485 DPT=8080 WINDOW=8192 RES=0x00 SYN URGP=0

vyattaの全通信ログをsyslogでリモートサーバに送り、リモートサーバでテキストに起こしたものをfluentdのin_tailプラグインで分解したときに使った正規表現はこちら。一応これで上のログ自体だったかは怪しいが分解できた。

^(?<time>[^,]*,[^,]*),(?<host>[^,]*),(?<facility>[^,]*),(?<priority>[^,]*),(?<ident>[^,]*), \[(?<linuxtime>.*?)\] \[(?<fwrule>.*?)\] IN=(?<IN>[^ ]*) OUT=(?<OUT>[^ ]*) MAC=(?<macaddress>[^ ]*) SRC=(?<sourceip>[^ ]*) DST=(?<destip>[^ ]*) LEN=(?<LEN>[^ ]*) TOS=(?<TOS>[^ ]*) PREC=(?<PREC>[^ ]*) TTL=(?<TTL>[^ ]*) ID=(?<ID>[^ ]*)( DF | )PROTO=(?<protocol>[^ ]*) SPT=(?<SPT>[^ ]*) DPT=(?<DPT>[^ ]*) LEN=(?<LEN2>[^ ]*).*$

なお、rsyslogの独自形式はこれ。

$template DescFormat,&quot;%timegenerated:1:4:date-rfc3339%-%timegenerated:6:7:date-rfc3339%-%timegenerated:9:10:date-rfc3339%,%timegenerated:12:19:date-rfc3339%,%HOSTNAME%,%syslogfacility-text%,%syslogseverity-text%,%programname%,%msg%\n

取れるログ

2013-08-09,21:32:50,TESTZABBIX01,syslog,info,rsyslogd, [origin software=&quot;rsyslogd&quot; swVersion=&quot;5.8.10&quot; x-pid=&quot;21925&quot; x-info=&quot;<a href="http://www.rsyslog.com">http://www.rsyslog.com</a>&quot;] start

絶対たまたま順序とかスペースの数とか上手くいってるだけなので、ちゃんと仕様読むとか全部に適用できるかとか検証しないと…。どうしても正規表現ではこういう順不同(かもしれない)パラメータのパースはしづらいので、vyattaのsyslog用のプラグインを作った方がいい気がする。でもね、LENパラメータ、2つあるの…。どういうことなの…。

そもそもログの読み方がわからないので使える情報は精々ソースIP、宛先IP、ソースポート、宛先ポート、FWルール名くらいなのです。

なお、vyatta Firewallルールは基本的に文節とかになってしまっては困ると思われるので、ElasticSearchに食わせるときは適宜分解しないテンプレートの適用などが必要になります。