manekineko倉金家ホームページ

趣味の部屋/インターネットサーバー/サーバー構築メモ その4

アタック対策 fail2ban

2015年5月10日 2016年1月2日 更新
サーバーへのアタックを検知し拒絶するソフトとしてFail2banを使用します。


最近のfail2banの設定 (2016.1.2 追加)
最近のバージョンアップに伴いfail2banの設定は監視対象が増えたのとファイルがいろいろ分離されて少しわかりにくくなりました。そのため設定の仕方を少し変えました。
でもめんどうだったので書いてなかったのですが、検索サイトから来てくれる方も多いので、いちおう次ページに現在の設定を記載しておきました。
→ アタック対策 fail2ban (2016.1)

以下の内容は少し古いので参考までに。

このあたりまでやるとさっそくログにはssh, httpd, named, postfix, dovecotなどへのしつこいアタックアクセスが記録されてきます。
もちろんサーバーソフトそのものをしっかり設定することが基本なのですが、それにしても鬱陶しいので従来fail2banというソフトでこれらのアタックをシャットアウトしてきました。やっぱり今回もやらないと。

インストール
EPELより以下インストール。
fail2ban-server-0.9.1-2.el7.noarch
fail2ban-sendmail-0.9.1-2.el7.noarch
fail2ban-systemd-0.9.1-2.el7.noarch
fail2ban-firewalld-0.9.1-2.el7.noarch
fail2ban-0.9.1-2.el7.noarch
fail2ban-mail-0.9.1-2.el7.noarch
その他依存関係で
ipset-libs-6.19-4.el7.x86_64
ipset-6.19-4.el7.x86_64
がインストールされました。

またログ検知のbackendとしてpyinotify(python-inotify)、gamin(gamin、gamin-python)がなければ入れておきます。(backendをautoにすれば必ずしもなくてもいいようだが今まで使っていたので。)
まだ何も設定してはいないが試しに起動停止してみる。
~]# systemctl start fail2ban.service
~]# systemctl status fail2ban.service
fail2ban.service - Fail2Ban Service
Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled)
Active: active (running) since 火 2015-02-24 11:10:20 JST; 11s ago
Docs: man:fail2ban(1)
Process: 28571 ExecStart=/usr/bin/fail2ban-client -x start (code=exited, status=0/SUCCESS)
Main PID: 28574 (fail2ban-server)
CGroup: /system.slice/fail2ban.service
└─28574 /usr/bin/python /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid ...

2月 24 11:10:19 moonlight.iroribata.net fail2ban-client[28571]: 2015-02-24 11:10:19,723 fail2ban.server [28572]: IN....9.1
2月 24 11:10:19 moonlight.iroribata.net fail2ban-client[28571]: 2015-02-24 11:10:19,723 fail2ban.server [28572]: IN...mode
2月 24 11:10:20 moonlight.iroribata.net systemd[1]: Started Fail2Ban Service.
Hint: Some lines were ellipsized, use -l to show in full.
~]# systemctl stop fail2ban.service
ログを確認
/var/log/fail2ban.log
2015-02-24 11:10:19,785 fail2ban.server         [28574]: INFO    Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.1
2015-02-24 11:10:19,786 fail2ban.database [28574]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'
2015-02-24 11:10:20,643 fail2ban.database [28574]: WARNING New database created. Version '2'
2015-02-24 11:18:48,786 fail2ban.server [28574]: INFO Stopping all jails
2015-02-24 11:18:48,787 fail2ban.server [28574]: INFO Exiting Fail2ban

インストールは特に問題ないようだ。

設定
/etc/fail2ban/jail.local をつくり、/etc/jail.confを参考にして監視対象とするサービスについて記載。
(必要なのはenabled = true のみであとのbantime,findtime,maxentryなどは適宜。)
[sshd]
enabled  = true
bantime  = 86400
findtime = 3600
maxretry = 3

[apache-botsearch]
enabled = true
....

[postfix-sasl]
enabled = true
....

[postfix]
enabled = true
....

[dovecot]
enabled = true
....

[named-refused]
enabled = true
....

[vsftpd]
enabled = true
....

SELinuxがEnforceモードになっていたらPermisssiveにしてstart,stopをやってみますと予想通り一部ログファイルへのアクセスを阻まれますので許可ポリシーを作ってインストールします。


さらに必要なら/etc/fail2ban/filter.dのなかの該当するフィルターファイルのfailregexを編集したりしますが、昔に較べてかなり充実してきておりほとんどそのままでもかまわないようです。

起動設定と調整
~]# systemctl enable fail2ban.service
~]# systemctl start fail2ban.service
で自動起動を設定し、起動させておきます。

バグ?
fail2banのログを見ていると
CRITICAL Unhandled exception in Fail2Ban:
Traceback (most recent call last):
....
  File "/usr/lib/python2.7/site-packages/fail2ban/server/filtersystemd.py", line 172, in formatJournalEntry
    'SYSLOG_PID', logentry['_PID']))
といったエラーがでます。バグだそうです。

/usr/lib/python2.7/site-packages/fail2ban/server/filtersystemd.py 172行目
      if logentry.get('SYSLOG_PID') or logentry.get('_PID'):
        logelements[-1] += ("[%i]" % logentry.get(
        'SYSLOG_PID', logentry['_PID']))
を、
      if logentry.get('SYSLOG_PID') or logentry.get('_PID'):
        logelements[-1] += ("[%i]" % logentry.get(
        'SYSLOG_PID', logentry.get('_PID')))
と修正。

また、サーバーを停止または再起動する際に、
.... : ERROR   firewall-cmd --direct --remove-rule ipv4 filter INPUT 0 -p tcp -m multiport --dports ssh -m set --match-set fail2ban-sshd src -j DROP
といったエラーログがでます。fail2banを単独ににstop/startする分には出ませんので、多分システム終了の際にfirewalldが先に終了してしまい、fail2banが投入したルールを削除できなくなってしまうのではないかと推定しています。
プロセスの終了順序を制御する方法がわからないのと特に実害はなさそうなのでいいことにしておきます。
→ このサーバー停止時のエラーについては解決しました。次のページ(アタック対策 fail2ban (2016.1))に記載。(2016.1.6 追記)

あとはログをみながらbantime,findtime,maxentryやフィルターなどを調整していくことにします。