fall2banが読み取るログファイルに対して特別な権限セットを設定する必要がありますか?

fall2banが読み取るログファイルに対して特別な権限セットを設定する必要がありますか?

私は最近Minecraftサーバーでスパムを経験しましたが、一種のポートスキャナーや他のボットから来ると思われます。これまでは、それが何であれ、実際の脅威を与えていませんが、後悔するよりも安全な方が良いと思います。fail2ban3回以上接続に失敗したIPのブロックを設定しようとしました。 Redditで同じツールを使って成功した他の人を見たので、一度試してみるかと思いました。

しかし、私は少し立ち往生しています。 Fail2ban サービスを開始しようとするたびに、次のエラーで失敗します。

ERROR   Failed during configuration: Have not found any log file for minecraft jail
ERROR   Async configuration of server failed

logpathGoogle検索によると、これは通常、この「minecraft」のファイルの設定オプションがjail.conf無効なパスを参照するか、存在しないファイルを指すためであることがわかりました。何度も確認してみると、私が指定したパスが実際に存在することを確認できるので、何か他のものではないかという気がします。

構成ファイルを介して「minecraft」デバイスを無効にし、failure2ban systemdサービスを開始し、「minecraft」デバイスを再度有効にし、コマンドを使用してfall2banサーバーを再ロードすると、次のfail2ban-clientエラーが発生します。

[root@fedora ~]# fail2ban-client reload
2023-06-30 21:37:28,314 fail2ban                [4565]: ERROR   NOK: (13, 'Permission denied')
[Errno 13] Permission denied: '/path/omitted.log'

うーん、わかった…権限が悪いのではないか?権限が妨げられないようにするために、次の権限を持つディレクトリ/tmpで使用する一時テストファイルを作成しました。

[root@fedora ~]# ll -d /tmp
drwxrwxrwt. 29 root root 640 Jun 30 22:10 /tmp
[root@fedora ~]# ll /tmp/testing.log 
-rwxrwxrwx. 1 root root 0 Jun 30 21:29 /tmp/testing.log

上記で再読み込みプロセスを繰り返すと、サイコロは表示されません。私は何を見逃していますか?誰でも私が試してみるアイデアがありますか?どんな助けでも大変感謝します!詳細情報が必要な場合はお知らせください。

以下は、上記のリロードプロセスを実行した後(DEBUGロギングが有効になっている)Fail2banサーバーからのログ出力です。

[root@fedora ~]# tail -n 50 /var/log/fail2ban.log 
<output removed for brevity>
2023-06-30 21:37:28,186 fail2ban.server         [4553]: INFO    Start Fail2ban v1.0.2
2023-06-30 21:37:28,187 fail2ban.server         [4553]: INFO    Changed logging target to /var/log/fail2ban.log for Fail2ban v1.0.2
2023-06-30 21:37:28,187 fail2ban.ipdns          [4553]: DEBUG   IPv6 is auto
2023-06-30 21:37:28,187 fail2ban.jail           [4553]: INFO    Creating new jail 'minecraft'
2023-06-30 21:37:28,311 fail2ban.jail           [4553]: DEBUG   Backend 'pyinotify' failed to initialize due to No module named 'pyinotify'
2023-06-30 21:37:28,312 fail2ban.jail           [4553]: DEBUG   Backend 'gamin' failed to initialize due to No module named 'gamin'
2023-06-30 21:37:28,312 fail2ban.jail           [4553]: INFO    Jail 'minecraft' uses poller {}
2023-06-30 21:37:28,312 fail2ban.filter         [4553]: DEBUG   Setting usedns = warn for FilterPoll(Jail('minecraft'))
2023-06-30 21:37:28,312 fail2ban.filter         [4553]: DEBUG   Created FilterPoll(Jail('minecraft'))
2023-06-30 21:37:28,312 fail2ban.filterpoll     [4553]: DEBUG   Created FilterPoll
2023-06-30 21:37:28,312 fail2ban.jail           [4553]: INFO    Initiated 'polling' backend
2023-06-30 21:37:28,312 fail2ban.filter         [4553]: DEBUG   Setting usedns = warn for FilterPoll(Jail('minecraft'))
2023-06-30 21:37:28,312 fail2ban.server         [4553]: DEBUG     failregex: '\\(\\/<HOST>\\:'
2023-06-30 21:37:28,313 fail2ban.filter         [4553]: INFO      maxRetry: 3
2023-06-30 21:37:28,313 fail2ban.filter         [4553]: INFO      findtime: 86400
2023-06-30 21:37:28,313 fail2ban.actions        [4553]: INFO      banTime: 2592000
2023-06-30 21:37:28,313 fail2ban.filter         [4553]: INFO      encoding: UTF-8
2023-06-30 21:37:28,313 fail2ban.server         [4553]: INFO    Reload finished.
2023-06-30 21:37:28,313 fail2ban.transmitter    [4553]: ERROR   Command ['reload', '--all', [], [['set', 'syslogsocket', 'auto'], ['set', 'loglevel', 'DEBUG'], ['set', 'logtarget', '/var/log/fail2ban.log'], ['set', 'allowipv6', 'auto'], ['set', 'dbfile', '/var/lib/fail2ban/fail2ban.sqlite3'], ['set', 'dbmaxmatches', 10], ['set', 'dbpurgeage', '1d'], ['add', 'minecraft', 'auto'], ['set', 'minecraft', 'usedns', 'warn'], ['set', 'minecraft', 'addfailregex', '\\(\\/<HOST>\\:'], ['set', 'minecraft', 'maxretry', 3], ['set', 'minecraft', 'maxmatches', 3], ['set', 'minecraft', 'findtime', '1d'], ['set', 'minecraft', 'bantime', '30d'], ['set', 'minecraft', 'ignorecommand', ''], ['set', 'minecraft', 'logencoding', 'auto'], ['set', 'minecraft', 'addlogpath', '/tmp/testing.log', 'head'], ['set', 'minecraft', 'addaction', 'firewallcmd-rich-rules'], ['multi-set', 'minecraft', 'action', 'firewallcmd-rich-rules', [['actionstart', ''], ['actionstop', ''], ['actioncheck', ''], ['actionban', 'ports="0:65535"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --add-rich-rule="rule family=\'<family>\' source address=\'<ip>\' port port=\'$p\' protocol=\'tcp\' reject type=\'<rejecttype>\'"; done'], ['actionunban', 'ports="0:65535"; for p in $(echo $ports | tr ", " " "); do firewall-cmd --remove-rich-rule="rule family=\'<family>\' source address=\'<ip>\' port port=\'$p\' protocol=\'tcp\' reject type=\'<rejecttype>\'"; done'], ['port', '0:65535'], ['protocol', 'tcp'], ['chain', '<known/chain>'], ['name', 'minecraft'], ['actname', 'firewallcmd-rich-rules'], ['family', 'ipv4'], ['zone', 'public'], ['service', 'ssh'], ['rejecttype', 'icmp-port-unreachable'], ['blocktype', 'REJECT --reject-with <rejecttype>'], ['rich-blocktype', "reject type='<rejecttype>'"], ['family?family=inet6', 'ipv6'], ['rejecttype?family=inet6', 'icmp6-port-unreachable']]], ['start', 'minecraft']]] has failed. Received PermissionError(13, 'Permission denied')
Traceback (most recent call last):
  File "/usr/lib/python3.11/site-packages/fail2ban/server/transmitter.py", line 58, in proceed
    ret = self.__commandHandler(command)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/fail2ban/server/transmitter.py", line 109, in __commandHandler
    self.__commandHandler(cmd)
  File "/usr/lib/python3.11/site-packages/fail2ban/server/transmitter.py", line 89, in __commandHandler
    return self.__commandSet(command[1:])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/fail2ban/server/transmitter.py", line 258, in __commandSet
    self.__server.addLogPath(name, value, tail)
  File "/usr/lib/python3.11/site-packages/fail2ban/server/server.py", line 382, in addLogPath
    filter_.addLogPath(fileName, tail)
  File "/usr/lib/python3.11/site-packages/fail2ban/server/filter.py", line 1006, in addLogPath
    log = FileContainer(path, self.getLogEncoding(), tail)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/fail2ban/server/filter.py", line 1327, in __init__
    handler = open(filename, 'rb')
              ^^^^^^^^^^^^^^^^^^^^
PermissionError: [Errno 13] Permission denied: '/tmp/testing.log'

答え1

リンクを共有してくれた@roaimaに感謝します。CentOS 7にfall2banをインストールする、この問題を解決する道に導きました。

簡単に言うと:

問題はSELinuxにあります。これを無効にするか、アクセス制御ポリシーを変更するか、ログファイルが保存される場所を変更することがこの問題を解決する唯一の方法です。

解決策:

SELinuxの問題に対する迅速で汚れた修正および/または検証は、SELinuxの施行ポリシーを「強制」ではなく「許可」に設定することです。提供された説明によるとこの Red Hat ヘルプドキュメント、SELinux の施行ポリシーを「権限」に設定すると、すべてのアクセス制御ポリシーの施行が効果的に無効になります。したがって、SELinuxアクセスポリシーがプロセスがログファイルにアクセスできない理由である場合は、fail2ban-serverこれを無効にすると、SELinuxが問題かどうかがわかります。これは、次のようなことを行うことで実現できます。

[root@kaleb-desktop ~]# sestatus | grep "Current mode"
Current mode:                   enforcing
[root@kaleb-desktop ~]# setenforce 0
[root@kaleb-desktop ~]# sestatus | grep "Current mode"
Current mode:                   permissive
[root@kaleb-desktop ~]#

さて、私と同じような状況になっていて、上記のタスクを実行すると、突然必要なfail2banログファイルにアクセスできるようになれば幸いです。そうでなければ、残念ながら他の問題があるかもしれません。 SELinuxを維持したくない場合は、上記の方法で十分だと思います。しかし、必ずしもSELinuxを完全に削除したくはありません。

システム監査ログを詳しく調べると、SELinuxが実際に問題に対するより永続的なソリューションを提供していることがわかります。実行するとsealert -l "*"(Fedora 38システムに手動でインストールする必要があります)、次の結果が出力されます。

SELinux is preventing fail2ban-server from open access on the file /tmp/testing.log.

*****  Plugin catchall (100. confidence) suggests   **************************

If you believe that fail2ban-server should be allowed open access on the testing.log file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# ausearch -c 'fail2ban-server' --raw | audit2allow -M my-fail2banserver
# semodule -X 300 -i my-fail2banserver.pp

出力に記載されているように推奨される解決策は、既存のポリシーの上に適用できるローカルポリシーモジュールを作成することです。ただし、@roaimaが共有する許可されたソリューションで指摘されているように、このポリシーは将来のパッケージの更新によって上書きされる可能性がありますselinux-policy

したがって、最終的で最も永続的な解決策は、既存のSELinuxアクセス制御ポリシーを満たすディレクトリにログを移動することです。私の場合、/var/logSELinuxは満足のいくように見えるサブディレクトリにログを移動できました。 YMMV。

journalctl -lfu fail2banまた、私のシステムの出力が@roaimaが共有したリンクの出力を反映していないことにも言及したかったのです。この質問は8年前に要求されたため、文書化方法に多くの変更があった可能性がありますので、ご注意ください。

冗談を言って申し訳ありませんが、以前に理解していなかったことを探り、反対側でより良い理解をする機会をいただきありがとうございます。この説明が同様の状況で他の人にも役立つことを願っています!

関連情報