SSHブルートフォース対策をpfだけで完結させる
pf Alone is Enough for SSH Defense
長らくFail2banを使ってSSHのブルートフォース対策をしてきていましたが、FreeBSDのFWサーバーでは実は不要だったことに気づきました。/etc/pf.confに以下のように記述します。
# ext_ifは外向きのネットワーク
# firewall_hostは自分自身
pass in on $ext_if inet proto tcp to $firewall_host port 22 flags S/SA keep state \
(max-src-conn 5, max-src-conn-rate 5/30, \
overload <ratelimit> flush global)
max-src-conn 5→同じIPから同時に5個まで接続可能
max-src-conn-rate 5/30→30秒間に5回まで新規接続可能
この設定により、30秒以内に5回以上の接続試行を自動ブロックし、同時接続数を5個に制限することができるようになります。
Fail2banは常駐プロセスで、リソースを結構食っていたので不要なら削除すべきだと判断しました。
まとめ
Fail2banが必要になるのは、ログ内容に基づく判断(パスワード失敗回数、不正ユーザー名など)、複数サービスの統合管理(SSH/HTTP/メールなど)、mod_securityとの連携など、高度なアクセス制御が必要な場合です。実際、私のWebサーバではmod_securityと組み合わせてFail2banを使用していますが、これはpfだけでは実現できない防御です。
一方で、単純なFWサーバのSSHアクセス制御なら、pfのレート制限と地理的ブロックぐらいで十分です。
地理的ブロックに関しては以下の記事を参考にしてもらえると幸いです。
システムはシンプルに保つべきです。不要なFail2banを削除することで、より管理しやすくなりました。
補足として、定期的にratelimitテーブルをクリアしたい場合は、cronで以下のように設定します(1日以上前にブロックされたIPを解除)。
0 * * * * /sbin/pfctl -t ratelimit -T expire 86400
おわり