それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

SSH総当たり防止策をiptablesのrecentモジュールでやる

ブルートフォースアタックが来るので対策。

理屈はともかく。実際にやってみる。

60 秒間に 5 回ログインを試行すると それ以降はしばらくログイン試行が失敗するようになり、最初のアクセスから 60 秒経過すると 6 回目のログイン試行ができるようになります。

iptables の ipt_recent で ssh の brute force attack 対策

1. n 秒間に可能な試行を m 回までにする

iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --set
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --rcheck \
                         --seconds 60 --hitcount 5 -j LOG --log-prefix 'SSH attack: '
iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --rcheck \
                         --seconds 60 --hitcount 5 -j DROP


行けそう。なので、/etc/init.d/iptables saveをしようとしたら、コマンドがない!!

2. lenny の場合 /etc/init.d/iptables が有りません。

/etc/init.d/ だと実行順序の関係で一時的に無防備になることがあり、iptablesnic の起動時に起動するようになった。つまり /etc/network/if-pre-up.dにiptables以下に作る

/etc/network/if-pre-up.d/iptables.sh に以下のシェルスクリプトを記述

シェルスクリプト iptables.sh
#!/usr/bin/env bash
export PATH=$PATH:/sbin
sudo iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --set
sudo iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --rcheck \
                              --seconds 60 --hitcount 5 -j LOG --log-prefix 'SSH attack: '
sudo iptables -A INPUT -p tcp --syn --dport 22 -m recent --name sshattack --rcheck \
                              --seconds 60 --hitcount 5 -j DROP


ただし、nic 起動時に実行されるのでlo,eth0,eth1 ,,,で実行されて同じ設定があふれ爆発する。

3. iptables を起動するNICを指定する。

if-pre-up.d/iptablesシェルスクリプトをネットワークに起動毎に実行されて面倒なことになりました。かといって、既に実行されていたら追記せず通過するシェルスクリプトに変えるのも面倒です。そこで、必要な外向きNICだけが実行するように設定しました。

sudo mv /etc/network/if-pre-up.d/iptables /etc/network/iptables # 起動時の実行から外す

まず、何度も実行されて嫌だったiptable を ip-pre-upからハズした。その上で、適当なディレクトリに設置。そして、実行させたいnicに書き込む

/etc/network/interfaces

Debianでルータ構築 - 空落科技(復興)空落科技(復興)を参考にした。

auto eth0
iface eth0 inet dhcp
pre-up /etc/network/iptables #起動時に実行

auto lo
iface lo inet loopback
                             #lo は何もしもしない


Debian lenny 以降 ( squeezeも?)だと、iptables をinterfaces に書くことになりそう。だけどメンテナンス性が良くないので、何とかしてほしいところ。

iptables の DROP / REJECT は使い分け

なお,「-j DROP」の代わりに「-j REJECT」とすると,パケットを破棄するかわりに接続を拒否するICMPパケットを返送します。DROPで破棄してしまうと,接続元はタイムアウトするまで待つことになりますから,攻撃をブロックする目的ではなく,ただ接続を拒否したい場合はREJECTを指定した方が相手に優しいと言えます。

とのこと、DROPとREJECTの違いはそういうことなんだ。 アタック防止だったら容赦なくDROPでいい気がする。

以前にも同じ事をやっている・・・

http://d.hatena.ne.jp/takuya_1st/20090801/1249148254
http://d.hatena.ne.jp/takuya_1st/20100318/1268878754

なんかい同じ事を調べれば気が済むんだ。。脳みそとうふ