Então, fiz uma série de pesquisas sobre como fazer isso depois de assistir o mesmo endereço IP atingir meu cluster de servidores da Web, um após o outro. Como estou usando a AWS, achei que poderia ser uma maneira fácil e funcionaria perfeitamente nos meus dois primeiros dias de teste de 5 servidores.
A primeira coisa que recomendo é desativar temporariamente o SELinux; lidaremos com isso no final. Não sou especialista em SELinux, mas o que fiz funcionou até agora.
O requisito principal é uma fonte de arquivo compartilhada, eu uso o AWS EFS. Depois que a nova unidade é provisionada e montada, alterei o logtarget dentro de /etc/fail2ban/fail2ban.conf para uma subpasta na unidade EFS.
logtarget = /efsmount/fail2ban/server1.log
Então eu escrevi um filtro simples e coloquei em /etc/fail2ban/filter.d/fail2ban-log.conf
[Definition]
failregex = .* Ban <HOST>
ignoreregex =
Adicionado o filtro para /etc/fail2ban/jail.local
[fail2ban-log]
enabled = true
port = http,https
findtime = 86400 ; 1 day
logpath = /efsmount/fail2ban/server1.log
/efsmount/fail2ban/server2.log
/efsmount/fail2ban/server3.log
/efsmount/fail2ban/server4.log
maxretry = 1
Em seguida, reiniciou o fail2ban
sudo fail2ban-client reload
Por enquanto, tudo bem! Não, a parte dolorosa é o SELinux. Depois de deixar o fail2ban rodar um pouco, executei este comando que permitiria o fail2ban através dos filtros.
sudo grep fail2ban /var/log/audit/audit.log | sudo audit2allow -M fail2ban-nfs
O Audit2allow solicitará que você execute este comando
sudo semodule -i fail2ban-nfs.pp
Ainda estou checando meus logs do SELinux aqui e ali para ver se há mais negações. Se alguém tiver uma dica sobre como obter esse SELinux claro com outro método, isso seria incrível.
sudo cat /var/log/audit/audit.log |grep fail2ban |grep denied
Neste ponto, eu ainda estava recebendo erros ao reiniciar o fail2ban. Há um erro ao usar action = action_mwl no jail.local. Depois de pesquisar um pouco, achei isso que está funcionando até agora. Pelo que li, por causa das quebras de linha na diretiva de caminho de log, apontando para vários arquivos. Eu tentei com vírgulas, espaços, etc, nada mais funcionou com action_mwl.
action_mwm = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
%(mta)s-whois-matches[name=%(__name__)s, dest="%(destemail)s", chain="%(chain)s"]
action = %(action_mwm)s
Não se esqueça de ativar o SELinux novamente!