IT pass HikiWiki - [Memo2014][ITPASS] fail2ban のインストールと設定 Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
= fail2ban のインストール
* fail2ban をインストールした.
$ sudo -s
# apt-get update
# apt-get install fail2ban
* iptables -L でインストールされたことを確認した. 以下のように fail2banの記述が表示されていればよい.
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- anywhere anywhere
multiport dports ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-ssh (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
= 設定ファイルの編集
* fail2ban の設定ファイルは, /etc/fail2ban/jail.conf である.以下に設定の一部を抜粋し, 書き換えた.
== ssh
ssh に関する設定を以下のようにを書き換えた.
destemail = root@localhost
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
== apache
apache に関する設定を以下のようにを書き換えた.
[apache]
enabled = true
port = http,https
filter = apache-auth
findtime= 60
logpath = /var/log/httpd-*error.log
maxretry = 60
bantime = 1200
# default action is now multiport, so apache-multiport jail was left
# for compatibility with previous (<0.7.6-2) releases
[apache-multiport]
enabled = true
port = http,https
filter = apache-auth
findtime = 10
logpath = /var/log/httpd-*error.log
maxretry = 60
bantime = 1200
= failregex の追加
== apache
* /etc/fail2ban/filter.d/apache-auth.conf の failregex を以下のように編集した.
failregex = [[]client <HOST>[]] user .* authentication failure
[[]client <HOST>[]] user .* not found
[[]client <HOST>[]] user .* password mismatch
[[]client <HOST>[]] (13)Permission denied:
[[]client <HOST>[]] File does not exist:
^<HOST> -.*GET.*
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex = ^<HOST> -.*GET.*(jpg|jpeg|gif|png).*
== ssh
* /etc/fail2ban/filter.d/sshd.conf の failregex を編集し, 以下の1行を追記した.
^%(__prefix_line)s .* [[]<HOST>[]] .* POSSIBLE BREAK-IN ATTEMPT!\s*$
= ログレベルの確認
* /etc/fail2ban/fail2ban.conf の中のログレベルが 3 になっていることを確認した.
* ban, unban の記録がログに出力されるレベル
# Option: loglevel
# Notes.: Set the log level output.
# 1 = ERROR
# 2 = WARN
# 3 = INFO
# 4 = DEBUG
# Values: NUM Default: 3
#
loglevel = 3
= fail2ban の起動
* 以下のコマンドで fail2ban を起動した.
# /etc/init.d/fail2ban start
* fail2ban が動いているか確認した.
# /etc/init.d/fail2ban status
Status of authentication failure monitor:fail2ban is running.
= 動作テスト
== ssh
* 情報実験機から, 存在しないユーザ名で tako に ssh を行い, 動作をチェックした.
$ ssh zzzcd@133.30.109.21
zzzcd@133.30.109.21's password:
Permission denied, please try again.
(これを繰り返した)
* maxretry 回目には接続が切られ, 何も表示されなくなる. tako で iptables -L をして, リストに加えられているかを確認した.
root@tako-itpass:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- anywhere anywhere
multiport dports ssh
(省略)
Chain fail2ban-ssh (1 references)
target prot opt source destination
DROP all ― <133.30.109.77> anywhere <-- これ
RETURN all -- anywhere anywhere
* fail2ban のログに記録されているか確認した. 以下のような警告がログ /var/log/fail2ban.log に記載されていればよい.
2014-11-12 18:21:24,956 fail2ban.actions: WARNING [ssh] Ban <133.30.109.77>
2012-11-02 15:31:25,646 fail2ban.actions: WARNING [ssh] Unban <133.30.109.77>
== apache
*/usr/local/apache2/conf/extra/httpd-vhosts.confの中身のログレベルを
infoにしておく
<IfModule mod_rewrite.c>
…
…
LogLevel info
* 正規表現の書き換え
* apache-auth.conf, apache-common.conf, apache-nohome.conf, apache-noscript.conf, apache-overflows.conf の中身を以下のように書き換えた:
* /etc/fail2ban/filter.d/apache-auth.conf
failregex = ^%(_apache_error_client)s (AH(01797|01630): )?client denied by server configuration: (uri )?\S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01617: )?user .*? authentication failure for "\S*": Password Mismatch(, referer: \S+)?$
^%(_apache_error_client)s (AH01618: )?user .*? not found(:)?\S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01614: )?client used wrong authentication scheme: \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH\d+: )?Authorization of user \S+ to access \S* failed, reason: .*$
^%(_apache_error_client)s (AH0179[24]: )?(Digest: )?user .*?: password mismatch: \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH0179[01]: |Digest: )user `.*?' in realm `.+' (not found|denied by provider): \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01631: )?user .*?:authorization failure for "\S*":(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01775: )?(Digest: )?invalid nonce .* received - length is not \S+(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01788: )?(Digest: )?realm mismatch - got `.*?' but expected `.+'(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01789: )?(Digest: )?unknown algorithm `.*?' received: \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01793: )?invalid qop `.*?'received: \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01777: )?(Digest: )?invalidnonce .*? received - user attempted time travel(, referer: \S+)?\s*$
^<HOST> -.*GET.*
* /etc/fail2ban/filter.d/apache-common.conf
_apache_error_client = \[[^]]*\] \[(:?error|\S+:\S+)\]( \[pid \d+(:\S+\d+)?\])? \[client <HOST>(:\d{1,5})?\]
* /etc/fail2ban/filter.d/apache-nohome.conf
failregex = ^%(_apache_error_client)s (AH00128: )?File does not exist:
* /etc/fail2ban/filter.d/apache-noscript.conf
failregex = ^%(_apache_error_client)s ((AH001(28|30): )?File does not exist|(AH01264: )?script not found or unable to stat):/\S*(php([45]|[.-]cgi)?|\.asp|\.exe|\.pl)(, referer: \S+)?\s*$
^%(_apache_error_client)s script'/\S*(php([45]|[.-]cgi)?|\.asp|\.exe|\.pl)\S*' not found or unable to stat(, referer: \S+)?\s*$
* /etc/fail2ban/filter.d/apache-overflows.conf
failregex = ^%(_apache_error_client)s ((AH0013[456]: )?Invalid
(method|URI) in request .*( - possible attempt to establish SSL
connection on non-SSL port)?|(AH00565: )?request failed: URI too long
\(longer than \d+\)|request failed: erroneous characters after protocol
string: .*|AH00566: request failed: invalid characters in URI)(,referer: \S+)?$
=== error のテスト
* fail2ban を再起動し, ブラウザを立ち上げ, tako-itpass.scitec.kobe-u.ac.jp/ 以下 の others にパーミッションがないところ, (例えば ITPASS 実習の ppt/odp ファイル) や itpass ドメイン以下の実在しない URL を入力して, findtime 以内に maxretry 回以上アクセスした.
* runtime error になれば良い.
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認した.
=== access のテスト
* ブラウザから tako-itpass.scitec.kobe-u.ac.jp 以下のファイルに findtime 以内に maxretry 回更新した.
* runtime error になれば良い.
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認した.
* 確認できたら変更した変数の値をもとに戻して fail2ban を再起動した.
= 挙動がシステムログメールに記載されるように設定
== スクリプトの設置
* ((<URL:../server/2012/system_report/loginfail>)) を tako の /etc/cron.local/daily/800_loginfail にコピーされていることを確認した.
== fail2ban の動作確認
* fail2ban のフィルターの動作確認をした.
# fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
* 表示内容を確認し, フィルターにかかっていることを確認した.
* fail2ban をインストールした.
$ sudo -s
# apt-get update
# apt-get install fail2ban
* iptables -L でインストールされたことを確認した. 以下のように fail2banの記述が表示されていればよい.
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- anywhere anywhere
multiport dports ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain fail2ban-ssh (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
= 設定ファイルの編集
* fail2ban の設定ファイルは, /etc/fail2ban/jail.conf である.以下に設定の一部を抜粋し, 書き換えた.
== ssh
ssh に関する設定を以下のようにを書き換えた.
destemail = root@localhost
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
== apache
apache に関する設定を以下のようにを書き換えた.
[apache]
enabled = true
port = http,https
filter = apache-auth
findtime= 60
logpath = /var/log/httpd-*error.log
maxretry = 60
bantime = 1200
# default action is now multiport, so apache-multiport jail was left
# for compatibility with previous (<0.7.6-2) releases
[apache-multiport]
enabled = true
port = http,https
filter = apache-auth
findtime = 10
logpath = /var/log/httpd-*error.log
maxretry = 60
bantime = 1200
= failregex の追加
== apache
* /etc/fail2ban/filter.d/apache-auth.conf の failregex を以下のように編集した.
failregex = [[]client <HOST>[]] user .* authentication failure
[[]client <HOST>[]] user .* not found
[[]client <HOST>[]] user .* password mismatch
[[]client <HOST>[]] (13)Permission denied:
[[]client <HOST>[]] File does not exist:
^<HOST> -.*GET.*
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex = ^<HOST> -.*GET.*(jpg|jpeg|gif|png).*
== ssh
* /etc/fail2ban/filter.d/sshd.conf の failregex を編集し, 以下の1行を追記した.
^%(__prefix_line)s .* [[]<HOST>[]] .* POSSIBLE BREAK-IN ATTEMPT!\s*$
= ログレベルの確認
* /etc/fail2ban/fail2ban.conf の中のログレベルが 3 になっていることを確認した.
* ban, unban の記録がログに出力されるレベル
# Option: loglevel
# Notes.: Set the log level output.
# 1 = ERROR
# 2 = WARN
# 3 = INFO
# 4 = DEBUG
# Values: NUM Default: 3
#
loglevel = 3
= fail2ban の起動
* 以下のコマンドで fail2ban を起動した.
# /etc/init.d/fail2ban start
* fail2ban が動いているか確認した.
# /etc/init.d/fail2ban status
Status of authentication failure monitor:fail2ban is running.
= 動作テスト
== ssh
* 情報実験機から, 存在しないユーザ名で tako に ssh を行い, 動作をチェックした.
$ ssh zzzcd@133.30.109.21
zzzcd@133.30.109.21's password:
Permission denied, please try again.
(これを繰り返した)
* maxretry 回目には接続が切られ, 何も表示されなくなる. tako で iptables -L をして, リストに加えられているかを確認した.
root@tako-itpass:~# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
fail2ban-ssh tcp -- anywhere anywhere
multiport dports ssh
(省略)
Chain fail2ban-ssh (1 references)
target prot opt source destination
DROP all ― <133.30.109.77> anywhere <-- これ
RETURN all -- anywhere anywhere
* fail2ban のログに記録されているか確認した. 以下のような警告がログ /var/log/fail2ban.log に記載されていればよい.
2014-11-12 18:21:24,956 fail2ban.actions: WARNING [ssh] Ban <133.30.109.77>
2012-11-02 15:31:25,646 fail2ban.actions: WARNING [ssh] Unban <133.30.109.77>
== apache
*/usr/local/apache2/conf/extra/httpd-vhosts.confの中身のログレベルを
infoにしておく
<IfModule mod_rewrite.c>
…
…
LogLevel info
* 正規表現の書き換え
* apache-auth.conf, apache-common.conf, apache-nohome.conf, apache-noscript.conf, apache-overflows.conf の中身を以下のように書き換えた:
* /etc/fail2ban/filter.d/apache-auth.conf
failregex = ^%(_apache_error_client)s (AH(01797|01630): )?client denied by server configuration: (uri )?\S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01617: )?user .*? authentication failure for "\S*": Password Mismatch(, referer: \S+)?$
^%(_apache_error_client)s (AH01618: )?user .*? not found(:)?\S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01614: )?client used wrong authentication scheme: \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH\d+: )?Authorization of user \S+ to access \S* failed, reason: .*$
^%(_apache_error_client)s (AH0179[24]: )?(Digest: )?user .*?: password mismatch: \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH0179[01]: |Digest: )user `.*?' in realm `.+' (not found|denied by provider): \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01631: )?user .*?:authorization failure for "\S*":(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01775: )?(Digest: )?invalid nonce .* received - length is not \S+(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01788: )?(Digest: )?realm mismatch - got `.*?' but expected `.+'(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01789: )?(Digest: )?unknown algorithm `.*?' received: \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01793: )?invalid qop `.*?'received: \S*(, referer: \S+)?\s*$
^%(_apache_error_client)s (AH01777: )?(Digest: )?invalidnonce .*? received - user attempted time travel(, referer: \S+)?\s*$
^<HOST> -.*GET.*
* /etc/fail2ban/filter.d/apache-common.conf
_apache_error_client = \[[^]]*\] \[(:?error|\S+:\S+)\]( \[pid \d+(:\S+\d+)?\])? \[client <HOST>(:\d{1,5})?\]
* /etc/fail2ban/filter.d/apache-nohome.conf
failregex = ^%(_apache_error_client)s (AH00128: )?File does not exist:
* /etc/fail2ban/filter.d/apache-noscript.conf
failregex = ^%(_apache_error_client)s ((AH001(28|30): )?File does not exist|(AH01264: )?script not found or unable to stat):/\S*(php([45]|[.-]cgi)?|\.asp|\.exe|\.pl)(, referer: \S+)?\s*$
^%(_apache_error_client)s script'/\S*(php([45]|[.-]cgi)?|\.asp|\.exe|\.pl)\S*' not found or unable to stat(, referer: \S+)?\s*$
* /etc/fail2ban/filter.d/apache-overflows.conf
failregex = ^%(_apache_error_client)s ((AH0013[456]: )?Invalid
(method|URI) in request .*( - possible attempt to establish SSL
connection on non-SSL port)?|(AH00565: )?request failed: URI too long
\(longer than \d+\)|request failed: erroneous characters after protocol
string: .*|AH00566: request failed: invalid characters in URI)(,referer: \S+)?$
=== error のテスト
* fail2ban を再起動し, ブラウザを立ち上げ, tako-itpass.scitec.kobe-u.ac.jp/ 以下 の others にパーミッションがないところ, (例えば ITPASS 実習の ppt/odp ファイル) や itpass ドメイン以下の実在しない URL を入力して, findtime 以内に maxretry 回以上アクセスした.
* runtime error になれば良い.
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認した.
=== access のテスト
* ブラウザから tako-itpass.scitec.kobe-u.ac.jp 以下のファイルに findtime 以内に maxretry 回更新した.
* runtime error になれば良い.
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認した.
* 確認できたら変更した変数の値をもとに戻して fail2ban を再起動した.
= 挙動がシステムログメールに記載されるように設定
== スクリプトの設置
* ((<URL:../server/2012/system_report/loginfail>)) を tako の /etc/cron.local/daily/800_loginfail にコピーされていることを確認した.
== fail2ban の動作確認
* fail2ban のフィルターの動作確認をした.
# fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
* 表示内容を確認し, フィルターにかかっていることを確認した.