SSH総当たり攻撃(辞書攻撃/ブルートフォースアタック)の対策とその効果

IDやパスワードを変えて何度もssh接続を試みてくるSSH総当たり攻撃(辞書攻撃/ブルートフォースアタック)の対策の1つに、SSHGuard の導入があります。
SSHGuard のインストール・設定方法と、iptablesを使用する場合の設定方法、導入による効果を説明します。

なお、iptablesサンプルのiptables設定を利用されている場合は、以降のファイアウォールへの設定の箇所の作業はする必要はありません。先の記事にて既に設定済みです。

7/4修正:
先の記事と本記事にて下記を修正
変更前:$IPTABLES -A INPUT -p tcp -m state --state NEW -j sshguard
変更後:$IPTABLES -A INPUT -p tcp -j sshguard


sshguardインストール



SSHGuardはサーバのログを監視し、IDやパスワードを変えて何度もssh接続を試行する攻撃を検出すると、一定時間、その接続をブロックします。
ブロックは、SSHGuardが自動的にファイアウォールへ設定を行うことで実施されます。
以下が対応しているファイアウォールです。
  • PF(OpenBSD,FreeBSD,NetBSD,DragonFly BSD)
  • netfilter/iptables (Linux)
  • IPFIREWALL/ipfw (FreeBSD, Mac OS X)
  • IPFILTER (FreeBSD, NetBSD, Solaris)
  • hostsファイル(hosts.allow)

CentOSの場合/ソースビルドの場合

最新版の sshguard-1.5.tar.bz2 をここからダウンロードします。

インストールは以下で行います。
./configure --with-firewall=で使用するファイアウォールを指定します。
ここには、その他ipfw(FreeBSD, Mac OS Xの場合)、pf(FreeBSDの場合)、hosts(hostsファイル(hosts.allow)の場合) が指定できます。

tar -jxf sshguard-1.5.tar.bz2
cd sshguard-1.5
./configure --with-firewall=iptables
make
make install



Ubuntuの場合

sudo apt-get install sshguard




ファイアウォールへの設定



Ubuntuの場合
ここで行うことはありません。


CentOSの場合/ソースビルドの場合

インストール時、ファイアウォールに hosts(hostsファイル(hosts.allow)の場合)を指定した場合
ここで行うことはありません。
SSHGuardで攻撃を検出すると、/etc/hosts.allow に
ALL : xxx.xxx.xxx.xxx : DENY
のような記述がSSHGuardにより自動的に追加されます。

ファイアウォールに iptables を指定した場合
注:すでにiptablesサンプルのiptables設定を利用されている場合は、ここでの作業はする必要はありません。先の記事にて既に設定済みです。

SSHGuardで攻撃を検出すると、チェイン sshguard に
iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP
のようなルールが追加されます。
そこで、

iptables -N sshguard

にてチェイン sshguard を作成しておきます。
また、SSHGuardで検出した攻撃元からの接続をブロックする次の記述を追加しておきます。

iptables -A INPUT -p tcp -j sshguard


7/4修正:
変更前:$IPTABLES -A INPUT -p tcp -m state --state NEW -j sshguard
変更後:$IPTABLES -A INPUT -p tcp -j sshguard


iptablesでのサンプルや解説はiptablesサンプルを参照してください。

その他については、SSHGuard - Defend from brute force attacks | Setup のページ下部の Blocking Backends の箇所にファイアウォールごとの説明へのリンクがあります。



SSHGuard起動設定



Ubuntuの場合
ここで行うことはありません。

CentOSの場合/ソースビルドの場合
OS起動時に自動的に SSHGuardが動作するように設定します。
/etc/rc.local

/usr/local/sbin/sshguard -l /var/log/secure

/var/log/secure が無い場合は、/var/log/auth.log を指定してください。



SSHGuard動作確認


SSHGuardのデフォルトの挙動では、20分間に4回攻撃を検出すると、そのIPアドレスからの接続をブロックします。
接続ブロックは一定時間経過すると解除します。
但し、接続ブロックから20分以内に再度攻撃を検出すると、ブロック時間を長くしていきます。
ブロック回数とブロック時間は以下のようになります。

1回目:420~630秒間の範囲内でブロック
2回目:840~1260秒間の範囲内でブロック
3回目:永久にブロック

SSHGuardにて攻撃を検出すると、/var/log/messages に以下のログが出力され、接続がブロックされます。

sshguard[1441]: Blocking xxx.xxx.xxx.xxx:4 for >630secs: 40 danger in 4 attacks over 44 seconds (all: 40d in 1 abuses over 44s).

意味は、IPアドレス xxx.xxx.xxx.xxx から 44秒間に4回攻撃があったので、630秒間接続をブロックした、です。

ファイアウォールに iptables を使用している場合は、/sbin/iptables -L -n で確認すると、チェイン sshguard に下記のようなルールが追加されています。

Chain sshguard (1 references)
target prot opt source destination
DROP all -- xxx.xxx.xxx.xxx 0.0.0.0/0


このまま攻撃が続くと出力されるログは以下のようになります。

sshguard[1441]: Blocking xxx.xxx.xxx.xxx:4 for >630secs: 40 danger in 4 attacks over 44 seconds (all: 40d in 1 abuses over 44s).

sshguard[1441]: Blocking xxx.xxx.xxx.xxx:4 for >945secs: 40 danger in 4 attacks over 29 seconds (all: 80d in 2 abuses over 847s).

sshguard[1441]: Blocking xxx.xxx.xxx.xxx:4 for >0secs: 40 danger in 4 attacks over 44 seconds (all: 120d in 3 abuses over 1924s).



630secs の次は 945secs とブロック時間が長くなり、最後は 0secs となっています。
0secs は該当IPアドレスからの接続は永久にブロックされたことを示します。


なお、この20分間に4回攻撃検出でブロック、3回ブロックで永久にブロックする、等の挙動はSSHGuard起動時に指定するオプションで変更できます。
オプションは以下を参照してください。








オプション説明
-a sAfety_threshsAfety_thresh には 10×N の値を指定する。N回の攻撃を検出したら、そのアドレスからの接続をブロックする
デフォルト値は 40 なので、4回の攻撃でブロックする。
-p S接続ブロックを解除する秒数を指定する。解除は S秒~1.5xS秒経過後に行われる。
デフォルト値は 7*60 なので、420秒~630秒経過でブロックを解除する。
-s SS秒経過後にそのアドレスを忘れる。この秒数を超えての攻撃は決してブロックされない。
デフォルトは 20*60 なので、間隔が20分以内の攻撃がブロックされる。
逆に言うと、間隔が20分以上の攻撃はブロックされない。
-l sourceSSHGuardで監視するログファイルを source で指定する。source に - を指定すると、標準入力から読み込む。
-w addr/host/block/file決してブロックしない対象(ホワイトリスト)を指定する。
指定はIPアドレス、ホスト名、CIDR形式によるアドレス範囲、またはそれらを記述したファイル、いずれかで行う。
-b [num:]filenameブラックリストを有効にする。接続ブロックがnum回繰り返されると、filenameで指定されたファイルに該当IPアドレスを記録する。
numはデフォルト値は3なので、3回の接続ブロック後は、ブラックリストに登録する。



導入の効果


2012/7/29以降のssh辞書攻撃を受けた日と、その時のID/パスワードの試行回数です。
下記回数以降は、SSHGuardにより接続がブロックされたので、最大でも12回の試行を受けただけで、後は撃退できたことがわかります。
なお、下記接続は日本国内からのみです。海外からの接続は、先の記事
iptables - 国内からの接続のみ許可して海外からの接続を遮断する にて接続をブロックしています。

2012/7/29   4回
2012/7/31   11回
2012/8/14   4回
2012/8/14   1回
2012/9/24   9回
2012/9/24   5回
2012/9/24   4回
2012/10/7   1回
2012/10/13   5回
2012/11/23   2回
2012/11/23   1回
2012/11/23   1回
2012/12/19   11回
2012/12/29   12回
2013/1/17   11回
2013/3/19   4回




参考



SSHGuard - Defend from brute force attacks
SSHブルート・フォース・アタック対策 - SSHGuradを使ってカウンター防御する
hollyなblog:sshguard試してみた

iptablesサンプル パソコン鳥のブログ/ウェブリブログ
iptables - 国内からの接続のみ許可して海外からの接続を遮断する パソコン鳥のブログ/ウェブリブログ

この記事へのコメント

この記事へのトラックバック