Большая база данных fail2ban, нормально?

perl -alMFatal=open -pe '
   BEGIN{ unlink, open *{+uc}, ">>$_" for qw/file1.log file2.log/; }
   select $F[0] =~ s/^\D*//r eq $F[2] =~ s/^\D*//r ? *{"FILE1.LOG"} : *{"FILE2.LOG"};
' sample.txt

Пояснение

  • Perlопции :
    • -aразделит строку на поля на основе пробелов, и эти поля доступны через$F[0] $F[1]...
    • -lустановит RSна новую строку и ORSна новую строку.
    • -Mзагрузит модуль Fatal.pmи включит функцию openиз своего пространства имен. Это означает, что любые ошибки при открытии файла в основном коде должны умереть.
    • -pбудет читать строку файла sample.txt -за строкой -, а автоматическая -печать строк будет включена после применения к ней всех преобразований.
  • Блок BEGINдолжен удалить все существующие файлы file1.log и file2.log и открыть дескрипторы файлов в режиме appendдля файлов.
  • Команда
  • selectвыбирает дескриптор файла для печати текущей строки.
    • $F[0] =~ s/^\D*//rудалит все начальные нецифры в первом поле (это предполагает, что все цифры помещены в конец поля ).
    • Мы выполняем аналогичную операцию с 3-м полем ($F[2])и затем сравниваем эти результаты в строковом формате (и НЕ в числовом формате, поскольку 001 = 1 в числовом формате ). Когда строки совпадают, мы выбираем дескриптор файла *FILE1.LOG, что означает, что текущая строка печатается здесь из-за опции -p. OTW, дескриптор файла *FILE2.LOG делается дескриптором по умолчанию, а опция -pзаставляет Perlпечатать здесь текущую строку.

Мы можем сделать то же самое, используя sedинструмент, как показано:(Предполагая, что GNU sed)

sed -Ee '
   h;s/\S+/\n&\n/3
   /^[^0-9[:blank:]]*([0-9]+).*\n(.*[^0-9])?\1\n/{
      g
      s/^//w file1.log
      d
   }
   g
' < sample.txt > file2.log

  • На первом шаге мы заключаем третье поле с помощью маркеров.
  • Затем мы выполняем сравнение цифр в конце первого поля, чтобы они совпадали с цифрами в конце третьего поля.
  • При совпадении мы вспоминаем место хранения, в котором мы сохранили текущую строку без маркеров, и добавляем ее в файл file1.log.
  • При отсутствии совпадений мы возвращаем резервное пространство и отпускаем его на стандартный вывод, где он сохраняется в файле file2.log оболочкой.
3
05.11.2019, 23:10
1 ответ

Я только что обнаружил эту проблему на своих серверах. Мой dbpurgeageтакже настроен на 24 часа по умолчанию, но мой fail2ban.sqlite3вырос до 400 МБ и имеет 800 000 банов за последние 2 года.

Оказывается, у fail2ban не было кода для очистки БД до версии 0.11 . Он был добавлен в этот коммит . dbpurgeage до этого ничего не делает.


Посмотреть сколько банов в БД:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select count(*) from bans"

Чтобы узнать, сколько лет вашей самой старой записи в БД:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select datetime(min(timeofban), 'unixepoch') from bans"

Чтобы очистить БД, например, сохранить данные только за последнюю неделю:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "delete from bans where timeofban < strftime('%s', 'now', '-7 days')"
sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "vacuum"

Удаление может занять несколько минут, в течение которых fail2ban будет заблокирован при попытке доступа к базе данных. Возможно, вы захотите удалить небольшими партиями (сначала все, что старше 2 лет, затем 1 год и т. д. ), чтобы дать fail2ban возможность работать в промежутках между ними, а в конце выполнить очистку.

5
15.07.2020, 05:15

Теги

Похожие вопросы