sshd へのブルートフォースアタック 2

6月10日より iptables によるフィルタリングを開始していて,正常に動作しているようだったのですが….
昨日,突然リモートログインができなくなって,調べてみると iptables が正常に動いていないようでした.

どうやら,

iptables -A SSH -p tcp --syn -m recent --name sshconn --rcheck --seconds 15 --hitcount 3 -j SSH-evil

この部分でバグを起こしているようです.どうやら seconds オプションと hitcount オプションを併用すると動かないらしい.


http://union.waterblue.biz/MT/archives/2005/11/iptablesipt_rec.html


ということで,この部分を seconds オプションのみを使用して,最初に SSH-evil に入ったとき ACCEPT するように変更しました.

#!/bin/sh

####################
## SSH-evil chain ##
####################

# SSH-evil チェインを定義
iptables -N SSH-evil

# SSH チェインから brute force attack とみなされたアドレスを badSSH リスト (ブラックリスト) に登録 (このアドレスは ACCEPT)

iptables -A SSH-evil -m recent --name badSSH --set -j LOG --log-level DEBUG --log-prefix "evil SSH user: "
iptables -A SSH-evil -j ACCEPT

###############
## SSH chain ##
###############

# SSH チェインを定義
iptables -N SSH

# syn フラグの立っていないパケットを ACCEPT
iptables -A SSH -p tcp ! --syn -m state --state ESTABLISHED,RELATED -j ACCEPT

# source IP が brute force attach のブラックリスト (過去 3 分間) に入っている場合 REJECT
iptables -A SSH -p tcp --syn -m recent --name badSSH --rcheck --seconds 180 -j REJECT

# brute force attack か否か判断 (5 秒間に 2 アクセス以上の場合 SSH-evil へ飛ぶ)
iptables -A SSH -p tcp --syn -m recent --name sshconn --rcheck --seconds 5 -j SSH-evil

# sshconn リストに source IP を記録 (このアドレスは ACCEPT)
iptables -A SSH -p tcp --syn -m recent --name sshconn --set
iptables -A SSH -p tcp --syn -j ACCEPT

# sshd へのアクセス (eth0) は SSH チェインへ飛ばす
iptables -A INPUT -i eth0 -p tcp --dport 22 -j SSH

これで,5 秒間に 2 回アクセスがあったらブラックリストに追加され,その後 3 分間アクセス禁止を実現できます.

seconds オプションを何度も重ねて使えば前回と同じ条件も実現できるかもしれませんが,とりあえずこれで様子を見てみようと思います.