Muninを使うとサーバの色々な値(ディスク使用量、MySQLのスロークエリ数、HTTPアクセス数、CPU使用率などなど)をいい感じにグラフ化して表示してくれるのでサーバのリソース監視にとても便利と聞きました。
自分の管理しているさくらVPSのUbuntuサーバに入れて色々監視してみたのですが、なにかのウェブアプリを運用してるでもないため特に見応えがない。そこでそんな弱小サーバでもガンガンにアクセスが来るsshdのログイン失敗数を監視してみることにしました。
# 招かれざるお客様達
Jul 14 08:58:16 hogel sshd[16682]: Invalid user web from 218.53.55.189
Jul 14 08:58:17 hogel sshd[16686]: Invalid user nagios from 218.53.55.189
Jul 14 08:58:18 hogel sshd[16688]: Invalid user tomcat from 218.53.55.189
Jul 14 08:58:19 hogel sshd[16690]: Invalid user squid from 218.53.55.189
...
しかしどうやら既存のプラグインにはなかったので単純そうだったupstartプラグインなんかを参考に適当にSSHログイン失敗数を記録してみました。
#!/bin/sh
# -*- sh -*-
: << =cut
=head1 NAME
ssh_invalid - Plugin to measure invalid ssh user.
=head1 AUTHOR
Contributed by hogelog
=head1 LICENSE
GPLv2
=head1 MAGIC MARKERS
#%# family=auto
#%# capabilities=autoconf
=cut
. $MUNIN_LIBDIR/plugins/plugin.sh
if [ "$1" = "autoconf" ]; then
echo yes
exit 0
fi
if [ "$1" = "config" ]; then
echo 'graph_title SSH Invalid User'
echo 'graph_args --base 1000 -l 0 '
echo 'graph_scale no'
echo 'graph_vlabel invalid user in days'
echo 'graph_category system'
echo 'ssh_invalid.label invalid_user'
echo 'ssh_invalid.draw AREA'
print_warning ssh_invalid
print_critical ssh_invalid
exit 0
fi
SSH_LOG=${sshlog:-/var/log/auth.log}
MON=`LANG=C date '+%b'`
DAY=`date '+%d'`
TODAY=`printf "%s %2d" $MON $DAY`
COUNT=`grep "$TODAY" $SSH_LOG | grep "invalid user" | wc -l`
printf "ssh_invalid.value $COUNT\n"
ほとんどperldocで、処理内容はsshdログの「( ^ω^)<不正アクセスしにきたお」と語る以下の様なログの行数を数えているだけです。
Jul 14 08:58:16 hogel sshd[16682]: Invalid user web from 218.53.55.189
このプラグインをしばらく稼働させるとこんなグラフになりました。
日毎のログイン失敗数が可視化されます。0時直前にアクセスがあった場合に見えにくいという問題はありますが、上記したちょっとしたスクリプトを書くだけでこんなにサクッと可視化できるのはなかなか楽しいです。ちなみにこのサーバはアクセス数も少ないしDenyHostsも稼働させていてこの数字なので、サーバによってはもっと激しいグラフになるのかもしれません。
おそらくサーバのリソース監視ツールとして有名なMuninですけど「なんでもグラフ化ツール」としてもなかなかおもしろそうですね。
一応以下のようにするとUbuntu 13.04のapt-getからインストールされたMunin 2でこのssh_invalidプラグインが動きます。それ以外の環境でもpluginsディレクトリにおいてゴニョゴニョ設定すればだいたい動くと思います。
$ curl https://gist.github.com/hogelog/5981186/raw/89c730507263e41aa5afaf3cb17a731e3b05be0e/ssh_invalid -o /usr/share/munin/plugins/ssh_invalid
$ ln -s /usr/share/munin/plugins/ssh_invalid /etc/munin/plugins/ssh_invalid
$ vim /etc/munin/plugin-conf.d/munin-node
# 以下を追記
[ssh_invalid]
group adm
$ restart munin-node