Expulsando todos os que tentam acesso não autorizado ao servidor com fail2ban!
Olá, sou um incompetente. No artigo anterior https://soulminingrig.com/blog/what\-country\-is\-the\-person\-trying\-to\-gain\-unauthorized\-access\-to\-my\-server\-via\-ssh/, pude confirmar que havia muitas tentativas de acesso de IPs diferentes em apenas um dia. Embora eu tenha deixado o servidor funcionando sem preocupações até agora e nunca tenha sido realmente acessado indevidamente, medidas devem ser tomadas.
Além disso, francamente, o acúmulo de arquivos de log está se tornando muito grande e difícil de ler, o que é um pouco irritante. Por isso, decidi instalar o Fail2Ban, que me interessou quando foi incluído como dependência durante a instalação do iRedMail há algum tempo.
O que é isso?
É possível bloquear IPs individualmente quando há um número configurado de tentativas detectadas pela auditoria de logs.
Além disso, é possível fazer com que os próprios pacotes das tentativas sejam perdidos via iptables.[Instalação
Como estou logado como root desta vez, não usarei sudo. Ao pesquisar com `pkg search`, o seguinte pacote apareceu, então vou instalá-lo.
pkg install py311-fail2ban-1.1.0
Basicamente, não é recomendado modificar o arquivo de configuração fail2ban.conf diretamente; em vez disso, deve-se criar e escrever em jail.local. Portanto, desta vez,
SSH, Postfix, Dovecot
Como detesto tentativas de login relacionadas a estes três, vou configurá-los.
Além disso, ao consultar vários sites, parece que é possível configurar não apenas em segundos, mas também em '1w' (uma semana) e '1d' (um dia), então farei uma configuração bem agressiva. Vou banir sem piedade por uma semana.
~ # cat /usr/local/etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
bantime = 1w
findtime = 1d
maxretry = 5
[postfix]
enabled = true
port = smtp,ssmtp,submission
logpath = /var/log/maillog
bantime = 1w
findtime = 1d
maxretry = 10
action = block-drop[name=postfix, port=smtp, protocol=tcp]
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission
logpath = /var/log/maillog
bantime = 1w
findtime = 1d
maxretry = 10
action = block-drop[name=dovecot, port=imap, protocol=tcp]
Parece que seria melhor criar uma seção [default], mas por enquanto, vou aplicar apenas a esses três e adicionarei mais se parecer necessário. A propósito, as razões para definir o banimento para uma semana são:
-
Em primeiro lugar, como estou usando autenticação por chave, não há como errar.
-
Uma vez logado no servidor de e-mail, a autenticação de login permanece por um tempo, então raramente tento fazer login manualmente.
-
Uma vez banido, quero que os pacotes sejam completamente perdidos.
-
Mais de 5 erros de login por dia é, por si só, incomum.
Então, é bastante rigoroso? Ou talvez brando? Não quero consumir muitos recursos com períodos de banimento curtos, então fiz assim. A propósito, parece que também é possível banir métodos GET em servidores HTTP: https://hana-shin.hatenablog.com/entry/2023/05/24/210949 Como só uso este servidor como um servidor intermediário, ainda não o implementei, mas talvez o faça se parecer necessário. E, adicionalmente, estou usando action = block-drop, cuja configuração é a seguinte.
# cat /usr/local/etc/fail2ban/action.d/block-drop.conf
[Definition]
actionstart = iptables -N f2b-<name>
iptables -A f2b-<name> -j DROP
iptables -I INPUT -p all -j f2b-<name>
iptables -I FORWARD -p all -j f2b-<name>
actionstop = iptables -D INPUT -p all -j f2b-<name>
iptables -D FORWARD -p all -j f2b-<name>
iptables -F f2b-<name>
iptables -X f2b-<name>
actioncheck = iptables -n -L INPUT | grep -q 'f2b-<name>[ ]'
actionban = iptables -I f2b-<name> -s <ip> -j DROP
actionunban = iptables -D f2b-<name> -s <ip> -j DROP
Basicamente, quando um IP é banido, faço com que os pacotes sejam descartados (Drop) completamente. Pensei que 'Reject' também existia e, ao verificar novamente em https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables, concluí que 'Reject' deve ser usado quando se quer que o remetente saiba que foi recusado. Como se trata de um banimento, decidi descartar os pacotes sem piedade, enviando-os para a escuridão.
Inicialização e Verificação de Integridade
Como é FreeBSD, inicia-se assim:
service fail2ban start
Se 'Server ready' aparecer, está tudo bem. Vou verificar os logs para confirmar se está funcionando corretamente.
# tail /var/log/fail2ban.log
2024-07-24 13:34:05,654 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:05,755 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:05,884 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:06,000 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:06,317 fail2ban.actions [39963]: WARNING [sshd] already banned
2024-07-24 13:34:06,731 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:06
2024-07-24 13:37:14,327 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:37:14
2024-07-24 13:42:12,266 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:12
2024-07-24 13:42:17,389 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:17
2024-07-24 13:42:23,357 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:23
Normalmente, os endereços IP seriam exibidos, mas desta vez os ocultei corretamente. Já foi banido! Peguei você, seu pirralho! Estou gritando isso no meu coração.
(De qualquer forma, é um bot, o que estou pensando ao comemorar contra uma máquina?) Deixando de lado essa comemoração boba, adicionarei o seguinte a /etc/rc.conf para que ele inicie automaticamente.
fail2ban_enable="YES"
Com isso, o processo será iniciado automaticamente mesmo após a reinicialização do servidor.
Então, por hoje é só. A propósito, pensei que seria interessante exibir em um gráfico quais nomes de usuário foram usados nas tentativas de login nos logs recebidos até agora. Até a próxima.