swatch稼働までのあれこれ

ココログの方にやった事はまとめたんだけど、だいぶ苦労した内容を書いてみる。
sshを外部に公開していると、やたらと不正アクセスがやってきてひどい場合には2000回以上もユーザ名とパスワードを試される。鍵ファイルが無ければログイン出来ないようにしてるけど、何となく気持ち悪いので何回か失敗したIPアドレスからのアクセスはipfではじいてしまう事にした。で、ログを監視する為にswatchを入れてみた。
CPANから色々モジュールをインストールするのだが、あらかじめCPAN.pmをいじってringサーバからファイルをダウンロードさせてもらう事にした。

$CPAN::Defaultsite ||= "http://www.ring.gr.jp/archives/lang/perl/CPAN/";

さて、実際にsshdのログをチェックする為の設定ファイルを書いてみる。
設定ファイルのファイル名やディレクトリ名はオプションで指定するので適当。
とりあえずipfを操る為のシェルスクリプトを作る為の実験用のシェルスクリプトを用意した。
/root/ipf_swatch.sh

echo deny:$*

で、肝心なswatchの設定ファイルはこんな感じ
/root/swatch.conf

watchfor /Illegal user/
exec /root/ipf_swatch.sh $10

ここで引っかかる行は
月 日 時間 ホスト名 sshd[pid]: Illegal user ユーザ名 from IPアドレス
という内容なので
$10には不正アクセス元のIPアドレスが入っている予定。

で、起動してみる。ユーザ認証に関するログは/var/log/authlogに記録されるのでオプション類の指定がこんな感じになる。
watch --config-file="/root/swatch.conf" --tail-file=/var/log/authlog --tail-args '-n 20 -f'
tail-argsは本来無くても良いんだけど、これを指定しておかないとわざと自分でログイン失敗してみたりしないと動いてるのかどうかの確認が出来ない。
で、予定ではauthlogの末尾から20行以内にIllegal userを含む行があればdeny:に続いてIPアドレスが表示されるハズなんだけど表示されない。
マニュアルを読んでみても$*か$0を指定すればコマンドに内容が渡され、$nを指定するとn番目のフィールドが渡されると書いてあるんだけどなぁ・・・

swatchはメインのプログラムからperlスクリプトを吐いて実際にはそちらを実行するという形をとってる様なんだけど読んでみてわかったのは$S_[9]を$10の代わりに指定してあげると意図したとおりに動くということ・・・
なんかきもち悪いなぁと思い、グーグル先生にいろいろ聞いて回ると--awk-field-syntaxを指定すればいいらしいということがわかった
マニュアルにはそんな事書いてなかったのに(´Д⊂
(私の英語力の低さが原因で見落としてた可能性もありorz)