Я пытаюсь заставить 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
. Они разработаны для того, чтобы обеспечить разделение между немедленным баном (жестким) и традиционным более изящным подходом (мягким), с дополнительными правилами для пользовательских конфигураций.