fail2ban 的数据库太大(超过 500mb)。我怎样才能把它弄到一个合理的大小?

fel*_*the 16 linux fail2ban

最近我的备份开始失败,我将问题跟踪到文件 /var/lib/fail2ban/fail2ban.sqlite3. 它超过500mb。我不确定它是否随着时间的推移而增长,或者这是否是最近的发展。

我怎样才能让它达到合理的尺寸并保持它的尺寸?(出于这个目的,我们假设小于 500mb。)

Pio*_*asz 21

中有一个dbpurgeage参数fail2ban.conf,它告诉在数据库中保留多少天的数据。默认值为一天 ( 1d),因此请尝试将其减少到几个小时:

dbpurgeage = 8h
Run Code Online (Sandbox Code Playgroud)

此设置与findtime:具有findtime更长的时间毫无意义dbpurgeage

编辑(2021 年):以下说明在撰写本文时是正确的。然而,现在请查看neingeist 的答案:fail2ban 0.11.x 开始在 Linux 发行版中可用(例如Debian 测试Ubuntu 20.04及更高版本、Fedora 33),尊重dbpurgeage设置。

过时说明:通过查看我自己的fail2ban数据库,该dbpurgeage设置似乎不起作用。因此,唯一的解决方案是手动删除条目。例如,要删除去年的条目,请运行:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 \
  "DELETE FROM bans WHERE DATE(timeofban, 'unixepoch') < '2020-01-01'; VACUUM;"
Run Code Online (Sandbox Code Playgroud)

sqlite3可执行文件通常在同名包中)。

VACUUM没有sqlite在同一目录中执行数据库的副本,似乎没有办法执行数据库 。但是,您可以在执行操作之前将文件复制到另一个文件系统,然后再复制回较小的数据库。

  • sqlite3 命令创建一个相同大小的临时“fail2ban.sqlite3-journal”文件。我的 fail2ban.sqlite3 是 17GB 所以它不是一个可行的选择,更不用说它需要很长时间。所以我只是做了一个'/etc/init.d/fail2ban stop'并简单地删除了fail2ban.sqlite3。当我再次启动 fail2ban 时,一个新文件从头开始创建。 (4认同)
  • 高于fail2ban.conf中的该值时,它显示“设置应从数据库中清除禁令的年龄”。500mb 不可能是一天的禁令,不是吗?(文件中也没有出现“findtime”。) (2认同)
  • 之后你需要 [VACUUM](https://sqlite.org/lang_vacuum.html)。 (2认同)

nei*_*ist 9

您可以更新到 0.11.x(其中包含执行清除的代码),然后删除庞大的数据库,然后重新启动 fail2ban。它将重新创建数据库。对于大多数人来说,这是最简单的解决方案,没有任何缺点。

虽然fail2ban 0.11.x 实际上包含清除旧条目的代码(旧版本没有!),但它没有VACUUM。因此,另一种选择是等待 fail2ban 清除旧条目(每小时发生一次)并执行手动sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "VACUUM;". 没有VACUUM数据库文件将保持其大小。

  • 我不建议删除数据库,因为这意味着对最近的攻击者的特赦。撇开这一点不谈,由于有[可用的 deb 软件包](https://github.com/fail2ban/fail2ban/releases),我建议 Debian 用户从现在开始对这个答案进行投票。 (2认同)

小智 6

sudo /etc/init.d/fail2ban stop

sudo rm -rf /var/lib/fail2ban

sudo /etc/init.d/fail2ban start

sudo reboot
Run Code Online (Sandbox Code Playgroud)

为我解决了一切。重启后检查

df -h
Run Code Online (Sandbox Code Playgroud)

我有 25GB 的 sqlite 文件,内存是 40GB 的 94%


F. *_*uri 5

简单的命令

除了Piotr P. Karwasz 的正确答案之外,我还会使用 GNU (而不是 BSD )展示我的简单语法:date date

首先显示bans表的统计信息:

sqlite3 fail2ban.sqlite3 'SELECT count(timeofban) FROM bans'
1147784
sqlite3 fail2ban.sqlite3 "SELECT count(timeofban) FROM bans
      WHERE timeofban < `date -d 'now -1 month' +%s`;"
1129083
Run Code Online (Sandbox Code Playgroud)

在命令行参数扩展中进行UNIXEPOCH转换速度更快,因为不必转换每一行!sqlite

当然,您的系统上的答案应该不同!

然后

sqlite3 fail2ban.sqlite3 "DELETE FROM bans WHERE 
        timeofban < $(date -d 'now -1 month' +%s); VACUUM;"
Run Code Online (Sandbox Code Playgroud)

(不要错过VACUUM;!)

使用date延时命令的主要优点是可以将其放置在定期脚本中。

now -1 month注意:我的选择是每晚随着时间推移运行此程序。

没有 GNU date,使用sqlite3语法:

浏览sqlite手册,我终于找到了正确的语法:

sqlite3 fail2ban.sqlite3 "DELETE FROM bans
     WHERE timeofban <= STRFTIME('%s', DATE('now', '-1 month'));VACUUM;"
Run Code Online (Sandbox Code Playgroud)

再次强调:使用此语法,sqlite3将根据请求进行翻译,而不是根据行进行翻译!

备注crontabs

如果您打算将其写入 crontab,请不要错过转义所有百分号!

1 2 * * * root /usr/bin/sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "delete from bans where timeofban <= strftime('\%s', date('now', '-42 days'));vacuum;"
Run Code Online (Sandbox Code Playgroud)

将在每晚运行此程序02:01/etc/cron.weekly例如,该命令还可以添加到 BASH 脚本中。