[ITPASS2010]fail2ban のインストールと設定
[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
Keyword(s):
References:[[ITPASS2010]2010年度サーバ構築ログ]