sshdに対するブルートフォースアタックを防ぐ

外部公開している自宅サーバの/var/log/secureを久しぶりに見たところ、大半がsshdに対する不正アクセスの痕跡で埋まっていました。私の運用しているsshdではパスワード認証は一切許可しておらず、公開鍵認証しか許可していないので、ブルートフォースアタックを仕掛けられてもまだ安心できます。しかし、不正アクセス対策をせずいたずらにログファイルのサイズを増やしてもしかたがないので、iptablesを用いてsshdに対する不正アクセスを防ぐことにしました。

sshとiptalblesをキーワードに調べてみると、次のサイト様を発見しました。

こちらのサイト様には、iptablesとそのモジュールであるipt_recentを用いて60秒間に5回までしかSSHでのログインを試行できないようにする、というようなiptablesの設定方法が書かれています。早速、その設定を自分のサーバに適用してみました。

まず、次のような内容のファイルをiptables.shという名前で作ります。

#!/bin/sh

IPTABLES=/sbin/iptables

$IPTABLES -N SSH-evil
$IPTABLES -A SSH-evil -m recent --name badSSH --set -j LOG --log-level DEBUG --log-prefix "evil SSH user: "
$IPTABLES -A SSH-evil -j REJECT

$IPTABLES -A SSH -p tcp ! --syn -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -N SSH
$IPTABLES -A SSH -p tcp --syn -m recent --name badSSH --rcheck --seconds 1800 -j REJECT
$IPTABLES -A SSH -p tcp --syn -m recent --name sshconn --rcheck --seconds 60 --hitcount 5 -j SSH-evil
$IPTABLES -A SSH -p tcp --syn -m recent --name sshconn --set
$IPTABLES -A SSH -p tcp --syn -j ACCEPT

$IPTABLES -A INPUT -p tcp --dport ssh -j SSH

そして実行権限を付けてrootで実行します。

# chmod u+x ./iptables.sh
# ./iptables.sh

上記の設定例だと、60間に5回ログインを試行すると30分間はsshdにアクセスできなくなるという意味になります。詳しい解説は先ほどのサイト様に書かれていますので、是非参考にしてみてください。

参考サイト様に書かれていない情報を少しだけ。ipt_recentはsshdへの接続を試みたホストや接続を拒否したホストのIPアドレスをリストという形で保存しています。そのリストは私の場合(CentOS 5)だと、/proc/net/ipt_recent/以下にありました。catで内容を確認することができます。