IT pass HikiWiki - [ITPASS2010]fail2ban のインストールと設定 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}
[((<ITPASSサーバ構築ドキュメント>)) へ戻る]

= 概要

サーバへの不正アクセスがたびたびあるため, その対策として fail2ban をインストールする.

= fail2ban のインストール

以下のコマンドを実行し, fail2ban をインストールする.

  $ sudo -s
  # apt-get install fail2ban

iptables -L でインストールされたことを確認する. 以下のように表示されれば OK.

root@tako-itpass:~# 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            

実際にアクセスの遮断を行うのは iptables というコマンドである. ただ, いちいち iptables コマンドを使って設定するのはめんどくさいので, 設定ファイルをもちいて管理できるようにしたのが fail2ban である. iptables でどのようなことができるかを, 一度 man で見てみると良いだろう.

= ssh に関する設定

fail2ban の設定ファイルは, /etc/fail2ban/jail.conf である.
以下は, 設定の一部抜粋を記載している.

ファイルの ssh に関する設定を以下のようにを書き換える.
enabled が true になっているとサービスが実行される. false は実行されない.

destemail = root@localhost

[ssh]
enabled = true
port    = ssh
filter  = sshd
logpath  = /var/log/auth.log
maxretry = 4

* ignoreip: 不正アクセスとして扱わないアクセス元を指定.
* bantime: 不正アクセスと認めたときに, アクセスを何秒遮断するか指定.
* findtime, maxretry: findtime 秒間のうちに maxretry 回失敗すると不正アクセスとみなされる.
* destemail: 不正アクセスが認められたときのメールの送り先.
* logpath: 監視をするログの場所を指定する

== fail2ban を起動する

以下のコマンドで fail2ban を起動する

  # /etc/init.d/fail2ban start

fail2ban が動いているか確認する

# /etc/init.d/fail2ban status
Status of authentication failure monitor:fail2ban is running.

(参考)サービスの停止・開始・再起動は以下のように行う
# /etc/init.d/fail2ban stop
Stopping fail2ban: .done
# /etc/init.d/fail2ban start
Starting fail2ban: .done
# /etc/init.d/fail2ban restart

== ssh の動作テスト

情報実験機など (固定 IP が望ましい) から, 存在しないユーザ名で tako に ssh を行い, 動作をチェックする.

takahasu@joho04-itpass:~$ ssh hoge@133.30.109.21
Permission denied (publickey).
takahasu@joho04-itpass:~$ ssh hogege@133.30.109.21
Permission denied (publickey).
(省略)
takahasu@joho04-itpass:~$ ssh hogegegegegege@133.30.109.21
ssh: connect to host 133.30.109.21 port 22: Connection timed out

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  --  joho04-itpass.scitec.kobe-u.ac.jp  anywhere <-- これ          
RETURN     all  --  anywhere             anywhere            

fail2ban のログに記録されているか確認する. 以下のような警告がログ /var/log/fail2ban.log に記載されていればよい.

2011-08-09 18:58:09,132 fail2ban.actions: WARNING [ssh] Ban 133.30.110.204

= 挙動がシステムログメールに記載されるように設定

== スクリプトの設置

* ika の ~itpass/ftp/server/2010/system_report/loginfail を tako の /etc/cron.local/daily/800_loginfail にコピーする.
      
== テスト

* 情報実験機など (固定IPが望ましい) から maxretry 回, 存在しない名前でログインして ban されたことを確認する (同じ日に ssh でテストしているならこの作業はしなくてよい).
* 次の日のメールのシステムログに出力されていることを確認する.
/etc/cron.local/daily/800_loginfail:
**** tako-itpass.scitec.kobe-u.ac.jp login failures ****

**** tako-itpass.scitec.kobe-u.ac.jp Ban/Unban reports ****
2011-09-02 18:59:38,138 fail2ban.actions: WARNING [ssh] Ban 133.30.110.204
2011-09-02 19:09:38,154 fail2ban.actions: WARNING [ssh] Unban 133.30.110.204

= apache に関する設定

== 設定ファイルの書き換え

* /etc/fail2ban/jail.conf の apache に関する設定を以下のように書き換える.

[apache]

enabled = true
port    = http,https
filter  = apache-auth
findtime= 60
logpath = /var/log/httpd-error.log
maxretry = 30
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-access.log
maxretry  = 30
bantime  = 1200

apache ではエラーログを, apache-multiport ではアクセスログを監視する.

findtime, maxretry については, このぐらいが妥当と思われるが要請などがあれば適宜変えていくこと.

== failregex の追加

* /etc/fail2ban/filter.d/apache-auth.conf の failregex を以下のように編集する.
  * failregex を設定すると, その設定に対応したログのメッセージをカウントし, findtime 以内に maxretry 回, 同じ IP アドレスからのメッセージがカウントされるとその IP アドレスからのアクセスが ban される.
  * ignoreregex は 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).*

* failregex の最後の行は access ログを監視するための構文である.
  * access ログは error ログとはメッセージの書式が異なるので, その上の 5 つとは書き方が異なる.
* 1 つの html ページに画像がたくさん貼付けてあるとそれだけでカウントして ban してしまうことがある. そのため, png, jpg(jpeg), gif ファイルについては ignoreregex に追加している.

== 動作テスト

* 動作が確認しやすいように findtime や maxretry, 画像ファイルにアクセスしてテストする場合は ignoreregex の値を適宜変更すること.
* 固定 IP の計算機から行うことを推奨する.
  * DHCP からする時は, 他の人が接続していないか確認すること.

=== error のテスト

* fail2ban を再起動し, ブラウザを立ち上げ, tako-itpass.scitec.kobe-u.ac.jp/ 以下の others にパーミッションがないところ, (例えば ITPASS 実習の ppt/odp ファイル) や itpass ドメイン以下の実在しない URL を入力して, findtime 以内に maxretry 回以上アクセスする.
  ((* 単なる itpass ではなく直接 tako にアクセスすること(URL に 133.30.109.21 と入力してもOK) *))
* runtime error になれば OK.
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認する.

=== access のテスト

* ブラウザから tako-itpass.scitec.kobe-u.ac.jp 以下のファイルに findtime 以内に maxretry 回更新する.
* runtime error になれば OK.
* iptables -L を見て, アクセスした IP アドレスが ban されていることを確認する.

((*確認できたら変更した変数の値をもとに戻して fail2ban を再起動すること*))

= 補足

* /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

= 参考

* ((<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>))

[((<ITPASSサーバ構築ドキュメント>)) へ戻る]