KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

logcheckの小技!?――logごとでソートしてもらう

サーバーログの監視といえば、logcheckとかlogwatchとかが有名どこでしょうか。最近だとaptとかyumで簡単に入れられるし、設定項目も少ないということでlogcheckはお手軽なツールとなっている事でしょう。

定期的にメールで監視しているログを送ってきてくれるのは良いんですけど、UFWのログレベルをlowで運用しているとBLOCKのログがかなりの量を占めて届きます。しかも、UFWが出すBLOCKのログって結構記述が長い。他の短めだけど微妙に気になるログが埋もれて見逃すこともしばしば。

ログを出したものごとにまとまって届いたら良いのになーと思って、logcheckの設定を眺めていたら、何とかなりそうな設定部分がありました。ごにょごにょと少し、いじったらうまくいったので、そのお話を。


■検証環境

  • ubuntu 14.04 LTS
  • logcheck 1.3.14 (apt-get install logcheckでインストール)

"/etc/logcheck/logcheck.conf"のそれらしき記述

apt-getでインストールすると、logcheckのメイン設定ファイルは、"/etc/logcheck/logcheck.conf"となっているはずです。これの40行目ぐらいから次の様な記述があります。

# Controls whether "sort -u" is used on log entries (which will
# eliminate duplicates but destroy the original ordering); the
# default is to use "sort -k 1,3 -s":
# Alternatively, set to "1" to enable unique sorting

SORTUNIQ=0

重複しているログを書き出さないようにするかどうかって設定項目ですが、説明をよくよく読むと、"default is to use "sort -k 1,3 -s"と書かれています。既定だと、"1~3列目でソートして送るよ"ってことのようです。1~3列目と言えば、ログの日付の部分です。4列目に短いホスト名、5列目がログを出しているもの、6列目以降がログの内容って感じだったろうので……。

5列目を第1にソートして、1~3列目で第2にソートしてくれれば良いじゃん。という結論に至りましたが…。

あくまで、この設定ファイルの項目は、重複を除くかどうかのスイッチだけなので、ソート方法の細かい指定まではできない模様……。詰んだ!?

実行ファイル"/usr/sbin/logcheck"を見れば……

logcheckの実行ファイルはシェルスクリプトで、aptとかで入れてれば、"/usr/sbin/logcheck"にあるはずです。

"/usr/sbin/logcheck"を開いて、"sort -k 1,3 -s"で検索してあげると、531行目あたりで以下のような記述がありました。

# Use sort -u or -k 1,3 -s
if [ "$SORTUNIQ" -eq 1 ];then
    SORT="sort -u"
else
    SORT="sort -k 1,3 -s"
fi

ここが、あの"/etc/logcheck/logcheck.conf"の45行目あたりにあった設定項目の反映箇所の模様です。で、既定のソート方法のコマンドを書き換えてあげましょう。

SORT="sort -k 1,3 -s"

SORT="sort -k 5,5 -k 1,3 -s"
と書き換えてあげれば、OKです。

実行確認

次にメールが来るまでのんびり待つのもいいですが、sudo -u logcheck /usr/sbin/logcheckでlogcheckを実行してあげればOKです。

System Events
=-=-=-=-=-=-=
Dec 13 09:40:31 host kernel: [1169459.983559] [UFW BLOCK] IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:cc:xx:xx:xx:xx:xx:xx:xx SRC=xxx.xxx.xxx.xxx DST=xxx.xxx.xxx.xxx LEN=52 TOS=0x00 PREC=0x00 TTL=116 ID=10625 DF PROTO=TCP SPT=63730 DPT=8080 WINDOW=8192 RES=0x00 SYN URGP=0
Dec 13 09:40:31 host kernel: [1169460.238050] [UFW BLOCK] IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:cc:xx:xx:xx:xx:xx:xx:xx SRC=xxx.xxx.xxx.xxx DST=xxx.xxx.xxx.xxx LEN=52 TOS=0x00 PREC=0x00 TTL=116 ID=10628 DF PROTO=TCP SPT=63732 DPT=8080 WINDOW=8192 RES=0x00 SYN URGP=0
Dec 13 09:40:38 host rserver-pam[14826]: pam_unix(rstudio:auth): check pass; user unknown
Dec 13 09:40:44 host rserver-pam[14828]: pam_unix(rstudio:auth): check pass; user unknown
Dec 13 09:39:55 host sshd[14321]: Accepted publickey for user from xxx.xxx.xxx.xxx port 63716 ssh2: RSA xx:xx:1b:92:ed:2f:xx:xx:7b:xx:a9:9c:6b:66:0a:14

こんな感じで、ログをはいたものでソートされて届くはずです。


P.S. あら、R Studio Serverもsyslogに一応認証関係のログ出していたのか!

追記(2016.03.08)

ufwのログをsyslogに吐かせないようにすれば、logcheckには引っかかってこないではないかということに気が付いた←。

BLOCKしてくれているのだからわざわざlogcheckで全部見るまでもない気がするし、わざわざ2か所にログ出力するのもどうかと思うので、修正してみます。

/etc/rsyslog.d/20-ufw.conf

# Log kernel generated UFW log messages to file
:msg,contains,"[UFW " /var/log/ufw/ufw.log

# Uncomment the following to stop logging anything that matches the last rule.
# Doing this will stop logging kernel generated UFW log messages to the file
# normally containing kern.* messages (eg, /var/log/kern.log)
#& ~

ufwのログ書き出しの設定は上記のようになっていますが、コメントを読めばわかる通り、syslogの方に出力せず、/var/log/ufw/ufw.logにだけ書き出すなら、このファイルの最終行の& ~コメントアウトを外してあげればよいらしいです。