環境
CentOS 6.4
概要
iptablesを設定し、
同一IPから30秒間に5回ログインリクエストがあった場合、300秒間ロックする。
というロジックを組んでいます。
ログインに成功してもカウントされるため、
ログイン/ログアウトを繰り返しても制限に引っかかりますが、
通常そのような利用はしないでしょう。。
※limit-burstだと思い通りのことが出来ず、チェインを利用したルールを採用。
※可能であればパスワード認証は使用しないのが望ましいです。
iptables の設定
# ssh アクセス制限
# 制御用のチェインを3つ追加。
# sshポートに新規リクエストがあった場合のルール
-N ssh_check
# アタックリストに存在する場合のルール
-N ssh_reject
# アタックと見なした場合のルール
-N ssh_attack
# 22番ポートに新規リクエストがあった場合、ssh_checkチェインに入ります。
-A INPUT -p tcp -m state --state NEW,INVALID --dport 22 -j ssh_check
# ssh_check ルールの処理
# アタックリストに入ってから300秒以内の場合はssh_rejectルールを適用します。
-A ssh_check -m recent --rcheck --seconds 300 --name attack_reject -j ssh_reject
# アタック候補リストに30秒以内に5回カウントされている場合は、
# アタックと見なしてssh_attackルールを適用します。
-A ssh_check -m recent --rcheck --seconds 30 --hitcount 5 --name attack_count -j ssh_attack
# アタック候補リストに1カウント分として追加します。
-A ssh_check -m recent --set --name attack_count
# ログ出力
-A ssh_check -j LOG --log-level info --log-prefix "COUNT: "
# ssh_reject ルールの処理(reject時)
# ログ出力
-A ssh_reject -j LOG --log-level info --log-prefix "REJECT: "
# アタック候補リストに1カウント分として追加し、rejectします。
-A ssh_reject -m recent --set --name attack_count -j REJECT
# ssh_attack ルールの処理(アタックと見なした場合)
# ログ出力
-A ssh_attack -j LOG --log-level info --log-prefix "ATTACK: "
# アタックリストに記録して、ssh_rejectルールを適用します。
-A ssh_attack -m recent --set --name attack_reject -j ssh_reject
# ssh_rejectルールが適用されなかった場合、acceptされます。
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# ssh アクセス制限ここまで
適用後、iptables restartが必要です。
ログは/var/log/messages に出力されます。
あわせてsshのポートを22から変更しておくと、
攻撃される頻度がぐっと減るためリスクをかなり低減できます。
参考サイト
http://www2s.biglobe.ne.jp/~nuts/labo/inti/ipt_recent.html
http://www.turbolinux.co.jp/products/server/11s/user_guide/iptablescmd.html
http://linuxjm.sourceforge.jp/html/iptables/man8/iptables.8.html