サーバをインターネットに公開していると、一日に何百回となくsshで不正アクセス攻撃が来る。RSA鍵がないとsshできないようにしているのでパスワードの総当たり攻撃(ブルートフォース攻撃)は効かないのだが、ログファイルが肥大化するし気持ちのいいものはない。iptablesのrecentオプションでそういった通信を遮断することができるらしいので、試してみる。
CentOSではiptablesの設定は/etc/sysconfig/iptablesにある。その中に従来のsshを許可する行も記述されているが、その直前に下記のようなrecentを含んだ2行を追加する。
-A RH-Firewall-1-INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -A RH-Firewall-1-INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --seconds 60 /--hitcount 5 --name SSH -j DROP -A RH-Firewall-1-INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
1行目では、tcpの22番ポートに接続してきた新規通信のソースIPをSSHという名前のテーブルに載せる。既にSSHテーブルに同じソースIPがあった場合はアップデートする。この行には-j ACCEPT(許可)も-j DROP(破棄)もないので、次の行へ行く。
2行目では引き続き同じ通信を扱う。このソースIPが過去60秒間に5回以上アクセスをして来ている場合、-j DROPで破棄される。
3行目では、2行目で破棄されなかった場合に-j ACCEPTで許可される。もともとあった単なる許可設定である。
上記のように書き換えてservice iptables reloadとすると反映される。iptables -Lで動作状態を確認する。
[root@ml115 ~]# iptables -L
target prot opt source destination
...
tcp -- anywhere anywhere tcp dpt:ssh state NEW recent: SET name: SSH side: source
DROP tcp -- anywhere anywhere tcp dpt:ssh state NEW recent: CHECK seconds: 60 hit_count: 5 name: SSH side: source
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW
...
上記のSSHというテーブルは/proc/net/ipt_recentに記録されている。さっそく引っかかっていた。
[ishii@ml115 ~]$ cat /proc/net/ipt_recent/SSH src=221.143.x.x ttl: 111 last_seen: 4490427483 oldest_pkt: 1 4490427483