Вопрос или проблема
В последнее время мои резервные копии начали выходить из строя, и я выяснил, что проблема связана с файлом /var/lib/fail2ban/fail2ban.sqlite3
. Он составляет более 500 МБ. Я не уверен, увеличивался ли он со временем или это новое явление.
Как можно привести его к разумному размеру и поддерживать его на этом уровне? (Для этих целей предположим, что он должен быть менее 500 МБ.)
В fail2ban.conf
есть параметр dbpurgeage
, который указывает, сколько дней данных хранить в базе данных. По умолчанию это один день (1d
), поэтому попробуйте уменьшить его до пары часов:
dbpurgeage = 8h
Эта настройка связана с findtime
: нет смысла иметь findtime
дольше, чем dbpurgeage
.
Правка (2021): Примечание ниже было верным на момент написания. Однако в настоящее время посмотрите ответ neingeist: fail2ban 0.11.x, который доступен в дистрибутивах Linux (например, Debian 11 и позже, 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;"
(исполняемый файл sqlite3 обычно находится в одноимённом пакете).
Похоже, нет возможности выполнить VACUUM
базы данных без того, чтобы sqlite не сделал копию базы данных в том же каталоге. Однако вы можете скопировать файл в другую файловую систему перед выполнением операции, а затем скопировать обратно меньшую базу данных.
Вы можете обновиться до версии 0.11.x (которая содержит код для очистки), затем удалить огромную базу данных и перезапустить fail2ban. Это воссоздаст базу данных. Это самое простое решение без недостатков для большинства пользователей.
Хотя в fail2ban 0.11.x действительно содержится код для удаления старых записей (в более ранней версии его не было!), он не выполняет VACUUM
. Поэтому другой вариант — дождаться, пока fail2ban очистит старые записи (это происходит каждый час), и вручную выполнить sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "VACUUM;"
. Без VACUUM
файл базы данных останется того же размера.
1. Используя GNU date
, простая shell команда
В дополнение к правильному ответу Петра П. Карваза я бы показал свою простую синтаксис shell, использующую GNU date
(не BSD 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
Выполнение перевода UNIXEPOCH на уровне параметра командной строки быстрее, так как sqlite
не нужно переводить каждую строку!
-
Сравните:
time sqlite3 fail2ban.sqlite3 "SELECT count(timeofban) FROM bans WHERE DATE(timeofban, 'unixepoch') < '$(date -d 'now -1 month' +'%F %T')';"
94074 real 0m0.427s user 0m0.363s sys 0m0.060s
С:
time sqlite3 fail2ban.sqlite3 "SELECT count(timeofban) FROM bans WHERE timeofban < $(date -d 'now -1 month' +%s);"
93709 real 0m0.169s user 0m0.121s sys 0m0.045s
Где использование
DATE()
для каждого ряда делает эту операцию почти в 3 раза медленнее! (Результат отличается, потому чтоDATE()
округляется до дня, в то время как GNUdate
возвращает EPOCH в секундах.)
Конечно, ответ на вашем компьютере будет другим!
Затем
sqlite3 fail2ban.sqlite3 "DELETE FROM bans WHERE
timeofban < $(date -d 'now -1 month' +%s); VACUUM;"
(Не пропустите VACUUM;
!)
Основное преимущество использования команды date
с временным интервалом заключается в том, что это можно разместить в периодическом сценарии.
Примечание: Я предпочитаю запускать это с now -1 month
в качестве временного интервала каждую ночь.
2. Без GNU date
, используя синтаксис sqlite3
:
Изучая справочник sqlite
, я, наконец, нашел правильный синтаксис:
sqlite3 fail2ban.sqlite3 "DELETE FROM bans
WHERE timeofban <= STRFTIME('%s', DATE('now', '-1 month'));VACUUM;"
Еще раз: Используя этот синтаксис, 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;"
Будет выполняться каждую ночь в 02:01
. Команда также может быть добавлена в BASH-скрипт в /etc/cron.weekly
, например.
sudo /etc/init.d/fail2ban stop
sudo rm -rf /var/lib/fail2ban
sudo /etc/init.d/fail2ban start
sudo reboot
решило все для меня. проверьте после перезагрузки
df -h
у меня было 25 ГБ файлов sqlite, память была 94% от 40 ГБ
Я в итоге пошел по альтернативному пути уменьшения логов.
Потому что я создал собственный код, который суммирует IP-адреса, используя простые правила.
Дан диапазон IP: если более 25% IP в списке в журналах Fail2ban, я удалю отдельные IP и заблокирую весь диапазон.
Затем я проверю более крупные и крупные диапазоны IP, если все еще более 25% IP принадлежит заблокированному диапазону, то заблокированный диапазон увеличивается.
Я использовал собственное дерево для решения, так как оно ищет в дереве, используя IP-адрес, чтобы выяснить, может ли дерево быть уменьшено.
Математика для расчета области поиска требует некоторой доработки, но в целом именно так я заблокировал 2 китайских, 1 иранского и 1 российского провайдера.
И поскольку были повторные нарушители, таймер, который их снимет с блок-листа, отсутствует.
.
Ответ или решение
Файл базы данных Fail2ban, расположенный по адресу /var/lib/fail2ban/fail2ban.sqlite3
, занимает более 500 МБ и требует оптимизации. Эта проблема, вероятно, связана с сохранением избыточного количества устаревших записей о блокировках IP-адресов, что может негативно влиять на производительность системы и успешность резервного копирования. Для уменьшения размера базы данных до разумного уровня, предположим, менее 500 МБ, и поддержания этого состояния, существуют несколько подходов.
Теория: Управление размерами баз данных
Базы данных, такие как SQLite, могут раздуваться по мере накопления данных. Необходимое регулярное обслуживание может включать в себя удаление устаревших данных и оптимизацию структуры самой базы данных. Уже устоявшийся параметр dbpurgeage
в Fail2ban конфигурации определяет, сколько дней данных необходимо хранить; по умолчанию это один день. Правильная настройка и регулярное выполнение операций по очистке и оптимизации позволяют существенно снизить объем базы данных.
Пример: Конфигурация и оптимизация Fail2ban
-
Проверка и настройка конфигурации:
- Проверьте значение
dbpurgeage
в файле конфигурацииfail2ban.conf
. Если нужно, установите его на 8 часов (dbpurgeage = 8h
), чтобы уменьшить объем старых данных.
- Проверьте значение
-
Ручная очистка и оптимизация:
- Если вы используете Fail2ban версии до 0.11.x, вам, возможно, потребуется вручную удалять устаревшие записи:
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "DELETE FROM bans WHERE DATE(timeofban, 'unixepoch') < '2023-01-01'; VACUUM;"
- Если база данных все еще велика, выполните команду
VACUUM;
для переупаковки базы и освобождения неиспользуемого пространства.
- Если вы используете Fail2ban версии до 0.11.x, вам, возможно, потребуется вручную удалять устаревшие записи:
-
Обновление версии Fail2ban:
- Перейдите на версию 0.11.x или более позднюю, которая автоматизирует очистку старых записей, и после этого удалите текущую базу данных с последующим перезапуском сервиса:
sudo /etc/init.d/fail2ban stop sudo rm -rf /var/lib/fail2ban sudo /etc/init.d/fail2ban start
- Перейдите на версию 0.11.x или более позднюю, которая автоматизирует очистку старых записей, и после этого удалите текущую базу данных с последующим перезапуском сервиса:
Применение: Поддержание производительности и безопасности
Эти шаги не только снизят размер базы данных, но и улучшат общую производительность Fail2ban, упрощая управление блокировками IP и обеспечивая бесперебойное выполнение резервных копий. Оптимизация частоты очищения не только освобождает дисковое пространство, но и поддерживает высокий уровень безопасности системы, сохраняя только актуальные данные для анализа возможных угроз.
Следуя приведенным рекомендациям, вы можете эффективно управлять размером базы данных Fail2ban и снизить нагрузку на вашу систему.