sshdログとiptablesを用いて、SSHのブルートフォースアタック(総当たり攻撃)から守る sshguard を試す機会があったのでメモっておきます。
ぶっちゃけ、お外からSSHで繋げるサーバとかほぼ皆無だし、鍵認証だしで、実際に活躍することなどないのですが・・・開ける必要があったり、ミスって開いちゃってたりした時に、iptables でがっちりカットできるので使いドコロはまぁまぁあるかもしれません。
OSとsshguardのバージョンについて
ここでの構築は、Debian Wheezyで行っています。Wheezyのパッケージは、ちゃんと設定ファイルとデーモンになっていてナイスです。
SqueezeやLenny、CentOS5 などもパッケージはあるのですが、内容は /usr/sbin/sshguard が入っているだけのクソパッケージです。その理由がおそらく、sshguard の -l オプションがないバージョンのためで、tail … | sshguard の形で起動する格好悪い形だからです(※古い紹介ページを見るとわかります)。
新しい sshguard は -l auth.log のように綺麗に指定できるので、使う場合は頑張って最新を使うとよいです。
インストール
Debian Wheezy
パッケージを入れるだけです。
1 |
apt-get install sshguard |
Debian Squeeze
パッケージはありますがデーモンになっていないので、ちょっとアレですが Wheezyの .deb でも動くので、持ってきて入れるとよさげです。
1 2 3 |
cd /usr/local/src wget http://ftp.cn.debian.org/debian/pool/main/s/sshguard/sshguard_1.5-5_amd64.deb dpkg -i sshguard_1.5-5_amd64.deb |
Debian Lenny
ここまで落とすとWheezyの.debは依存で入らないので、source からパッケージを作って入れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# GnuPG鍵を作っておく # - VM上でやる時は別シェルで rngd を実行してentropyをぶっこむ apt-get install rng-tools gpg --gen-key rngd -r /dev/urandom # Wheezyで apt-get source sshguard してソースを丸ごと持ってきておく cd /usr/local/src/sshguard/sshguard-1.5/ # パッケージを作る # - compatとか署名とか今回はだいぶ適当に編集 apt-get install devscripts debhelper=8.0.0~bpo50+2 echo -n 8 > debian/compat vim ./debian/changelog vim debian/control debuild # インストール cd ../ dpkg -i sshguard_1.5-5_amd64.deb |
CentOS 5
セント君は今回は適当に対応。パッケージ持ってきて、無理矢理Wheezyと同じ構成にしました。実際にはちゃんと rpm 作るべきです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# リポジトリ持ってきて cd /usr/local/src wget http://flexbox.sourceforge.net/centos/5/x86_64/flexbox-release-1-4.3.noarch.rpm rpm -Uvh flexbox-release*rpm # インストールして yum install sshguard # 設定構成ゴリゴリ作る vim /etc/default/sshguard mkdir /etc/sshguard vim /etc/sshguard/whitelist vim /etc/init.d/sshguard chmod 744 /etc/init.d/sshguard # 起動と自動起動 /etc/init.d/sshguard restart chkconfig sshguard on |
諸情報の確認
apt-cache showpkg sshguard
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Package: sshguard Versions: 1.5-5 (/var/lib/apt/lists/ftp.jp.debian.org_debian_dists_wheezy_main_binary-amd64_Packages) (/var/lib/dpkg/status) Description Language: File: /var/lib/apt/lists/ftp.jp.debian.org_debian_dists_wheezy_main_binary-amd64_Packages MD5: 3d17c43db76da983ea8c43bbdf677074 Description Language: en File: /var/lib/apt/lists/ftp.jp.debian.org_debian_dists_wheezy_main_i18n_Translation-en MD5: 3d17c43db76da983ea8c43bbdf677074 Reverse Depends: Dependencies: 1.5-5 - libc6 (2 2.10) iptables (0 (null)) Provides: 1.5-5 - Reverse Provides: |
dpkg -L sshguard
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/. /usr /usr/share /usr/share/doc /usr/share/doc/sshguard /usr/share/doc/sshguard/copyright /usr/share/doc/sshguard/changelog.Debian.gz /usr/share/doc/sshguard/changelog.gz /usr/share/doc/sshguard/examples /usr/share/doc/sshguard/examples/whitelistfile.example /usr/share/man /usr/share/man/man8 /usr/share/man/man8/sshguard.8.gz /usr/sbin /usr/sbin/sshguard /etc /etc/init.d /etc/init.d/sshguard /etc/default /etc/default/sshguard /etc/sshguard /etc/sshguard/whitelist |
ps -C sshguard w
1 2 |
PID TTY STAT TIME COMMAND 18405 ? Sl 0:00 /usr/sbin/sshguard -i /var/run/sshguard.pid -l /var/log/auth.log -w /etc/sshguard/whitelist -a 40 -p 420 -s 1200 |
設定
ホワイトリスト
man から持ってきた例はこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 |
# comment line (a '#' as very first character) # a single IPv4 and IPv6 address 1.2.3.4 2001:0db8:85a3:08d3:1319:8a2e:0370:7344 # address blocks in CIDR notation 127.0.0.0/8 10.11.128.0/17 192.168.0.0/24 2002:836b:4179::836b:0000/126 # hostnames rome-fw.enterprise.com hosts.friends.com |
内側をスルーするならこんな感じに編集します。
/etc/sshguard/whitelist
1 2 3 4 |
127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 |
sshdログのファイル指定
Debianなら /var/log/auth.log , CentOS なら /var/log/secure ですが、設定を共通させたいなら両方書いておきます。/etc/default/sshguard
1 2 |
# list of log files to scan delimited by space LOGFILES="/var/log/auth.log /var/log/secure" |
ただし、initスクリプトでこうなっているので、起動時に既にファイルがないと -l オプションが追加されません。もし両方あったら、-l オプションが複数追加されます。
1 2 3 4 |
# Add logfiles to be monitored to list passed to daemon LOGS=0 for logfile in $LOGFILES; do [ -r "$logfile" ] && DAEMON_ARGS="$DAEMON_ARGS -l $logfile" && LOGS=$((LOGS+1)); done [ $LOGS = 0 ] && log_warning_msg "No valid logs to scan by $NAME, exiting" && exit 0 |
回数/秒数制限
defaultにオプションが書いてありますが、これはデフォルト値をそのまま明記しています。/etc/default/sshguard
1 2 |
# Other options ARGS="-a 40 -p 420 -s 1200" |
オプションの意味は
デフォで十分なバランスなので、あとはお好みで編集しておきます。
動作確認
起動時の ipatbles は全INPUTパケットを、何もないsshguardチェインに渡す形になっています。iptables -L -v -n
1 2 3 4 5 6 7 |
Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 sshguard all -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 ... Chain sshguard (1 references) pkts bytes target prot opt in out source destination |
適当に存在しないユーザでSSHログインしようとします。ログはこんな感じ。
1 2 |
sshd[17519]: Invalid user SuperGedowFather from 192.168.0.29 sshd[17519]: input_userauth_request: invalid user SuperGedowFather [preauth] |
4回しくじったら、sshguardさんが怒ってログを出します。
1 |
sshguard[15630]: Blocking 192.168.0.29:4 for >630secs: 40 danger in 4 attacks over 9 seconds (all: 40d in 1 abuses over 9s). |
sshguardチェインにソースアドレスが追加されています。
1 2 3 |
Chain sshguard (1 references) pkts bytes target prot opt in out source destination 16 1024 DROP all -- * * 192.168.0.29 0.0.0.0/0 |
追加されたルールは、指定オプション値に従って、数分後に削除されます。
改造コーナー
この仕様だと、全INPUTパケットをsshguardチェインに渡し、アタック判定を受けたソースアドレスは全ポートを塞がれるので、80番ポートなども同時にアクセスできなくなります。多分、別にそれでも困らないけど、なんか気持ち悪いのでSSHに限定した動作にする場合は、いったん sshguard を停止してから、
勝手にこんなのを追加して、
/etc/default/sshguard
1 2 |
# iptables options IPTABLES_OPTIONS="-p tcp -m multiport --dports 22,1022,10022,20022" |
追加と削除のルールにオプションを追加しておくと、
/etc/init.d/sshguard
1 2 3 |
iptables -I INPUT $IPTABLES_OPTIONS -j sshguard 2> /dev/null ... iptables -D INPUT $IPTABLES_OPTIONS -j sshguard 2> /dev/null |
–dportsで羅列したポートのみが動作の対象となります。先にsshguardを停止しないと、追加済みのルールが綺麗に削除されないので、注意してください。
その他メモ
判定条件
SSHGuard – Defend from brute force attacks | Attack signatures に基本条件が書かれていますが、SSH+LDAPだとrootを含む既存ユーザに対する認証失敗は、ログの都合上カウントされないようです。ログローテート
当然ですが、-l /var/log/auth.log で指定したログがローテートしても、ちゃんと新規ファイルを追ってくれます。
1 |
sshguard[16915]: Reloading rotated file /var/log/auth.log. |
ガーッと書いちゃいましたが、実にシンプルかつ強力なので、知っといて損はないかと思います。