前々回、前回と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のときと同じようにiptablesにIPアドレスが追加されるだけです。
$ 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が出てきたら記事にしたいと思います。