VPSに不正アクセスを試みてきたウザいIPを、自動でブロックするシェルを作った話です。
はじめに
VPSを借りてブログ運営しています。最初のうちはTeraTermを使ってガシガシ設定していましたが、環境が安定してくるとサーバに直接アクセスする機会が減ってきます。
ブログ管理だけならWeb経由で十分できますからね。
で、数か月ぶりに接続して「lastb」コマンドを叩いてみると…出るわ出るわ不正アクセスの痕跡。
わずか1分間でこれだけのアクセス履歴!
類推されるIDとパスワードの組み合わせを手あたりしだい試みてくるような感じですね。
セキュリティが突破されたり、乗っ取られたりはしていないものの、そういうハッキングチャレンジをされていること自体、あまり気持ちいいものではありません。
そこで、怪しいIPアドレスからの接続を検知し、接続拒否リストに自動登録(hosts.denyに追記)するシェルを作成しました。
実際はもっといい方法があるかもしれませんので、参考までに。
使用される場合は、自己責任のもとお願いいたします。
作成したシェル
以下のようなシェルファイルを作成し、cronで毎分実行するようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/sh # 最後の不正アクセスを取得 # lastbコマンドの最初の結果を取得し # その結果の1行目のみを取得し # その行の3番目の項目(IPアドレス)を取得 V_LAST_SNAKE=`/usr/bin/lastb -1 | head -n 1 | awk '{print $3}'` echo "$V_LAST_SNAKE" # すでに除外対象となっているかを確認 N_ALREADY_DENY=`cat /etc/hosts.deny|grep -c $V_LAST_SNAKE` echo $N_ALREADY_DENY # まだ除外対象になっていない場合 if [ $N_ALREADY_DENY = 0 ]; then # 直近10回のアクセスの中で、3回以上失敗しているか? N_SNAKE_COUNT=`/usr/bin/lastb -10 | grep -c $V_LAST_SNAKE` if [ $N_SNAKE_COUNT -gt 2 ]; then # hosts.denyに追加 echo "all : $V_LAST_SNAKE #`date`">>/etc/hosts.deny fi fi |
解説します。といってもほとんどコメントに書いていますが…
まずlastbコマンドで、最新のアクセスエラー情報を取得します。
その際の接続元IPアドレスが、すでにhosts.denyに登録されている(アクセス拒否対象になっている)場合は何もせず終了。
未登録の場合は、直近10回のアクセス失敗履歴に3件以上存在するかを確認。
存在する場合は、そのIPアドレスをhosts.denyに追記します。
追記した日付もわかるようにつけておきます。
設定後、1日放置したあとにhosts.denyを開いてみると。
おー、しっかり3件追記されていますね。
lastbコマンドで確認するかぎり、追記時刻以降は当該IPからのアクセスなし。
除外設定も正しく機能しているようです。
注意点
上記シェルですが、3回接続に失敗すると、自分自身が除外対象になってしまうおそれがあります。不安な場合は、あらかじめhosts.allowに自分のIPを入れておくといいかもしれません。
また、最低でも、RootユーザーでのSSH接続は無効にしたうえ、SSHのポート番号は22以外に変えておきましょう。
基本的にはこれでほぼ門前払いできます。面倒でなければ鍵認証も付けておいた方がいいですね。
ポート番号を総当たりされるとどこかで突破されてしまうので、上記シェルはそのときの防御策です。
ポート番号がバレてしまったのか、短期間に大量のアクセスが来るようになってしまったので、
SSHのポート番号を変更することにしました。
変更後半月経ちますが、今のところ静かです。
sshd_config を編集してポート番号を変更、
sshd -t で正当性チェック、
service sshd restart でSSHDを再起動。