Linux
セキュリティ

iptablesを利用したsshのブルートフォースアタック対策

More than 5 years have passed since last update.


環境

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