IT pass HikiWiki - [Memo2021][ITPASS]fail2ban のインストールと設定 Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
{{toc}}
[((<[ITPASS2020]2020年度サーバ構築マニュアル>)) へ戻る]
= 概要
サーバへの不正アクセスを減らすため, fail2ban のインストールと設定を行う.
= fail2ban のインストール
$ sudo -s
# apt-get update
# apt-get install fail2ban
iptables -L でインストールされたことを確認する.
# iptables -L
以下のように fail2ban の記述が表示される.
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
= 設定ファイルの編集
fail2ban の設定ファイルは, /etc/fail2ban/jail.conf である.
以下の通り設定ファイルを編集する.
== ssh
ssh に関する設定を以下のように追記する.
enabled が true になっているとサービスが実行される. false は実行されない.
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
* ignoreip: 不正アクセスとして扱わないアクセス元を指定.
* bantime: 不正アクセスと認めたときに, アクセスを何秒遮断するか指定.
* findtime, maxretry: findtime 秒間のうちに maxretry 回失敗すると不正アクセスとみなされる.
* destemail: 不正アクセスが認められたときのメールの送り先.
* logpath: 監視をするログの場所を指定する.
== apache
apache に関する設定を以下のようにを書き換える.
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
findtime = 60
logpath = /var/log/httpd-*error.log
maxretry = 60
bantime = 1200
また以下を追記する.
[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
[apache-ddos]
enabled = true
port = http,https
filter = apache-ddos
findtime= 10
logpath = /var/log/httpd-*access.log
maxretry = 60
bantime = 1200
apache ではエラーログを, apache-multiport ではアクセスログを監視する.
findtime, maxretry については, このぐらいが妥当と思われるが要請などがあれば適宜変えていくこと.
= failregex の追加
== apache
* /etc/fail2ban/filter.d/apache-auth.conf の failregex を以下のように編集する.
* failregex を設定すると, その設定に対応したログのメッセージをカウントし, findtime 以内に maxretry 回, 同じ IP アドレスからのメッセージがカウントされるとその IP アドレスからのアクセスが ban される.
* ignoreregex は failregex で設定したもののうち, カウントしたくないメッセージがある場合に設定する.
* failregex の最後の行は access ログを監視するための構文である.
* access ログは error ログとはメッセージの書式が異なるので, その上の 5 つとは書き方が異なる.
* 1 つの html ページに画像がたくさん貼付けてあるとそれだけでカウントして ban してしまうことがある. そのため, png, jpg(jpeg), gif ファイルについては ignoreregex に追加している.
apache-auth.conf, apache-common.conf, apache-nohome.conf, apache-noscript.conf, apache-overflows.conf の中身を以下のように書き換える.
* /etc/fail2ban/filter.d/apache-auth.conf, apache-ddos.conf
/etc/fail2ban/filter.d/apache-auth.conf を /etc/fail2ban/filter.d/apache-ddos.conf にコピーする.
# cp /etc/fail2ban/filter.d/apache-auth.conf /etc/fail2ban/filter.d/apache-ddos.conf
/etc/fail2ban/filter.d/apache-ddos.conf を以下のように書き換える.
failregex =^<HOST> -.*GET.*
ignoreregex = \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)
/etc/fail2ban/filter.d/apache-auth.conf を以下のように書き換える.
1 行目と最終行に変更点がある.
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*$
ignoreregex = ^<HOST> -.*GET.*(jpg|jpeg|gif|png).*
(12/09) apache-auth.conf, apache-ddos.conf に変更を加えた. 変更内容については URL 先のログを参照せよ.
((<[Memo2021][ITPASS]サーバ交換作業 (Mail)>))
* /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+)?$
== ssh
* /etc/fail2ban/filter.d/sshd.conf の failregex を編集する.
* 以下の 1 行を追記する.
^%(__prefix_line)s[iI] .* [[]<HOST>[]] .* POSSIBLE BREAK-IN ATTEMPT\s*S
= ログレベルの確認
* /etc/fail2ban/fail2ban.conf の中のログレベルを確認する.
(デフォルトになっているはずなので, 作業する必要はないが, 確認しておくこと)
* ban, unban の記録がログに出力されるレベル
# Option: loglevel
# Notes.: Set the log level output.
# CRITICAL
# ERROR
# WARNING
# NOTICE
# INFO
# DEBUG
# Values: [ LEVEL ] Default: ERROR
#
loglevel = INFO
= fail2ban の起動
以下のコマンドで fail2ban を起動する.
# systemctl start fail2ban
fail2ban が動いているか確認する.
# systemctl status fail2ban
* サービスの停止・開始・再起動は ((<[ITPASS2011a]サービスの開始・停止>)) を参照のこと.
= 動作テスト
== ssh
johoXX から, 存在しないユーザ名で tako に ssh を行い, 動作をチェックを行う.
$ ssh hoge@10.35.19.XXX <-- tako のプライベート IP アドレス
Permission denied (Publickey).
(これを繰り返す)
maxretry 回目には接続が切られ,
hoge@johoXX-itpass:~$ ssh hoge@10.35.19.XXX
ssh: connect to host 10.35.19.XXX port 22: Connection refused
とメッセージが届く.
tako で iptables -L をして, リストに加えられているかを確認する.
Chain INPUT (policy ACCEPT)
target prot opt source destination
f2b-ssh tcp -- anywhere anywhere multiport dports ssh
f2b-sshd 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 f2b-ssh (1 references)
target prot opt source destination
REJECT all -- tako-itpass anywhere reject-with icmp-port- unreachable
RETURN all -- anywhere anywhere
Chain f2b-sshd (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
fail2ban のログに記録されているか確認する. 以下のような警告がログ /var/log/fail2ban.log に記載される.
2021-11-04 13:03:20,046 fail2ban.actions [48859]: NOTICE [ssh] Ban 10.35.19.151
=== error のテスト
* fail2ban を再起動する.
# /etc/init.d/fail2ban restart
* ブラウザを立ち上げ, johoXX から
10.35.19.XXX/hoge
を入力して, findtime 以内に maxretry 回以上アクセスする.
今回は
$ wget http://10.35.19.XXX/hoge
と打ち込んだ.
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認する.
Chain f2b-apache-ddos (1 references)
target prot opt source destination
REJECT all -- 10.35.19.XXX anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere
* /var/log/fail2ban.log についても確認する.
2018-11-14 14:59:52,066 fail2ban.actions [4034]: NOTICE [apache-ddos] Ban 10.35.19.XXX
(11/04) 今のところうまく確認できていない.
(11/08) findtime を 600, maxretry の値を 6 にしたところ, テストがうまくいった.
(11/24) サーバー交換後にテストを行なったところ, うまく確認できなかった.
(12/09) fail2ban が動作することを確認した.
. 具体的な問題の対処法については, 以下の URL 先のログに書いている.
[((<[Memo2021][ITPASS]サーバ交換作業 (Mail)>))]
((<[Memo2021][ITPASS]サーバ交換作業 (Mail)>))
=== access のテスト
* ブラウザから tako-itpass.scitec.kobe-u.ac.jp 以下のファイルに findtime 以内に maxretry 回更新する.
10.35.19.XXX/test
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認する.
Chain f2b-apache-ddos (1 references)
target prot opt source destination
REJECT all -- 10.35.19.XXX anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere
* /var/log/fail2ban.log についても確認する.
2018-11-14 15:06:52,767 fail2ban.actions [4034]: NOTICE [apache-ddos] Ban 10.35.19.XXX
(11/04) 今のところうまく確認できていない. findtime と maxretry の値を変更したところ, 検知はされているようだが IP アドレスが ban されない.
(11/08) findtime を 600, maxretry の値を 6 にしたところ, テストがうまくいった.
(11/24) サーバー交換後にテストを行なったところ, うまく確認できなかった.
(12/09) fail2ban が動作することを確認した. 具体的な問題の対処法については, URL 先のログに書いている.
((<[Memo2021][ITPASS]サーバ交換作業 (Mail)>))
= 挙動がシステムログメールに記載されるように設定
== スクリプトの設置
* ika の ~itpass/ftp/server/2011/system_report/loginfail が tako の /etc/cron.local/daily/800_loginfail にコピーされていることを確認する.
== テスト
* 情報実験機など (固定IPが望ましい) から maxretry 回, 存在しない名前でログインして ban されたことを確認する (同じ日に ssh でテストしているならこの作業はしなくてよい).
* 次の日のメールのシステムログに出力されていることを確認する.
== fail2ban の動作確認
* fail2ban のフィルターの動作確認を行う.
# fail2ban-regex --print-all-missed /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
* 表示内容を確認し, フィルターにかかっていることを確認する.
= 参考
* ((<[ITPASS2017]fail2ban のインストールと設定>))
* ((<Debian clusters|URL:http://debianclusters.org/index.php/Fail2Ban:_Preventing_Brute_Force_SSH>))
* ((<THE ART OF WEB|URL:http://www.the-art-of-web.com/system/logs/>))
* ((<fail2ban wiki|URL:http://www.fail2ban.org/wiki/index.php/Talk:Apache>))
* ((<[ITPASS2012]サービスの開始・停止>))
[((<[ITPASS2020]2020年度サーバ構築マニュアル>)) へ戻る]
#(12/02) サーバー交換作業時に発生した fail2ban のエラーとファイルの設定に関する現状報告
#11/24 のサーバー交換作業で fail2ban の動作テストが上手くいかなかった.
#原因を追求するにあたり, appache-ddos.conf のファイルの中身が 本ログに書いてあることと異なるとの指摘があった.
#しかし, 自身で apache-ddos.conf を確認したところ, ファイルの内容は本ログの通りであった.
#ただし, 本ログにおいて apache-ddos.conf の編集の項目が 昨年のマニュアルと異なり, 2018 年以前のマニュアルと同じであった.
#つまり, 本年度の作業では apache-ddos.conf の編集を 2018 年度と同様に行なったことになる.
#昨年のマニュアルに従わなかった理由については定かではない.
#2021/12/02 時点での apache-ddos.conf の内容は次の通りである.
#* apache-ddos.conf
## Fail2Ban apache-auth filter
##
#
#[INCLUDES]
#
## Read common prefixes. If any customizations available -- read them from
## apache-common.local
#before = apache-common.conf
#
#[Definition]
#
## Mode for filter: normal (default) and aggressive (allows DDoS & brute force detection of mod_evasive)
#mode = normal
## ignore messages of mod_evasive module:
#apache-pref-ign-normal = (?!evasive)
## allow "denied by server configuration" from all modules:
#apache-pref-ign-aggressive =
## mode related ignore prefix for common _apache_error_client substitution:
#apache-pref-ignore = <apache-pref-ign-<mode>>
#prefregex = ^%(_apache_error_client)s (?:AH\d+: )?<F-CONTENT>.+</F-CONTENT>$
## auth_type = ((?:Digest|Basic): )?
#auth_type = ([A-Z]\w+: )?
#failregex =^<HOST> -.*GET.*
#ignoreregex = \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)
#(12/08) ファイル設定 (apache-auth.conf, apache-ddos.conf) の経緯に関する報告
#2020 年のマニュアルを参照したところ, apache-auth.conf 及び apache-ddos.conf のファイルを新しく作成する, との記述があった.
#しかし, 本作業をする時点で apache-auth.conf のファイルが既に存在していた.
#既に存在するファイルをどうすればよいか先輩方に相談をした結果, 該当部分だけ 2018 年の作業を参考に行うことになった.
#サーバー交換作業時に発生したエラーに関して, 2020 年のマニュアルのコメントアウトに同様の問題への対処が記述されていたため, この部分を参考に該当ファイルを再作成することで問題が解決するかもしれない.
[((<[ITPASS2020]2020年度サーバ構築マニュアル>)) へ戻る]
= 概要
サーバへの不正アクセスを減らすため, fail2ban のインストールと設定を行う.
= fail2ban のインストール
$ sudo -s
# apt-get update
# apt-get install fail2ban
iptables -L でインストールされたことを確認する.
# iptables -L
以下のように fail2ban の記述が表示される.
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
= 設定ファイルの編集
fail2ban の設定ファイルは, /etc/fail2ban/jail.conf である.
以下の通り設定ファイルを編集する.
== ssh
ssh に関する設定を以下のように追記する.
enabled が true になっているとサービスが実行される. false は実行されない.
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
* ignoreip: 不正アクセスとして扱わないアクセス元を指定.
* bantime: 不正アクセスと認めたときに, アクセスを何秒遮断するか指定.
* findtime, maxretry: findtime 秒間のうちに maxretry 回失敗すると不正アクセスとみなされる.
* destemail: 不正アクセスが認められたときのメールの送り先.
* logpath: 監視をするログの場所を指定する.
== apache
apache に関する設定を以下のようにを書き換える.
[apache-nohome]
enabled = true
port = http,https
filter = apache-nohome
findtime = 60
logpath = /var/log/httpd-*error.log
maxretry = 60
bantime = 1200
また以下を追記する.
[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
[apache-ddos]
enabled = true
port = http,https
filter = apache-ddos
findtime= 10
logpath = /var/log/httpd-*access.log
maxretry = 60
bantime = 1200
apache ではエラーログを, apache-multiport ではアクセスログを監視する.
findtime, maxretry については, このぐらいが妥当と思われるが要請などがあれば適宜変えていくこと.
= failregex の追加
== apache
* /etc/fail2ban/filter.d/apache-auth.conf の failregex を以下のように編集する.
* failregex を設定すると, その設定に対応したログのメッセージをカウントし, findtime 以内に maxretry 回, 同じ IP アドレスからのメッセージがカウントされるとその IP アドレスからのアクセスが ban される.
* ignoreregex は failregex で設定したもののうち, カウントしたくないメッセージがある場合に設定する.
* failregex の最後の行は access ログを監視するための構文である.
* access ログは error ログとはメッセージの書式が異なるので, その上の 5 つとは書き方が異なる.
* 1 つの html ページに画像がたくさん貼付けてあるとそれだけでカウントして ban してしまうことがある. そのため, png, jpg(jpeg), gif ファイルについては ignoreregex に追加している.
apache-auth.conf, apache-common.conf, apache-nohome.conf, apache-noscript.conf, apache-overflows.conf の中身を以下のように書き換える.
* /etc/fail2ban/filter.d/apache-auth.conf, apache-ddos.conf
/etc/fail2ban/filter.d/apache-auth.conf を /etc/fail2ban/filter.d/apache-ddos.conf にコピーする.
# cp /etc/fail2ban/filter.d/apache-auth.conf /etc/fail2ban/filter.d/apache-ddos.conf
/etc/fail2ban/filter.d/apache-ddos.conf を以下のように書き換える.
failregex =^<HOST> -.*GET.*
ignoreregex = \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)
/etc/fail2ban/filter.d/apache-auth.conf を以下のように書き換える.
1 行目と最終行に変更点がある.
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*$
ignoreregex = ^<HOST> -.*GET.*(jpg|jpeg|gif|png).*
(12/09) apache-auth.conf, apache-ddos.conf に変更を加えた. 変更内容については URL 先のログを参照せよ.
((<[Memo2021][ITPASS]サーバ交換作業 (Mail)>))
* /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+)?$
== ssh
* /etc/fail2ban/filter.d/sshd.conf の failregex を編集する.
* 以下の 1 行を追記する.
^%(__prefix_line)s[iI] .* [[]<HOST>[]] .* POSSIBLE BREAK-IN ATTEMPT\s*S
= ログレベルの確認
* /etc/fail2ban/fail2ban.conf の中のログレベルを確認する.
(デフォルトになっているはずなので, 作業する必要はないが, 確認しておくこと)
* ban, unban の記録がログに出力されるレベル
# Option: loglevel
# Notes.: Set the log level output.
# CRITICAL
# ERROR
# WARNING
# NOTICE
# INFO
# DEBUG
# Values: [ LEVEL ] Default: ERROR
#
loglevel = INFO
= fail2ban の起動
以下のコマンドで fail2ban を起動する.
# systemctl start fail2ban
fail2ban が動いているか確認する.
# systemctl status fail2ban
* サービスの停止・開始・再起動は ((<[ITPASS2011a]サービスの開始・停止>)) を参照のこと.
= 動作テスト
== ssh
johoXX から, 存在しないユーザ名で tako に ssh を行い, 動作をチェックを行う.
$ ssh hoge@10.35.19.XXX <-- tako のプライベート IP アドレス
Permission denied (Publickey).
(これを繰り返す)
maxretry 回目には接続が切られ,
hoge@johoXX-itpass:~$ ssh hoge@10.35.19.XXX
ssh: connect to host 10.35.19.XXX port 22: Connection refused
とメッセージが届く.
tako で iptables -L をして, リストに加えられているかを確認する.
Chain INPUT (policy ACCEPT)
target prot opt source destination
f2b-ssh tcp -- anywhere anywhere multiport dports ssh
f2b-sshd 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 f2b-ssh (1 references)
target prot opt source destination
REJECT all -- tako-itpass anywhere reject-with icmp-port- unreachable
RETURN all -- anywhere anywhere
Chain f2b-sshd (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
fail2ban のログに記録されているか確認する. 以下のような警告がログ /var/log/fail2ban.log に記載される.
2021-11-04 13:03:20,046 fail2ban.actions [48859]: NOTICE [ssh] Ban 10.35.19.151
=== error のテスト
* fail2ban を再起動する.
# /etc/init.d/fail2ban restart
* ブラウザを立ち上げ, johoXX から
10.35.19.XXX/hoge
を入力して, findtime 以内に maxretry 回以上アクセスする.
今回は
$ wget http://10.35.19.XXX/hoge
と打ち込んだ.
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認する.
Chain f2b-apache-ddos (1 references)
target prot opt source destination
REJECT all -- 10.35.19.XXX anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere
* /var/log/fail2ban.log についても確認する.
2018-11-14 14:59:52,066 fail2ban.actions [4034]: NOTICE [apache-ddos] Ban 10.35.19.XXX
(11/04) 今のところうまく確認できていない.
(11/08) findtime を 600, maxretry の値を 6 にしたところ, テストがうまくいった.
(11/24) サーバー交換後にテストを行なったところ, うまく確認できなかった.
(12/09) fail2ban が動作することを確認した
[((<[Memo2021][ITPASS]サーバ交換作業 (Mail)>))]
((<[Memo2021][ITPASS]サーバ交換作業 (Mail)>))
=== access のテスト
* ブラウザから tako-itpass.scitec.kobe-u.ac.jp 以下のファイルに findtime 以内に maxretry 回更新する.
10.35.19.XXX/test
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認する.
Chain f2b-apache-ddos (1 references)
target prot opt source destination
REJECT all -- 10.35.19.XXX anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere
* /var/log/fail2ban.log についても確認する.
2018-11-14 15:06:52,767 fail2ban.actions [4034]: NOTICE [apache-ddos] Ban 10.35.19.XXX
(11/04) 今のところうまく確認できていない. findtime と maxretry の値を変更したところ, 検知はされているようだが IP アドレスが ban されない.
(11/08) findtime を 600, maxretry の値を 6 にしたところ, テストがうまくいった.
(11/24) サーバー交換後にテストを行なったところ, うまく確認できなかった.
(12/09) fail2ban が動作することを確認した. 具体的な問題の対処法については, URL 先のログに書いている.
((<[Memo2021][ITPASS]サーバ交換作業 (Mail)>))
= 挙動がシステムログメールに記載されるように設定
== スクリプトの設置
* ika の ~itpass/ftp/server/2011/system_report/loginfail が tako の /etc/cron.local/daily/800_loginfail にコピーされていることを確認する.
== テスト
* 情報実験機など (固定IPが望ましい) から maxretry 回, 存在しない名前でログインして ban されたことを確認する (同じ日に ssh でテストしているならこの作業はしなくてよい).
* 次の日のメールのシステムログに出力されていることを確認する.
== fail2ban の動作確認
* fail2ban のフィルターの動作確認を行う.
# fail2ban-regex --print-all-missed /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
* 表示内容を確認し, フィルターにかかっていることを確認する.
= 参考
* ((<[ITPASS2017]fail2ban のインストールと設定>))
* ((<Debian clusters|URL:http://debianclusters.org/index.php/Fail2Ban:_Preventing_Brute_Force_SSH>))
* ((<THE ART OF WEB|URL:http://www.the-art-of-web.com/system/logs/>))
* ((<fail2ban wiki|URL:http://www.fail2ban.org/wiki/index.php/Talk:Apache>))
* ((<[ITPASS2012]サービスの開始・停止>))
[((<[ITPASS2020]2020年度サーバ構築マニュアル>)) へ戻る]
#(12/02) サーバー交換作業時に発生した fail2ban のエラーとファイルの設定に関する現状報告
#11/24 のサーバー交換作業で fail2ban の動作テストが上手くいかなかった.
#原因を追求するにあたり, appache-ddos.conf のファイルの中身が 本ログに書いてあることと異なるとの指摘があった.
#しかし, 自身で apache-ddos.conf を確認したところ, ファイルの内容は本ログの通りであった.
#ただし, 本ログにおいて apache-ddos.conf の編集の項目が 昨年のマニュアルと異なり, 2018 年以前のマニュアルと同じであった.
#つまり, 本年度の作業では apache-ddos.conf の編集を 2018 年度と同様に行なったことになる.
#昨年のマニュアルに従わなかった理由については定かではない.
#2021/12/02 時点での apache-ddos.conf の内容は次の通りである.
#* apache-ddos.conf
## Fail2Ban apache-auth filter
##
#
#[INCLUDES]
#
## Read common prefixes. If any customizations available -- read them from
## apache-common.local
#before = apache-common.conf
#
#[Definition]
#
## Mode for filter: normal (default) and aggressive (allows DDoS & brute force detection of mod_evasive)
#mode = normal
## ignore messages of mod_evasive module:
#apache-pref-ign-normal = (?!evasive)
## allow "denied by server configuration" from all modules:
#apache-pref-ign-aggressive =
## mode related ignore prefix for common _apache_error_client substitution:
#apache-pref-ignore = <apache-pref-ign-<mode>>
#prefregex = ^%(_apache_error_client)s (?:AH\d+: )?<F-CONTENT>.+</F-CONTENT>$
## auth_type = ((?:Digest|Basic): )?
#auth_type = ([A-Z]\w+: )?
#failregex =^<HOST> -.*GET.*
#ignoreregex = \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)
#(12/08) ファイル設定 (apache-auth.conf, apache-ddos.conf) の経緯に関する報告
#2020 年のマニュアルを参照したところ, apache-auth.conf 及び apache-ddos.conf のファイルを新しく作成する, との記述があった.
#しかし, 本作業をする時点で apache-auth.conf のファイルが既に存在していた.
#既に存在するファイルをどうすればよいか先輩方に相談をした結果, 該当部分だけ 2018 年の作業を参考に行うことになった.
#サーバー交換作業時に発生したエラーに関して, 2020 年のマニュアルのコメントアウトに同様の問題への対処が記述されていたため, この部分を参考に該当ファイルを再作成することで問題が解決するかもしれない.