Файлы журнала Apache Fail2ban и WordPress

Файлы журнала Apache Fail2ban и WordPress

Я пытаюсь заставить Fail2ban блокировать атаки методом подбора и постоянные атаки xmlrpc и wp-login на сайт WordPress.

У меня проблема с именами файлов логов apache. Обойти проблемы selinux было довольно сложно, но я довольно близок к тому, чтобы заставить это работать.

Во-первых, вот мой файл Fail2Ban wordpress.conf (в jail.d)

[wordpress]
enabled = true
usedns = no
port = http,https
filter = wordpress
banaction = firewallcmd-rich-rules
banaction_allports = firewallcmd-rich-rules

logpath = /var/www/html/site1/logs/*-access.log.*
          /var/www/html/site2/logs/*-access.log.*
          ... etc ...
maxretry = 1
findtime = 1200
bantime = 1440

Это работает, но когда я смотрю на вывод "fail2ban-client status wordpress", он перечисляет 10 файлов журнала, что бессмысленно и неэффективно. Я не могу заставить его выбрать текущий (сегодняшний) файл журнала, не перезапустив службу.

Кстати, в настоящее время 43 IP-адреса отображаются как «забаненные».

в моей папке ./logs

2023-08-23-access.log
access.log.1692835200

Проблема в том, что я хочу, чтобы файл журнала apache всегда назывался "access.log", а затем поворачивался в форму с датой. Тогда fail2ban может просто посмотреть на "access.log" и всегда будет работать с файлом текущих дней. Я не знаю, откуда взялся суффикс datestamp (предполагая, что это datestamp).

Вот запись в файле apache sites.conf, вызывающая проблему.

ErrorLog "|/usr/sbin/rotatelogs /var/www/html/site1/logs/error.log"
CustomLog "|/usr/sbin/rotatelogs /var/www/html/site1/logs/access.log 86400" combined

Я не говорю ему ставить штамп на файл, так почему же он это делает?

Ротация журналов описана здесь: https://httpd.apache.org/docs/2.4/programs/rotatelogs.html

решение1

Постоянное сохранение одного и того же имени файла для текущего активного файла — это то, чего rotatelogsнужно избегать. Новый файл открывается с уникальным, но предсказуемым суффиксом (по умолчанию) или шаблоном имени (при использовании %символов) с предопределенным интервалом/условием.

На сайтах с небольшим количеством посетителей я бы рекомендовал установить следующую настройку:

CustomLog "|/usr/sbin/rotatelogs -c /var/www/html/site1/logs/access.log.%Y.%m" combined 

который ежемесячно генерирует новый файл журнала с шаблоном имени для августа 2023 года, например access.log.2023.08.

Для сайтов, которые генерируют больше трафика: ежедневно создавайте новый файл журнала (именно это и делала опция 86400, которую вы использовали) и используйте

CustomLog "|/usr/sbin/rotatelogs -c /var/www/html/site1/logs/access.log.%Y.%m.%d " combined 

Это создает новый файл журнала каждый день с шаблоном имени для 24 августа 2023 года , например access.log.2023.08.24. (Такой шаблон гарантирует, что ls -lфайл будет отсортирован в хронологическом порядке, и я считаю его гораздо более простым в использовании, чем, например, access.log.24082023то, что это личное предпочтение.)

Поскольку теперь у меня есть предсказуемый шаблон имени файла, я могу задать задание cron, которое будет запускаться сразу после полуночи:

#!/bin/bash

basefile="/var/www/html/site1/logs/access.log"
currentlog=$(date +$basefile.%Y.%m.%d) 
rm $basefile 
ln -s $currentlog $basefile

# and you can do some maintenance here as well, like for example 
# compress the log file from a week ago
oldlog=$(date --date="1 week ago" +$basefile.%Y.%m.%d)
gzip $oldlog 

Что создает символическую ссылку из accesss_log на текущий файл журнала за этот день.

Вы можете настроить fail2ban с ожидаемым статическим именем файла, /var/www/html/site1/logs/access.logи все будет отлично.


Если вам это не нужно, вы обычно настраиваете Apache httpd следующим образом:

CustomLog  /var/www/html/site1/logs/access.log combined

Тогда Apache hhtpd всегда будет записывать события журнала в/var/www/html/site1/logs/access.log

Но тогда вам нужно настроить внешнюю функцию для ротации файла журнала, и поскольку Apache httpd открывает дескриптор файла, а переименование /var/www/html/site1/logs/access.logв /var/www/html/site1/logs/access.log.old-labelне закрывает этот дескриптор файла, вам нужно перезапустить apache httpd.
Если вы не перезапустите Apache httpd, все события журнала будут продолжать записываться /var/www/html/site1/logs/access.log.old-label, а не в новый/var/www/html/site1/logs/access.log

Конечно, вы можете написать этот сценарий самостоятельно, но большинство людей используютlogrotateдля этого вместо того, чтобы изобретать велосипед.

решение2

HBruijn уже хорошо рассмотрел части файла журнала, но я бы хотел вернуться к вашей цели:

Я пытаюсь заставить Fail2ban блокировать атаки методом подбора и постоянные атаки xmlrpc и wp-login на сайт WordPress.

Журналы доступа Apache могут быть довольно подробными для этой цели, и вы можете столкнуться с проблемами производительности вашей конфигурации, поскольку Fail2ban пытается обработать и проанализировать их все.

Существуют плагины WordPress, такие какWP-fail2ban, которые могут помочь в этом, создав события аудита, которые регистрируют только неудачные попытки входа в систему /var/log/auth.log.

WP fail2ban обеспечивает связь между WordPress и fail2ban:

Oct 17 20:59:54 foobar wordpress(www.example.com)[1234]: Authentication failure for admin from 192.168.0.1 Oct 17 21:00:00 foobar wordpress(www.example.com)[2345]: Accepted password for admin from 192.168.0.1

WPf2b поставляется с тремя фильтрами fail2ban: wordpress-hard.conf, wordpress-soft.conf, и wordpress-extra.conf. Они разработаны для того, чтобы обеспечить разделение между немедленным баном (жестким) и традиционным более изящным подходом (мягким), с дополнительными правилами для пользовательских конфигураций.

Связанный контент