将 fail2ban 指向新日志,而不丢失当前禁令?

将 fail2ban 指向新日志,而不丢失当前禁令?

我的日志在 /var/log/syslog/YYYY-MM-DD/file.log 文件中。rsyslog 会自动创建新目录,并将日志自动放到新位置。

每天,我都会将前一天日志存档到另一个目录,因此,除了 5 分钟时间段外,/var/log/syslog/ 中只有一个子目录。

基于此,我使用以下方法制定了 fail2ban 规则:

logpath  = /var/log/syslog/*/auth.log

有效。直到午夜,fail2ban 仍会“监听”之前的日志。我可以重新加载 fail2ban 配置,但这会让我失去现有的禁令。

所以问题是 - 怎样才能让 fail2ban 切换到新日志,而不会丢失现有的禁令?

我还尝试创建符号链接 /var/log/syslog/today,指向当天的日志,并将 fail2ban 指向 /var/log/syslog/today/auth.log,但随后我得到了日志:

Jan  8 00:05:46 xxxx fail2ban.filter : ERROR  Unable to open /var/log/syslog/today/auth.log
Jan  8 00:05:46 xxxx fail2ban.filter : ERROR  [Errno 2] No such file or directory: '/var/log/syslog/today/auth.log'
Traceback (most recent call last):
  File "/usr/share/fail2ban/server/filter.py", line 491, in getFailures
    has_content = container.open()
  File "/usr/share/fail2ban/server/filter.py", line 569, in open
    self.__handler = open(self.__filename)
IOError: [Errno 2] No such file or directory: '/var/log/syslog/today/auth.log'

这可能是因为 auth.log 直到几分钟后才创建。

但无论如何 - fail2ban 记录了这个错误几次,然后没有监视任何东西(没有禁止任何东西)

答案1

编辑当您启动 fail2ban 时,它会打开当前看到的所有 auth 文件的文件句柄。它不会继续扫描目录以查看是否有任何新文件出现。使用符号链接不起作用,因为符号链接指向的是旧 inode,而不是新 inode。

最简单的解决方案是添加第二个单独的 authlog 文件,该文件仅供 fail2ban 使用。您可以在每个午夜清空它,以避免它变得太大。

原始答案 问题是,fail2ban 第一次启动时会打开属于该文件名的 inode/文件句柄。打开文件后,它不会检查更改,因此当文件被移动时,其文件句柄将停止工作。

解决方案是根本不移动文件。而是将其内容复制到新文件,然后清空旧文件。您没有说明轮换的具体执行方式,但大多数 logrotation 包都会有复制而不是移动的选项。

相关内容