ライン

ポイント:*

ライン

 はじめに

/var/log/auth.log の記録がすごい

 他のサイトには設定メモは残しているのですが、作ったばかりのホストに中国やアメリカからのsshの接続トライがまたすごい状態。
もうあきらめてフィルタで目立つところを対策するのではなく、ツールである程度実装することにしました。

 今回のfail2banは、結構実績があってウェブ検索でも既に沢山出てくるようになりました。
条件にマッチしたIPアドレスは、フィルタ(このページではPF)に登録されてアクセスができないようにします。
今回は、sshdへのアクセスを捕捉しますが、いろんなログを見て各サービスでも利用できますので、順次うざいアクセスには対処設定を加えてしまおうと思います。

 導入

pkgを利用

 まず、導入してしまいましょう。

#pkg install py27-fail2ban
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 7 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        py27-fail2ban: 0.9.1
        python27: 2.7.9
        libffi: 3.2.1
        python2: 2_3
        py27-setuptools27: 5.5.1
        py27-sqlite3: 2.7.9_5
        sqlite3: 3.8.7.4

The process will require 70 MB more space.
11 MB to be downloaded.

Proceed with this action? [y/N]: y
Fetching py27-fail2ban-0.9.1.txz: 100%  181 KB 185.0k/s    00:01
Fetching python27-2.7.9.txz: 100%   10 MB 805.9k/s    00:13
Fetching libffi-3.2.1.txz: 100%   34 KB  34.7k/s    00:01
Fetching python2-2_3.txz: 100%    1 KB   1.1k/s    00:01
Fetching py27-setuptools27-5.5.1.txz: 100%  284 KB 290.7k/s    00:01
Fetching py27-sqlite3-2.7.9_5.txz: 100%   27 KB  27.9k/s    00:01
Fetching sqlite3-3.8.7.4.txz: 100%  685 KB 350.5k/s    00:02
Checking integrity... done (0 conflicting)
[1/7] Installing libffi-3.2.1...
[1/7] Extracting libffi-3.2.1: 100%
[2/7] Installing python27-2.7.9...
[2/7] Extracting python27-2.7.9: 100%
[3/7] Installing py27-setuptools27-5.5.1...
[3/7] Extracting py27-setuptools27-5.5.1: 100%
[4/7] Installing sqlite3-3.8.7.4...
[4/7] Extracting sqlite3-3.8.7.4: 100%
[5/7] Installing python2-2_3...
[5/7] Extracting python2-2_3: 100%
[6/7] Installing py27-sqlite3-2.7.9_5...
[6/7] Extracting py27-sqlite3-2.7.9_5: 100%
[7/7] Installing py27-fail2ban-0.9.1...
[7/7] Extracting py27-fail2ban-0.9.1: 100%
Message for python27-2.7.9:
 =====================================================================

Note that some standard Python modules are provided as separate ports
as they require additional dependencies. They are available as:

bsddb           databases/py-bsddb
gdbm            databases/py-gdbm
sqlite3         databases/py-sqlite3
tkinter         x11-toolkits/py-tkinter

=====================================================================
Message for py27-fail2ban-0.9.1:
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Please do not edit the fail2ban.conf and jail.conf files as they
will be overwritten upon each upgrade of the port.

Instead, create new files named fail2ban.local and jail.local

For more information, see the official manual:

http://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Configuration

If you are upgrading from 0.8.x consider adopting the new
configuration style.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 導入はこれで終わり。/etc/rc.conf には、

# Fail2ban
fail2ban_enable="YES"

を加えておきます。

#cd /usr/local/etc/fail2ban
#ll
total 60
drwxr-xr-x  2 root  wheel   1536 Jan  9 19:30 action.d/
-rw-r--r--  1 root  wheel   2102 Jan  9 19:30 fail2ban.conf
drwxr-xr-x  2 root  wheel    512 Jan  9 19:30 fail2ban.d/
drwxr-xr-x  2 root  wheel   2048 Jan  9 19:30 filter.d/
-rw-r--r--  1 root  wheel  16868 Jan  9 19:30 jail.conf
drwxr-xr-x  2 root  wheel    512 Jan  9 19:30 jail.d/
-rw-r--r--  1 root  wheel   1790 Oct 28 10:49 paths-common.conf
-rw-r--r--  1 root  wheel    645 Oct 28 10:49 paths-debian.conf
-rw-r--r--  1 root  wheel    689 Oct 28 10:49 paths-fedora.conf
-rw-r--r--  1 root  wheel   1174 Oct 28 10:49 paths-freebsd.conf
-rw-r--r--  1 root  wheel    290 Oct 28 10:49 paths-osx.conf

 設定ファイルはこんな感じに置かれていました。

 設定

 まず、FreeBSDに設定されたデフォルトを見ておきます。

#grep -v ^# fail2ban.conf | grep -v ^$
[Definition]
loglevel = INFO
logtarget = /var/log/fail2ban.log
socket = /var/run/fail2ban/fail2ban.sock
pidfile = /var/run/fail2ban/fail2ban.pid
dbfile = /var/db/fail2ban/fail2ban.sqlite3
dbpurgeage = 86400

 こんなでした。今回のフィルタはpfです。
他のフィルタも同様ですが、メモはpfのみで書いておきます。

#ll action.d/pf.conf
-rw-r--r--  1 root  wheel  1412 Oct 28 10:49 action.d/pf.conf

設定が存在することを確認。
内容は、

# Fail2Ban configuration file
#
# OpenBSD pf ban/unban
#
# Author: Nick Hilliard <nick@foobar.org>
#
#

[Definition]

# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
# we don't enable PF automatically, as it will be enabled elsewhere
actionstart =


# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
# we don't disable PF automatically either
actionstop =


# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck =


# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
actionban = /sbin/pfctl -t <tablename> -T add <ip>/32


# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
# note -r option used to remove matching rule
actionunban = /sbin/pfctl -t <tablename> -T delete <ip>/32

[Init]
# Option:  tablename
# Notes.:  The pf table name.
# Values:  [ STRING ]
#
tablename = fail2ban

となっていました。

 さて、設定ファイルは、jail.d以下に置いて設定します。
ここでは、sshd-pf.local にしました。

[sshd-pf]
enabled  = true
filter   = sshd
action   = pf
          mail[name=sshd, dest=foo@example.net, sender=noreply@localhost]
logpath  = /var/log/auth.log

findtime  = 300
maxretry = 3
bantime  = 7200

にしてみました。5分の間に3回以上来たら、テーブルに加え、2時間アクセスできないようにする…にしたつもり。
メールで状況は通知が飛ぶはず。

 次は、PF側の設定ファイルにテーブルを加えます。/etc/pf.conf

# Fail2ban
table <fail2ban> persist
block in log quick proto tcp from <fail2ban> to $ext_addr port ssh

のように追加しました。

#pfctl -f /etc/pf.conf

のように反映しました。同様にFail2banも起動します。

#service fail2ban start
21:19:02,156 fail2ban.server         [58733]: INFO    Starting Fail2ban v0.9.1
21:19:02,156 fail2ban.server         [58733]: INFO    Starting in daemon mode

上記のように開始しました。ログも動き出しました。
後々は、ログのローテートも設定を加えますが、どの程度出てくるか不明なので、後回しにします。

21:19:02,199 fail2ban.server         [-]: INFO    Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.1
21:19:02,201 fail2ban.database       [-]: INFO    Connected to fail2ban persistent database '/var/db/fail2ban/fail2ban.sqlite3'
21:19:02,241 fail2ban.database       [-]: WARNING New database created. Version '2'
21:19:02,242 fail2ban.jail           [-]: INFO    Creating new jail 'sshd-pf'
21:19:02,256 fail2ban.jail           [-]: INFO    Jail 'sshd-pf' uses poller
21:19:02,282 fail2ban.filter         [-]: INFO    Set jail log file encoding to US-ASCII
21:19:02,283 fail2ban.jail           [-]: INFO    Initiated 'polling' backend
21:19:02,294 fail2ban.filter         [-]: INFO    Added logfile = /var/log/auth.log
21:19:02,295 fail2ban.filter         [-]: INFO    Set maxRetry = 3
21:19:02,296 fail2ban.filter         [-]: INFO    Set jail log file encoding to US-ASCII
21:19:02,297 fail2ban.actions        [-]: INFO    Set banTime = 7200
21:19:02,298 fail2ban.filter         [-]: INFO    Set findtime = 300
21:19:02,299 fail2ban.filter         [-]: INFO    Set maxlines = 10
21:19:02,385 fail2ban.server         [-]: INFO    Jail sshd-pf is not a JournalFilter instance
21:19:02,404 fail2ban.jail           [-]: INFO    Jail 'sshd-pf' started
21:19:02,756 fail2ban.filter         [-]: INFO    [sshd-pf] Found 184.172.42.122
21:28:55,896 fail2ban.filter         [-]: INFO    [sshd-pf] Found 184.172.42.122

既になんか捕まえ始めているけど、9分毎に来ているだけなんだ。うわ。ずっとこの間隔で来ているし。
これは手動確保でいいな。(投入した以降、まだ他よりはアクセスがないので、ページはここまでで一時休止状態に入ります)

 こんな感じで様子見を開始しました。

 その他

状況確認。

#fail2ban-client status sshd-pf
Status for the jail: sshd-pf
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     2
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

 翌朝にログを確認してみました。

01:58:54,186 fail2ban.filter         [58735]: INFO    [sshd-pf] Found 122.225.109.122
01:59:35,729 fail2ban.filter         [58735]: INFO    [sshd-pf] Found 122.225.109.122
01:59:51,306 fail2ban.filter         [58735]: INFO    [sshd-pf] Found 210.107.37.81
02:00:37,881 fail2ban.filter         [58735]: INFO    [sshd-pf] Found 122.225.109.122
02:00:38,630 fail2ban.actions        [58735]: NOTICE  [sshd-pf] Ban 122.225.109.122
02:56:11,647 fail2ban.filter         [58735]: INFO    [sshd-pf] Found 210.107.37.81
03:03:31,431 fail2ban.filter         [58735]: INFO    [sshd-pf] Found 141.212.122.98
04:00:38,987 fail2ban.actions        [58735]: NOTICE  [sshd-pf] Unban 122.225.109.122
04:48:10,176 fail2ban.filter         [58735]: INFO    [sshd-pf] Found 115.239.228.35
05:01:04,816 fail2ban.filter         [58735]: INFO    [sshd-pf] Found 103.41.124.50

1件条件に当てはまり、規制がかかっていたようです。
確認コマンドで、

#fail2ban-regex /var/log/auth.log /usr/local/etc/fail2ban/filter.d/sshd.conf

Running tests
=============

Use   failregex file : /usr/local/etc/fail2ban/filter.d/sshd.conf
Use         maxlines : 10
Use         log file : /var/log/auth.log
Use         encoding : US-ASCII


Results
=======

Failregex: 428 total
|-  #) [# of hits] regular expression
|   1) [1] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[ *\d+\.\d+\] )?(?:@vserver_\S+ )...
|   9) [427] ^\s*(<[^.]+\.[^.]+>)?\s*(?:\S+ )?(?:kernel: \[ *\d+\.\d+\] )?(?:@vserver_\S+ )...
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [741] (?:DAY )?MON Day 24hour:Minute:Second(?:\.Microseconds)?(?: Year)?
`-

Lines: 741 lines, 0 ignored, 428 matched, 313 missed [processed in 1.08 sec]
Missed line(s): too many to print.  Use --print-all-missed to print all 313 lines

結構いろいろ見つかっている感じです。
vsftpdでも結構使えそうなので、TCP Wrapperに引っかかっているのに、連発でアクセスする輩を24時間拒否するように設定を加えてみました。
どんな感じで捕まえてくるか確認待ちです。


【改訂履歴】作成:2015-01-21 更新:2015-01-25

【リンク】

Fail2banのWikiページ
fail2banを入れてみた サーバいじくり雑記
Fail2ban on FreeBSD

Copyright © 1996,1997-2006,2007- by F.Kimura,