Archivos de registro de Apache Fail2ban y WordPress

Archivos de registro de Apache Fail2ban y WordPress

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 rotatelogsestá 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 -larchivo se ordenará en orden cronológico y es algo que encuentro mucho más fácil de usar access.log.24082023que, 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.logy 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.logno /var/www/html/site1/logs/access.log.old-labelcierra 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-labely no en un nuevo/var/www/html/site1/logs/access.log

Por supuesto, puedes escribirlo tú mismo, pero la mayoría de la gente usalogrotatepor 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.confy wordpress-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.

información relacionada