Ubuntu/Debian SSHのブルートフォース対策 denyhosts

denyhostsはブルートフォース(総当り攻撃)を見張って複数回のログインを失敗したIPアドレスを自動的にhosts.denyに書き込んでくれるデーモンです。おそらくですが、Fedora辺りはインストール時にすでに起動していたようないないような。Ubuntu/Debianはデフォルトでは起動していないのでインストールしないとだめです。
http://brokendish.org/debian/415/

インストール

# apt-get -y install denyhosts

設定ファイルの編集

英語で詳細な説明が書いてあるのでアレなんですが、下手くそな翻訳を含めて基本的な設定方法を紹介します。
PURGE_DENY = 7d
これはログインを試みて失敗したユーザー(IPアドレス)をアクセス禁止にしておく期間を設定します。悪質なものは個別に手動でhosts.denyに書き込むとしてもし仮に本当に間違ってしまったユーザーがいたら何日ぐらい猶予期間を与えるかというような感じの設定です。私は7日間にしています。自分でログインして失敗しても一週間したらログインできるようになります。
PURGE_THRESHOLD = 2
ログイン失敗を重ねて拒否される(hosts.denyに登録される)わけですが、複数回にわたってアクセス拒否をされた回数を数えて、ここで設定された回数を超えると永遠にアクセスできなくするという設定です。2回、3回ぐらいhosts.denyに登録されたとなると、もうブラックリストと見てよいと思うので、私は2回に設定しています。
デフォルトの0を設定すると、永遠に拒否されることはない設定になります。インストール時はコメントアウトされているのでコメントを削除して有効にしましょう。
BLOCK_SERVICE = sshd(BLOCK_SERVICE = ALL)
ブロックするサービス名を記述します。たいていの場合はsshdだと思うのでデフォルトのままでOKです。その他のサービスを追加する(例えばFTPであるとかPOPであるとか)場合は、ALLで設定するしか方法が無さそうです。すべてを選択していてもちゃんとログインできれば何ら問題ないのでALLでも全然大丈夫。POPの攻撃も結構多いですよ。
DENY_THRESHOLD_INVALID = 5
何回ログインに失敗したかを数えて、それを超えたらブラックリストに登録します。5回も失敗すればもう完璧に攻撃だと思っていいかも。なのでデフォルトの設定の5回を設定。ここで拒否されたIPは、先のPURGE_DENYの設定で7日間入室禁止。そして5回のログイン失敗、7日間の謹慎処分、を2回繰り返す(PURGE_THRESHOLD)と、永遠に入室できなくなるというわけです。
この場合、ブルートフォース特有の架空のユーザー名に対しても効果があります。要するに適当にログインしてきた奴はダメってことです。
DENY_THRESHOLD_VALID = 10
こっちは架空のユーザーではなく本当に存在するユーザーに対してログイン失敗した回数をカウントします。10回失敗したらダメってことです。同様に7日の謹慎処分、それを2回繰り返したら永久追放。
DENY_THRESHOLD_ROOT = 2
Rootのログインは一回のログイン失敗で拒否。当然。が、しかし私は鍵の場所移動したりして、結構ログインに失敗するし、いろいろあるので2回に設定しています。1回目に失敗したら、「やばい!」って思うので。。。
ADMIN_EMAIL = root@localhost
管理者のEmailを書きます。

後はだいたいデフォルトでもいいです。
設定が終わったら、
service denyhosts restart
で再起動します。

余談ですが、もし仮に自分のIPが拒否されてしまった際には、結構面倒なことになります。特に固定IPではない場合はかなり厄介になります。固定IPの場合は、
hosts.allowに、
sshd:123.456.789.xxx
というようにホワイトリストを連ねてゆきます。これやらないとエラーで拒否されちゃいます。

固定IPじゃない場合は、結構面倒なようです。複数のファイルからIPを削除しないといけないようで、
/etc/hosts.deny
/var/lib/denyhosts/hosts
/var/lib/denyhosts/hosts-restricted
/var/lib/denyhosts/hosts-root
/var/lib/denyhosts/hosts-valid
/var/lib/denyhosts/users-valid

に書かれている対象IPを削除します。

最後にログを確認して終了
/var/log/denyhosts.log