Estoy intentando que Fail2ban bloquee los ataques de fuerza bruta y persistentes xmlrpc y wp-login en un sitio de WordPress.
Tengo un problema con los nombres de archivos de registro de Apache. Superar los problemas de Selinux fue bastante complicado, pero estoy bastante cerca de hacerlo funcionar.
En primer lugar, aquí está mi archivo wordpress.conf de Fail2Ban (en 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
Esto está funcionando, pero cuando miro el resultado de "fail2ban-client status wordpress" enumera decenas de archivos de registro, lo cual es inútil e ineficiente. No puedo hacer que recoja el archivo de registro actual (de hoy) sin reiniciar el servicio.
Por cierto, actualmente muestra 43 direcciones IP como "actualmente prohibidas".
en mi carpeta ./logs
2023-08-23-access.log
access.log.1692835200
El problema es que quiero que el archivo de registro de Apache siempre se llame "access.log" y luego se gire al formulario con la fecha. Entonces, fail2ban puede simplemente mirar "access.log" y siempre estará trabajando en el archivo de los días actuales. No sé de dónde viene el sufijo de la marca de fecha (suponiendo que sea una marca de fecha).
Aquí está la entrada en el archivo apache sites.conf que causa el problema.
ErrorLog "|/usr/sbin/rotatelogs /var/www/html/site1/logs/error.log"
CustomLog "|/usr/sbin/rotatelogs /var/www/html/site1/logs/access.log 86400" combined
No le estoy diciendo que ponga un sello en el archivo, entonces ¿por qué lo hace?
La rotación de registros se describe aquí: https://httpd.apache.org/docs/2.4/programs/rotatelogs.html
Respuesta1
Mantener siempre el mismo nombre de archivo para el actualmente activo es lo que rotatelogs
está diseñado para evitar: abre un nuevo archivo con un sufijo único pero predecible (de forma predeterminada) o patrón de nombre (cuando usa %
caracteres) en el intervalo/condición predefinido.
En sitios con un número bajo de visitantes, sugeriría tener una configuración:
CustomLog "|/usr/sbin/rotatelogs -c /var/www/html/site1/logs/access.log.%Y.%m" combined
que genera un nuevo archivo de registro cada mes con el patrón de nombre para agosto de 2023 como access.log.2023.08
.
Para sitios que generan más tráfico: genere un nuevo archivo de registro diariamente (que es lo que hizo la opción 86400 que usó) y use
CustomLog "|/usr/sbin/rotatelogs -c /var/www/html/site1/logs/access.log.%Y.%m.%d " combined
Eso genera un nuevo archivo de registro todos los días con el patrón de nombre para el 24 de agosto de 2023 como access.log.2023.08.24
. (Un patrón como ese garantiza que un ls -l
archivo se ordenará en orden cronológico y es algo que encuentro mucho más fácil de usar access.log.24082023
que, por ejemplo, una preferencia personal).
Como ahora tengo un patrón de nombre de archivo predecible, puedo configurar el trabajo cron que se ejecuta justo después de la medianoche y que se ejecuta:
#!/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
Lo que crea un enlace simbólico desde accesss_log al archivo de registro actual de ese día.
Puede configurar fail2ban con el nombre de archivo estático que espera /var/www/html/site1/logs/access.log
y todo está bien.
Cuando no lo desea, normalmente configura Apache httpd con:
CustomLog /var/www/html/site1/logs/access.log combined
Entonces Apache hhtpd siempre escribirá eventos de registro en/var/www/html/site1/logs/access.log
Pero luego necesita configurar una función externa para rotar el archivo de registro y debido a que Apache httpd abre un identificador de archivo y cambiar el nombre /var/www/html/site1/logs/access.log
no /var/www/html/site1/logs/access.log.old-label
cierra ese identificador de archivo, necesita reiniciar Apache httpd.
Cuando no reinicia Apache httpd, todos los registros incluso continuarán escribiéndose /var/www/html/site1/logs/access.log.old-label
y no en un nuevo/var/www/html/site1/logs/access.log
Por supuesto, puedes escribirlo tú mismo, pero la mayoría de la gente usalogrotate
por eso en lugar de reinventar la rueda.
Respuesta2
HBruijn ya ha cubierto bien las partes del archivo de registro, pero volvería a su objetivo:
Estoy intentando que Fail2ban bloquee los ataques de fuerza bruta y persistentes xmlrpc y wp-login en un sitio de WordPress.
Los registros de acceso de Apache pueden ser bastante detallados para este propósito, y usted podría enfrentar problemas de rendimiento con su configuración, ya que Fail2ban intenta digerirlos y analizarlos todos.
Hay complementos de WordPress comoWP fall2baneso puede ayudar con esto creando eventos de auditoría que solo registren las fallas de inicio de sesión /var/log/auth.log
.
WP fail2ban proporciona el vínculo entre WordPress y 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 viene con tres filtros fail2ban:
wordpress-hard.conf
,wordpress-soft.conf
ywordpress-extra.conf
. Estos están diseñados para permitir una división entre la prohibición inmediata (dura) y el enfoque tradicional más elegante (suave), con reglas adicionales para configuraciones personalizadas.