IT pass HikiWiki - [Memo2011][ITPASS]fail2ban のインストール Diff

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

{{toc}}


= 概要

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

= tako 編
== fail2ban のインストール

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

  $ sudo -s
  # apt-get install fail2ban


== 設定ファイルを確認する

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

  # "ignoreip" can be an IP address, a CIDR mask or a DNS host
  ignoreip = 127.0.0.1
  bantime  = 600
  findtime = 600
  maxretry = 3

  # Destination email address used solely for the interpolations in
  # jail.{conf,local} configuration files.
  destemail = root@localhost

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


== fail2ban を起動する

  # /etc/init.d/fail2ban start


== テスト

TeraTarm から架空のアカウントでログインしようとしたところ,
5 回失敗すると接続が切られ, 以下のメッセージが表示された.

  現在のステージでは想定外の SSH2 メッセージ (1) です.
  (5) サーバに次の理由で切断されました
  "Too many authentication failures for hoge".

上記の作業を 5 回行い, さらに同じアカウントで 3 回ログインしようとしたところ,
端末の画面が真っ白になり接続が切られた.
その後, 10 分間は同じ IP アドレスからは接続できなくなった.

/var/log/fail2ban.log を確認すると, 以下の記述が書かれていた.

  2011-08-05 14:35:32,402 fail2ban.actions: WARNING [ssh] Ban 133.30.109.48

不正アクセスが Ban されると, root 宛にメールが送られてくるはずだがなぜかできない...
後に設定を行った.

10 分後, 接続ができなくなっていた IP アドレスからの接続が可能になった.
/var/log/fail2ban.log を確認すると, 以下の記述が書かれていた.

  2011-08-05 14:45:32,418 fail2ban.actions: WARNING [ssh] Unban 133.30.109.48



== 設定の変更

不正アクセスが Ban された際に email が送られるように設定する.

/etc/fail2ban/jail.conf の [ssh] の欄に以下の記述を追記した.

  [ssh]

  action = iptables[name=SSH, port=ssh, protocol=tcp]
           sendmail-whois[name=SSH, dest=root, sender=tako-itpass@localhost]

テストと同じ作業を行ったが, メールが送られてこない...
そこで, Ban / Unban の動作がシステムログメールに記載されるように設定を行った.

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

=== スクリプトを作成

今回は, すでにある ((<800_loginfail|URL:https://itpass.scitec.kobe-u.ac.jp/server/2010/system_report/loginfail>)) に以下の記述を追記した.

  # Show Ban/Unban IP addresses
  #
  yesterday2=`date "+%Y-%m-%d" --date "1 days ago"`

  /bin/echo -e "**** `hostname -f` Ban/Unban reports ****"

  lv $LOG/fail2ban.log | grep $yesterday2 | grep WARNING

  /bin/echo -e ""


=== スクリプトの設置

作成したスクリプトをすでにある /etc/cron.local/daily/800_loginfail と置き換えた.


=== テスト

情報実験機などから tako-itpass に存在しないアカウント名を使ってアタックした.
すると /var/log/fail2ban.log に以下の記述が書かれた.

  2011-08-31 15:37:44,864 fail2ban.actions: WARNING [ssh] Ban 133.30.110.209
  2011-08-31 15:47:44,884 fail2ban.actions: WARNING [ssh] Unban 133.30.110.209

上記の内容が, 翌日の tako のシステムログメールにも書かれていることを確認した.



= ika 編

2011/08/09 に fail2ban を ika-itpass にインストールを行った. 作業者・ロガー: 高橋由実子

== インストール

* apt-get でインストールした

root@ika-itpass:~# apt-get install fail2ban

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

root@ika-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            

== 設定ファイルの変更

/etc/fail2ban/fail2ban.conf を設定する.
設定ファイルのもとを残しておくために, jail.local をつくってコピーし, local のほうのファイルの設定を変える.

root@ika-itpass:~# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

jail.local を見てみる
ファイルを以下の部分を書き換える
destemail = itpadmin@localhost

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

ika では sendmail ではなく qmail を使っているが, 調べてみても mta を qmail に書き換える, などのドキュメントが
見つからなかったため, そのままにしている.

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

* ((*現在は (いろいろあって) local はバックアップ (jail.conf.bk) として, 結局jail.conf を直接読むようにしている. *))

== 接続テスト

情報実験機より, 存在しないユーザ名で ika に ssh を行った.

takahasu@joho04-itpass:~$ ssh hoge@133.30.109.22
The authenticity of host '133.30.109.22 (133.30.109.22)' can't be established.
RSA key fingerprint is c2:82:8e:fc:d0:95:3c:a5:f5:48:0f:8d:56:89:91:97.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '133.30.109.22' (RSA) to the list of known hosts.
Permission denied (publickey).
takahasu@joho04-itpass:~$ ssh hogege@133.30.109.22
Permission denied (publickey).
(省略)
takahasu@joho04-itpass:~$ ssh hogegegegegege@133.30.109.22
ssh: connect to host 133.30.109.22 port 22: Connection timed out

7 回目のログイン時に最後のように表示された. ika で ssh が ban されているか確認した.

root@ika-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            

ログに記録されているか確認した

root@ika-itpass:/var/log# lv fail2ban.log
2011-08-09 18:58:09,132 fail2ban.actions: WARNING [ssh] Ban 133.30.110.204

== daily のログに ban, unban を出力するようにする (09/03 作業)

* tako より /etc/cron.local/daily/800_loginfail をコピーし, ika のものと置き換えた.
  * 以前の 800_loginfail は 800_loginfail.bk としてバックアップ.
* joho04-itpass(133.30.110.204) より 6 回存在しない名前でログインして ban されたことを確認した.
* 次の日のログに出力されていることを確認した.
/etc/cron.local/daily/800_loginfail:
**** ika-itpass.scitec.kobe-u.ac.jp login failures ****

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

* 変更した 800_loginfail を ~itapss/ftp/server/2011/system_report/ に格納した.

== apache に関する設定

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

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

[apache]

enabled = true
port    = http,https
filter  = apache-auth
findtime= 60
logpath = /var/log/httpd-error.log
maxretry = 30
bantime  = 600

# 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  = 120

multiport の意味はよく理解していないが, 挙動を見る限り apache と同じと思われるので, apache ではエラーログを, apache-multiport ではアクセスログを監視するようにすることにした.

findtime, maxretry については, パーミッションが悪いページがある(たとえば sekki さんの Rain のあたり)ので, このぐらいが妥当と思われる. アクセスはエラーよりも緩くしてある.

=== 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.*   <-- access ログを監視するための構文
# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex = ^<HOST> -.*GET.*sekki.*   <-- 今関さんの例外
ignoreregex = ^<HOST> -.*GET.*(jpg|jpeg|gif|png).*

* sekki さんのページは画像があるディレクトリの others に読み取り権限がないので大量のエラーが出てしまっているため, sekki さんのページは例外にした
* 一つの html ページに画像がたくさん貼付けてあるとそれだけで引っかかってしまう. そのため, png, jpg(jpeg), gif についても ignore に追加した.
* (追記) sekki さんの例外については, エラーが出るのが画像ファイルであり, 2 行目の ignoreregex に含まれるので, その一文は後で消した.

=== 動作テスト

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

* access のテスト
  * ブラウザから画像のリンクなど多いページなどを何回か更新してみた.
    * itpass の実習風景とかを 2,3 回更新すればいい
  * runtime error になった

== 補足

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