アタック自体は防げませんが...
環境
- CentOS release 6.4 (Final)
- iptables.i686 1.4.7-9.el6
ほかに、ipt_recentというモジュールが必要らしいんだが、インストールされているものなのか、どうも確認ができず。やってみたら動いたのでOKとするけど...
方針
同じホストから60秒以内に5回のSSH接続があったら、そのホストからのSSHアクセスを10分間受け付けない。
考え方
- 新規のSSH接続があったらそれを「接続してきたヤツ」リストに記録しておく。(アタックではないアクセスも記録する。)
- 新規のSSH接続があるたびにその「接続してきたヤツ」リストを確認して、直近60秒で5回以上(要するに、6回目)のアクセスだったらBrute force attackとして認定し、「悪いヤツ」リストに別途記録しておく。
- 新規のSSH接続があるたびに「悪いヤツ」リストを確認して、直近10分以内にそのリストに記録されたホストだったら接続を受け付けない。
もうちょっと細かい考え方
- INPUTチェーンへのSSH接続は別チェーン(ここではSSHチェーンとする)に飛ばす。
- SSHチェーンでは以下の3つの動作をする。
- 「悪いヤツ」リストに記録されているヤツかの確認。その場合は接続をREJECTする。
- 「悪いヤツ」リストに記録されていないヤツなら、「接続してきたヤツ」リストを確認して60秒5回の判定をして、Brute force attackかどうかを判定。めでたく認定されたものはさらに別チェーン(ここではSSHATTACKチェーンとする)に飛ばす。
- 60秒5回の判定に引っかからなければ、「接続してきたヤツ」リストに記録して、接続を許可する。
- SSHATTACKチェーンでは「悪いヤツ」リストに追加、接続をREJECTする。
手順
SSH接続を別チェーンに一旦飛ばす。
ここでは、SSHという名前のチェーンを使うことにする。
/etc/sysconfig/iptables
-A INPUT -p tcp - state --state NEW -m tcp --dport 22 -j SSH
SSHチェーンで記録を取りつつBrute force attack認定する。
SSHチェーンはこんな感じで動く。
/etc/sysconfig/iptables
-A SSH -m recent --name sshbadcon --rcheck --seconds 600 -j REJECT
-A SSH -m recent --name sshcon --rcheck --seconds 60 --hitcount 5 -j SSHATTACK
-A SSH -m recent --name sshcon --set
-A SSH -j ACCEPT
まず、
-A SSH -m recent --name sshbadcon --rcheck --seconds 600 -j REJECT
で、「悪いヤツ」リスト(sshbadcon)の中身をチェックして、直近600秒以内で記録されているかを確認。その場合はREJECTする。
次に、
-A SSH -m recent --name sshcon --rcheck --seconds 60 --hitcount 5 -j SSHATTACK
で、「接続してきたヤツ」リスト(sshcon)の中身をチェックして、直近60秒以内に5回のアクセスがあったか確認。その場合はSSHATTACKチェーンに飛ばす。
さらに、
-A SSH -m recent --name sshcon --set
-A SSH -j ACCEPT
で、そこに当てはまらなかった接続(=アタックではない接続)について、「接続してきたヤツ」リストに記録し、ACCEPTする。
Brute force attack認定されたヤツを「悪いヤツ」リストに追加する。
リストに追加してREJECT。
/etc/sysconfig/iptables
-A SSHATTACK -m recent --name sshbadcon --set
-A SSHATTACK -j REJECT
まとめ
以上を施した全体のiptables(SSH接続に関するものだけ)は以下の感じ。
/etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:SSH - [0:0]
:SSHATTACK - [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j SSH
-A SSH -m recent --name sshbadcon --rcheck --seconds 600 -j REJECT
-A SSH -m recent --name sshcon --rcheck --seconds 60 --hitcount 5 -j SSHATTACK
-A SSH -m recent --name sshcon --set
-A SSH -j ACCEPT
-A SSHATTACK -m recent --name sshbadcon --set
-A SSHATTACK -j REJECT
COMMIT
Thanks
以下のサイトを参考に(というかほぼそのまま)させて頂きました。とても感謝しています。