从 SYSTEMCTL 启动时,Fail2ban 找不到日志文件,但从 CLI 启动时可以找到

从 SYSTEMCTL 启动时,Fail2ban 找不到日志文件,但从 CLI 启动时可以找到

问题

Fail2ban找不到 jail 使用的日志文件使用 启动时,systemctl start fail2ban.service但使用 手动启动时可以完美运行fail2ban-client start

堆栈跟踪

$ systemctl start fail2ban.service
$ systemctl status fail2ban.service

● fail2ban.service - Fail2Ban Service
  Process: 25113 ExecStart=/usr/bin/fail2ban-server -xf --logtarget=sysout start (code=exited, status=255)
  Process: 25112 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)

[25113]: ERROR   Failed during configuration: Have not found any log file for xxxxxx jail
[25113]: ERROR   Async configuration of server failed

Oct 02 10:37:56 gateway-tmp systemd[1]: fail2ban.service failed.

配置

我的 systemctl 服务:

[Unit]
Description=Fail2Ban Service
After=network.target iptables.service firewalld.service ip6tables.service ipset.service nftables.service
PartOf=firewalld.service

[Service]
Type=simple
ExecStartPre=/bin/mkdir -p /run/fail2ban
ExecStart=/usr/bin/fail2ban-server -xf start
ExecStop=/usr/bin/fail2ban-client stop
ExecReload=/usr/bin/fail2ban-client reload
PIDFile=/run/fail2ban/fail2ban.pid
Restart=on-failure
RestartPreventExitStatus=0 255

[Install]
WantedBy=multi-user.target

仅供参考,上面的启动命令(/usr/bin/fail2ban-server -xf start)在手动启动时可以按预期工作。

我的监狱配置:

[xxxxxxxx]
enabled = true
port = http,https
filter = xxxxxxx
logpath = /path/to/log/file/data/log/*error.log
maxretry = 6
banaction = xxxxxx

仅供参考,该文件存在

环境

Centos7
Fail2Ban v0.11.1

答案1

通过 systemctl 运行时,日志文件的 SELinux 上下文有时会产生影响。首先要尝试的是sudo setenfore 0测试。

如果此操作解决了问题,您可能需要重新启用 selinux ( sudo setenforce 1) 并在 SELinux 中添加适当的权限。首先运行sudo audit2allow -a,它应该会显示 SELinux 阻止了哪些内容。简而言之,

audit2allow -a > local.te
checkmodule -M -m -o local.mod local.te
semodule_package -o local.pp -m local.mod
semodule -i ./local.pp

第一步之后查看一下local.te,确保它是合理的,而不是盲目复制粘贴。第二行是验证检查,第三行将规则打包成模块,最后一行实际上将它们加载到 SELinux 中。

正常情况下,安装类似的软件包fail2ban也会进行适当的 SELinux 调整,但有时并不正确。

答案2

谢谢!我看到的第一个问题指出 selinux 是罪魁祸首。我找不到任何日志记录表明 selinux 阻止了它,但它处于强制模式并且运行fail2ban-client start成功启动了 jail,所以这看起来也是我的问题。

作为一个 selinux 新手,我不想像local.pp@tater 建议的那样陷入恶作剧。我想我已经通过将日志目录的上下文更改为http_log_t手动来修复了这个问题。这些以前是httpd_sys_content_t

我的虚拟主机文件全部位于 下/var/www/html/mydomain.com,其中包含public_htmllogs。我意外地将日志目录标记为httpd_sys_content_t,因此此命令会重置其 selinux 设置:

# semanage fcontext -a -t httpd_log_t '/var/www/html/mydomain.com/logs(/.*)?'
# restorecon -Rv /var/www/html/mydomain.com

(这与目录及其中的所有文件匹配) ls然后显示httpd_log_tfail2ban 被告知要监控的日志文件的上下文:

# ls -lZ /var/www/html/mydomain.com/logs/error.log

-rw-rw-rw-.root root system_u:object_r:httpd_log_t:s0 /var/www/html/mydomain.com/logs/error.log

现在 fail2ban 从systemctl restart fail2ban和 命令行启动fail2ban-client start

相关内容