概要 †
fail2banで不正アクセスからサーバーを守ります。
今回はデフォルト設定(SSH)の他に、nginxのbasic認証に数回失敗すると弾くようにしてみます。
手順 †
- セットアップします。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
-
!
-
!
-
!
-
!
| apt-get update
apt-get install fail2ban
vi /etc/fail2ban/fail2ban.conf
logtarget = /var/log/fail2ban/log
mkdir /var/log/fail2ban
l /etc/rc2.d/
|
- 設定ファイルを作成します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
-
!
-
!
-
!
-
!
-
!
-
!
-
!
-
!
-
| cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 <…(必要ならば追加する)>
bantime = 1800
maxretry = 3
destemail = [email protected]
mat=mail
action = %(action_mw)s
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth/log
maxretry = 5
[nginx-auth]
enabled = true
filter = nginx-auth
logpath = /opt/nginx/log/*/error.log
port = http,https
bantime = 900
maxretry = 5
|
- フィルタ(/etc/fail2ban/filter.d/nginx-auth.conf)を作成します。
basic認証は、認証が必要な場合に401を返し、成功すると200、失敗するとまた401を返すため
アクセスログから401を探すルールにすると、複数のタブで認証サイトを一気に開いただけで引っかかる可能性があります。
そのため、エラーログから認証に失敗した場合のエラーメッセージを元にしたルールを作成しました。
(nginxのバージョンやロケールによってメッセージは変わる可能性があります)
1
2
3
4
| -
!
-
!
| 2014/10/15 21:02:02 [error] 12342014/10/15 21:34:09 [error] 1234
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| -
|
|
|
|
|
!
-
|
!
-
|
|
!
-
|
|
|
!
|
[INCLUDES]
before = common.conf
[Definition]
failregex = ^.*\[error\].*, client: <HOST>,.*$
ignoreregex =
|
- 正規表現を確認します。
1
|
| fail2ban-regex <対象ログパス> /etc/fail2ban/filter.d/nginx-auth.conf
|
- 反映します。
1
2
3
4
5
| -
!
-
!
| service fail2ban restart
rm /var/log/fail2ban.log
|
- iptablesで動作確認をします。
(画像は、iptablesで不正パケットをdrop前にlog出力しているので、それをトリガーにフィルタを作成してみた時のものです。
こちらのほうが見栄えが良いので貼っています。実際はnginxのbasic認証をわざと失敗して、dropチェインに追加されることを確認します)
- メールでも動作確認をします。
(画像は、同じくiptablesのログを使ったテストフィルタの結果です
実際はnginxのbasic認証をわざと失敗して、メール通知されることを確認します)
検証時の環境 †