PFを設定したFreeBSDの環境にbruteforceblockerを適用するメモ。
bruteforceblockerはsshに対するブルートフォースアタックをブロックするアプリケーションです。
外からサーバを操作しようと思うとsshdのお世話になるケースが多いと思います。
が、世の中お行儀の良くない方がいらっしゃるようで、22番ポートにアタックを仕掛ける輩の多いこと。こういったアタックはツールを使用していることが多いので、sshdが使用するポートを変えてしまう事が有効なようです。
sshdの設定ファイルは/etc/ssh/sshd_configファイルとなりますので、
Port sshdが使用するポート番号
を追記(最初はコメントアウトされている=デフォルトは22番ポート)した後
/etc/rc.d/sshd restart
を実行すれば、新しいポート番号でsshが利用できるようになります。(当然PFのフィルタルールは要変更)
しかしながら、世の中の流れで決まったポート以外はフィルタリングされていて、「sshは22番以外認めねーってば」というところも多いかと思われます。
まぁ、外部へは80/443番ポートしか認めんなんてところもありますから、22番ポートが使えるだけ御の字ではあるのですが。
# 443空いてればいろいろできるんですけどね。stoneとか。
…
そんなこんなで、ポートは変えられないけれどブルートフォースは避けたいという方に有用なのがbruteforceblocker。
動作原理としては、22番ポートにアクセスがあるとsshdはsyslog経由で/var/log/auth.logに認証状況を記録します。
bruteforceblockerはこのときのsyslogの動作をフックしてauth.logをチェック。ログ中に認証に失敗したIPアドレスのログが一定数以上あった場合は、PFのテーブルファイルにそのIPアドレスを突っ込むという至極単純なもの。
導入も簡単でportinstallからインストールできます。(perlスクリプトなので関連モジュールもどっさり入りますが)
portinstall -f security/bruteforceblocker
bruteforceblockerの設定ファイルは/usr/local/etc/bruteforceblocker.conf(なければ/usr/local/etc/bruteforceblocker.conf-distをコピー)になるので、必要な部分を変更します。基本的にデフォルト状態で問題ありません。
$cfg = {
# アタックがあった場合の通知先メールアカウント
email => 'root',
# PFに適用する際のテーブル名
table => 'bruteforce',
# 上記テーブルのファイル名
tablefile => '/var/db/ssh-bruteforce',
# 認証失敗の許可数
max_attempts => 3,
# ブロック期間(秒)
timeout => 3600,
# bruteforceblockerプロジェクトサイトにブロック情報を送信するか
report => 1,
# デバックモード指定
debug => 0,
# bruteforceblockerプロジェクトサイトからブロック情報を取得するか
use_remote => 1,
# ブロック情報を取得する場合どれくらい前の情報まで取得するか
mindays => 365,
# ブロック情報を取得する場合、報告されている数がどれくらいの情報を取得するか
mincount => 2,
# mailプログラムを指定
mail => '/usr/bin/mail',
# pfctlプログラム指定
pfctl => '/sbin/pfctl',
# ホワイトリスト。ここに記述されているIPアドレスはbruteforceblockerの処理対象外となる
whitelist => [qw{
127.0.0.1
172.16.0.2
10.10.1.4
}],
};
#leave 1; here!
1;
次に/etc/pf.confにbruteforceblockerが生成するファイルをテーブルとして下記のように追記します。
# Attack deny Lists
table <bruteforce> persist file "/var/db/ssh-bruteforce"
bruteforceblocker.confでtable/tablefileを変更した場合は、それに合わせてください。
フィルタルールには
block in quick proto tcp from <bruteforce> to any port ssh
と追記してください。(前回の例で言うと、追記場所はauthblockの下辺り)
PF起動時にテーブルファイルが必要なので
touch /var/db/ssh-bruteforce
を実行して空のssh-bruteforceファイルを作成します。
これでPFへのルール追加が出来ましたので、PFを再起動させます。
/etc/rc.d/pf restart
次に、syslogをフックするため、/etc/syslog.confを開いて
auth.info;authpriv.info | exec /usr/local/sbin/bruteforceblocker
を追記した上で
kill -HUP `cat /var/run/syslog.pid`
を実行してsyslogを再起動させてください。
bruteforceblockerプロジェクトサイトからブロック情報を取得する設定にしている場合は、syslog経由でauth.info/authpriv.infoファシリティへのアクセスがあった時に自動で取得され、/var/db/ssh-bruteforceファイルに書きこまれます。
…
これで、無事お馬鹿さんがフィルタリングされます。
実際においらのとこでお馬鹿さんがPF送りになった時のログ(auth.log抜粋)
Nov 8 22:01:16 dns sshd[71799]: Invalid user ftpuser from 165.139.158.252
Nov 8 22:01:19 dns sshd[71803]: Invalid user ens from 165.139.158.252
Nov 8 22:01:21 dns sshd[71805]: Invalid user ens from 165.139.158.252
Nov 8 22:01:21 dns BruteForceBlocker[69813]: blocking 165.139.158.252/32 in pf table bruteforce
これにあわせて、こんな内容でrootにメールが送られてきます。
BruteForceBlocker blocking 165.139.158.252/32 in pf table bruteforce
# IP晒すのは礼儀違反だけれども、馬鹿相手だからいいや。
コメント
[…] 「bruteforceblocker on FreeBSD(+PF)」で書いたとおり、sshのブルートフォースアタック避けにbruteforceblockerを入れているのだけれど、このアプリはsyslogに渡ってくる文字列を解析、失敗してい […]