awk を書いてみる

awk というと、列を取り出すことくらいにしか使っていなかったので、他のことにも使えるように練習をしてみる。
特に何かに使うわけではないけど、練習がてら /var/log/secure ログファイルの中の、ssh の認証で 3 回以上失敗した IP アドレスと失敗回数を awk で拾ってみた。

sed -n '/Failed/s/.* sshd.*Failed password for.* \([0-9.]*\) port .*/\1/p' /var/log/secure | awk 'NR==1{oip=$1;num=1;next}{nip=$1}oip~nip{++num;next}oip!~nip{if(num>=3){print num,oip}oip=nip;num=1;next}'

練習用なので自分のために解説をすると…
まず sed で Failed した IP アドレスだけを抜く(全部 awk でできるかもしれないけど sed が楽)。

sed -n '/Failed/s/.* sshd.*Failed password for.* \([0-9.]*\) port .*/\1/p' /var/log/secure

それから awk に渡す。
まず一行目の IP をとって比較用の変数に入れてカウントして、次の行に処理を移行する。

awk 'NR==1{oip=$1;num=1;next}

次の行の IP をとって別の変数に入れて、

{nip=$1}

前の行の IP と現在の行の IP を比べて同じならカウントして次の行に評価を移行。

oip~nip{++num;next}

違う IP なら新しい IP を比較用の変数に入れてカウントを 1 に戻して次の行へ移行。もしカウントが 3以上になっていたら、カウント数と IP を表示する。

oip!~nip{if(num>=3){print num,oip}oip=nip;num=1;next}'

表示結果をいじって そのまま iptables で DROP という手を思いついたが、
ブルートフォースアタック対策は iptables で便利にできるので、このようなスクリプトは不要。
それにしても、何も対策していなかったので、このスクリプトで凄い数字が出た。

2008年 1月 14日 | Posted in Linux
タグ:
コメントは終了しています。