Arquivos de log do Apache Fail2ban e WordPress

Arquivos de log do Apache Fail2ban e WordPress

Estou tentando fazer com que o Fail2ban bloqueie a força bruta e ataques persistentes de xmlrpc e wp-login em um site WordPress.

Eu tenho um problema com os nomes dos arquivos de log do Apache. Superar os problemas do Selinux foi bastante complicado, mas estou bem perto de fazê-lo funcionar.

Em primeiro lugar, aqui está meu arquivo Fail2Ban wordpress.conf (em 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

Isso está funcionando, mas quando olho para a saída de "fail2ban-client status wordpress" ele lista dezenas de arquivos de log, o que é inútil e ineficiente. Não consigo coletar o arquivo de log atual (hoje) sem reiniciar o serviço.

Aliás, atualmente está mostrando 43 endereços IP como “atualmente banidos”.

na minha pasta ./logs

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

A questão é que eu quero que o arquivo de log do Apache seja sempre chamado de "access.log" e depois girado para o formulário com a data. Então o fail2ban pode apenas olhar em "access.log" e sempre estará trabalhando no arquivo dos dias atuais. Não sei de onde vem o sufixo do carimbo de data (supondo que seja um carimbo de data).

Aqui está a entrada no arquivo apache sites.conf que está causando o 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

Não estou dizendo para colocar um carimbo no arquivo, então por que está fazendo isso?

A rotação de registros é descrita aqui: https://httpd.apache.org/docs/2.4/programs/rotatelogs.html

Responder1

Manter sempre o mesmo nome de arquivo para o atualmente ativo é o que rotatelogsdeve ser evitado - ele abre um novo arquivo com um sufixo exclusivo, mas previsível (por padrão) ou padrão de nome (quando você usa %caracteres) no intervalo/condição predefinido.

Em sites com baixa contagem de visitantes, sugiro ter uma configuração:

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

que gera um novo arquivo de log todos os meses com o padrão de nome para agosto de 2023, como access.log.2023.08.

Para sites que geram mais tráfego: gere um novo arquivo de log diariamente (que é o que a opção 86400 que você usou fez) e use

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

Isso gera um novo arquivo de log todos os dias com o padrão de nome para 24 de agosto de 2023, como access.log.2023.08.24. (Um padrão como esse garante que o ls -larquivo será classificado em ordem cronológica e é algo que considero muito mais fácil de usar do que, por exemplo, access.log.24082023uma preferência pessoal.)

Como agora tenho um padrão de nome de arquivo previsível, posso definir o cron job que é executado logo após a meia-noite:

#!/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 

O que cria um link simbólico de accesss_log para o arquivo de log atual daquele dia.

Você pode configurar o fail2ban com o nome de arquivo estático que ele espera /var/www/html/site1/logs/access.loge tudo estará certo.


Quando você não deseja isso, normalmente configure o Apache httpd com:

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

Então o Apache hhtpd sempre gravará eventos de log em/var/www/html/site1/logs/access.log

Mas então você precisa configurar uma função externa para girar o arquivo de log e como o Apache httpd abre um identificador de arquivo e renomear /var/www/html/site1/logs/access.logpara /var/www/html/site1/logs/access.log.old-labelnão fecha esse identificador de arquivo, você precisa reiniciar o apache httpd.
Quando você não reinicia o Apache httpd, todos os eventos de log continuarão a ser gravados /var/www/html/site1/logs/access.log.old-labele não em um novo/var/www/html/site1/logs/access.log

É claro que você mesmo pode criar um script, mas a maioria das pessoas usalogrotatepara isso, em vez de reinventar a roda.

Responder2

HBruijn já cobriu bem as partes do arquivo de log, mas eu voltaria ao seu objetivo:

Estou tentando fazer com que o Fail2ban bloqueie a força bruta e ataques persistentes de xmlrpc e wp-login em um site WordPress.

Os logs de acesso do Apache podem ser bastante detalhados para essa finalidade, e você pode enfrentar problemas de desempenho com sua configuração, pois o Fail2ban tenta digerir e analisar todos eles.

Existem plug-ins do WordPress comoWP fail2banque pode ajudar com isso criando eventos de auditoria que registram apenas as falhas de login no /var/log/auth.log.

WP fail2ban fornece o link entre WordPress e 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 vem com três filtros fail2ban: wordpress-hard.conf, wordpress-soft.confe wordpress-extra.conf. Eles foram projetados para permitir uma divisão entre o banimento imediato (forte) e a abordagem tradicional mais elegante (suave), com regras extras para configurações personalizadas.

informação relacionada