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 rotatelogs
deve 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 -l
arquivo será classificado em ordem cronológica e é algo que considero muito mais fácil de usar do que, por exemplo, access.log.24082023
uma 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.log
e 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.log
para /var/www/html/site1/logs/access.log.old-label
nã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-label
e 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 usalogrotate
para 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.conf
ewordpress-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.