2013年04月02日

SSHブルート・フォース・アタック対策 - SSHGuradを使ってカウンター防御する

サーバー、デスクトップ用途を問わずモバイル・インターネットが普及した現在、簡単にグローバル・アドレスでインターネットに接続することも多くなって来ました。ウイルスは勿論ですが、もし貴方がSSHサーバーをOS(Mac OS, Linux)にインストールし、ユーザ/パスワード認証を利用しているならばブルート・フォース・アタック(Brute force attack/総当り攻撃)対策もしておいた方が良いかもしれません。
(何でも公開鍵認証にするというのも面倒なんですよね)

sshguard_03

SSHGuardは認証ログを監視し、不審なパターンに一致するIPアドレスが現れると、OSの持つファイヤー・ウォール機構へアクセス拒否対象として動的に追加してれるソフトウェアです。 

SSHGuard のインストール1 - CentOS(Redhat系) Linux


まずはCentOSにSSHGuardをインストールしてみます。まずはプロジェクト・ホームに移動し、Download > FROM SOURCES >  latest releaseリンクから最新のファイル(sshguard-x.x.tar.bz2)をダウンロードしましょう。

SSHGuardはロギング・サービスと連携しますがrsyslogパッケージを採用しているRedHat系OSで利用する場合には、ソースからビルドします(Mac OS X、Ubuntu/syslog-ngであれば予めバイナリ・パッケージが用意されています)。

SSHGuard - Defend from brute force attacks

このファイルを解凍し、make、make install。

$ bunzip2 sshguard-1.5.tar.bz2 
$ tar xvf sshguard-1.5.tar 
$ cd sshguard-1.5
$ ./configure --with-firewall=iptables
$ make
$ sudo make install
(gcc、makeがない場合、先に $ sudo yum install gcc make を実行する)

ソースからビルドする場合、必ず --with-firewall オプションで採用しているファイヤー・ウォールの種類を指定します。

続いてiptables(ファイヤー・ウォール)の設定を行います。
まず、sshguardという名前でユーザー定義チェインを作成し、許可するサービス、アクセス種別を登録します。

この設定例では通常SSH(22)、HTTP(80)、HTTPS(443)サービスへのアクセスとDNS(53)、ICMP(PING)の通信のみ許可しています。

$ sudo iptables -N sshguard
$ sudo iptables -A INPUT -j sshguard
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
$ sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
$ sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
$ sudo iptables -A INPUT -p icmp --icmp-type any -j ACCEPT
$ sudo iptables -P INPUT DROP

SSHサービスはポート番号自体を変えることをお勧めしますが、ここまで出来たら設定をファイルに保存します。

$ sudo iptables-save > /etc/sysconfig/iptables

さあ、これでインストールと準備が終わりました。起動は次のコマンド。

$ sudo sshguard -l /var/log/secure

これでsecureログに認証失敗したIPアドレス/ホスト名が連続して出力されると自動でiptablesにアクセス拒否ポリシーが追加されます。

ただ、本運用ではこんな起動・停止スクリプトを用意、/etc/rc.localあたりで呼び出し、自動起動するように設定しておくのが良いですね。

#!/bin/sh

SSH_AUTH_LOG=/var/log/secure

case "$1" in
  'start')
    if [ -f $SSH_AUTH_LOG ]; then
      sshguard -l $SSH_AUTH_LOG > /dev/null 2>&1 &
      if [ $? -eq 0 ]; then
        echo "Starting SSHGuard: OK"
        exit 0
      else
        echo "Starting SSHGuard: Failed"
        exit 1
      fi
    fi
  ;;

  'stop')
    killall sshguard
  ;;

  *)
    echo "Usage: $0 { start | stop }"
    exit 1
  ;;
esac

例えば、sshguard.shとして保存しておけば、$ sudo sshgurad.sh start/stopで起動・停止できます。


SSHGurad のインストール2 - Ubuntu(Debian系) Linux


バイナリ・パッケージが用意されているUbuntuではインストールはとても簡単。次のコマンドを実行します。

$ sudo apt-get install sshguard
- snip -
sshguard (1.5-3) を設定しています ...
 * Starting SSHGuard Server sshguard  [ OK ]

これでおしまい。停止、起動、再起動は次のコマンド。

$ sudo /etc/init.d/sshguard stop/start/restart

自動起動は初めから有効になりますが、もし自動起動させたくない場合は、次のコマンドで手動起動に切り替えることが出来ます。

$ sudo update-rc.d sshguard disable
(有効化は enable)


SSHGuard によるカウンター防御を試してみる


手動でも良いんですが、ここでは次のようなrubyスクリプトを用意してSSHサーバーに擬似的にアタックしてみます。
(ruby以外にnet-sshモジュールが必要。インストールは $ gem install net-ssh)

# -*- encoding: utf-8 -*-
require 'rubygems'
require 'net/ssh'

target = "x.x.x.x"

u2p = {
  'root' => 'password',
  'oracle' => 'oracle',
  'guest' => 'guest'}

10.times {|i|
  u2p.each{|u,p|
    p = p + i.to_s
    puts "ATTACKING: #{target} with #{u}/#{p}"
    begin
      Net::SSH.start(target, u, :password => p) do |ssh|
        puts "SUCCESS: logged in. #{u}/#{p}"
      end
    rescue Net::SSH::AuthenticationFailed
      puts "FAILED: #{target} with #{u}/#{p}"
    end
  }
}

このスクリプトはユーザID/パスワードのハッシュをループしパスワードに0~9の数字を付与して認証を繰り返します。

targetにSSHサーバーのホスト名又はIPアドレスを設定後、このスクリプトを実行してみると・・・

$ ruby ssh-storm.rb
ATTACKING: x.x.x.x with root/password0 FAILED: x.x.x.x with root/password0 ATTACKING: x.x.x.x with oracle/oracle0 FAILED: x.x.x.x with oracle/oracle0 ATTACKING: x.x.x.x with guest/guest0 FAILED: x.x.x.x with guest/guest0 ATTACKING: x.x.x.x with root/password1 FAILED: x.x.x.x with root/password1 ATTACKING: x.x.x.x with oracle/oracle1

4回目の認証失敗以降はアクセス自体が出来なくなります。

サーバー側コンソールを開き、Firewallの設定を確認すると、スクリプトを実行したホスト(ここでは*.*.*.*)が拒否ポリシーに登録されているのが分かるはずです。

$ sudo iptables -L
Chain INPUT (policy DROP) target prot opt source destination sshguard all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ACCEPT tcp -- anywhere anywhere tcp dpt:http ACCEPT tcp -- anywhere anywhere tcp dpt:https ACCEPT icmp -- anywhere anywhere icmp any ACCEPT udp -- anywhere anywhere udp spt:domain ACCEPT udp -- anywhere anywhere udp dpt:domain Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain sshguard (1 references) target prot opt source destination DROP all -- *.*.*.* (attacker) anywhere

DROPポリシーの手動による初期化(解除)はディストリビューションに合わせて次のコマンドで可能です。

$ sudo /etc/init.d/iptablels restart
(CentOS)

$ sudo /etc/init.d/sshguard restart
(Ubuntu)   

うーん、僕のラップトップ(Ubuntu)にも入れておきたいですね。

それでは。


Hacking: 美しき策謀 第2版 ―脆弱性攻撃の理論と実際
Jon Erickson
オライリージャパン
売り上げランキング: 70,514

アナライジング・マルウェア ―フリーツールを使った感染事案対処 (Art Of Reversing)
新井 悠 岩村 誠 川古谷 裕平 青木 一史 星澤 裕二
オライリージャパン
売り上げランキング: 188,569

Posted by netbuffalo at 21:30│Comments(0)TrackBack(0)Linux | ユーティリティ


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

http://trackback.blogsys.jp/livedoor/netbuffalo/4422068

コメントする

名前
URL
 
  絵文字