本日も乙

ただの自己満足な備忘録。

fail2banでnginx-http-auth(Basic認証の総当り攻撃対策)を有効にする

前々回前回とfail2banによるSSH攻撃対策について記事をアップしてきました。今回もfail2banネタです。 fail2banはSSHだけでなく、様々な攻撃に対しても防ぐことができます。今回はその中の一つとして、nginxのBasic認証の攻撃を防ぐ設定を行います。 Basic認証は多くのブラウザで使えることと、簡単に認証設定が行えるため重宝することが多いですが、ユーザ名とパスワードとその間にセミコロン(:)を入れた文字列をBASE64エンコードするだけなので、認証の強度としては弱く、SSLによる暗号化をしないと途中で盗聴されてパスワードがバレてしまいます。また、パスワード認証なので、総当りでユーザ名とパスワードを入力された場合でも、短期間で認証が突破されてしまう可能性があります。 したがって、Basic認証でセキュリティ強度を上げる場合には、ユーザ名とパスワードの文字数を多くし、予測できないようにすることと、総当り攻撃をされないようにある程度(回数)認証に失敗したらそのIPアドレスを弾く(BAN)するように設定することが重要です。 fail2banでBasic認証のセキュリティ強度向上の設定を行います。

Basic認証のフィルタを有効にする

/etc/fail2ban/jail.confでnginxのBasic認証のフィルタを有効にします。

[nginx-http-auth]

# trueに変更する
enabled = true
filter  = nginx-http-auth
# sendmailアクションは任意で
action  = iptables-multiport[name=nginx-http-auth,port="80,443"]
          sendmail[name=nginx-http-auth, dest=ohsawa0515@gmail.com, sender=fail2ban@jicoman.info]
# 対象となるログ名を設定
# nginxのエラーログすべてを対象にする
logpath = /var/log/nginx/*error*.log
bantime = 86400
maxretry = 5

fail2ban再起動

$ sudo service fail2ban restart
fail2ban デーモンを停止中:                                [  OK  ]
fail2ban を起動中:                                       [  OK  ]

フィルタが有効になっているかを確認する

serviceコマンドから確認する

$ sudo service fail2ban status
fail2ban-server (pid  3995) を実行中...
Status
|- Number of jail:      2
`- Jail list:           ssh-iptables, nginx-http-auth

nginx-http-authが表示されていれば有効になっています。 もし、設定が有効になっていない場合はログ(/var/log/fail2ban/fail2ban.log)から原因を探ります。

ログから確認する

/var/log/fail2ban/fail2ban.log

2014-03-24 01:09:30,814 fail2ban.server : INFO   Exiting Fail2ban
2014-03-24 01:09:32,006 fail2ban.server : INFO   Changed logging target to /var/log/fail2ban/fail2ban.log for Fail2ban v0.8.11
2014-03-24 01:09:32,007 fail2ban.jail   : INFO   Creating new jail 'ssh-iptables'
2014-03-24 01:09:32,445 fail2ban.jail   : INFO   Jail 'ssh-iptables' uses pyinotify
2014-03-24 01:09:32,538 fail2ban.jail   : INFO   Initiated 'pyinotify' backend
2014-03-24 01:09:32,540 fail2ban.filter : INFO   Added logfile = /var/log/secure
2014-03-24 01:09:32,543 fail2ban.filter : INFO   Set maxRetry = 3
2014-03-24 01:09:32,546 fail2ban.filter : INFO   Set findtime = 600
2014-03-24 01:09:32,547 fail2ban.actions: INFO   Set banTime = 172800
2014-03-24 01:09:32,941 fail2ban.jail   : INFO   Creating new jail 'nginx-http-auth'
2014-03-24 01:09:32,941 fail2ban.jail   : INFO   Jail 'nginx-http-auth' uses pyinotify
2014-03-24 01:09:32,942 fail2ban.jail   : INFO   Initiated 'pyinotify' backend
2014-03-24 01:09:32,949 fail2ban.filter : INFO   Added logfile = /var/log/nginx/error.log
2014-03-24 01:09:32,957 fail2ban.filter : INFO   Added logfile = /var/log/nginx/foo.com-error.log
2014-03-24 01:09:32,963 fail2ban.filter : INFO   Added logfile = /var/log/nginx/bar-com-error.log
2014-03-24 01:09:32,967 fail2ban.filter : INFO   Set maxRetry = 5
2014-03-24 01:09:32,970 fail2ban.filter : INFO   Set findtime = 600
2014-03-24 01:09:32,971 fail2ban.actions: INFO   Set banTime = 86400
2014-03-24 01:09:33,011 fail2ban.jail   : INFO   Jail 'ssh-iptables' started
2014-03-24 01:09:33,027 fail2ban.jail   : INFO   Jail 'nginx-http-auth' started

上記のようなログが残っていればnginx-http-authは設定されているはずです。

実際にBANしてみた

SSHのときと同じようにiptablesIPアドレスが追加されるだけです。

$ sudo iptables -L

Chain fail2ban-nginx-http-auth (1 references)
target     prot opt source               destination
REJECT     all  —  xxx.xxx.xxx.xxx    anywhere            reject-with icmp-port-unreachable
RETURN     all  --  anywhere             anywhere

sendmailアクションが有効になっている場合は下記のようなメールが送信されます。

Subject:[Fail2Ban] nginx-http-auth: banned xxx.xxx.xxx.xxx from bar_host

Body:
----
Hi,


The IP xxx.xxx.xxx.xxx has just been banned by Fail2Ban after
5 attempts against nginx-http-auth.


Regards,


Fail2Ban

Apacheの場合

nginxの場合はnginx-http-authでしたが、Apacheの場合はapache-authです。設定方法は同じです。

最後に

fail2banでBasic認証の総当り攻撃を防ぐことができました。 これでひと通りfail2banの設定は大丈夫かと思います。 他にもフィルタなどtipsが出てきたら記事にしたいと思います。