Como instalar e configurar Fail2ban no Linux
Fail2ban é um software gratuito e de código aberto que podemos usar para mitigar ataques de força bruta e DoS/DDoS: ele verifica os arquivos de log em busca de múltiplas tentativas de autenticação malsucedidas e proíbe endereços IP relacionados criando regras de firewall ad-hoc.
Neste tutorial, vemos como instalar e configurar o fail2ban no Linux e aprendemos os conceitos básicos por trás de seu uso.
Neste tutorial, você aprenderá:
- Como instalar o Fail2ban em algumas das distribuições Linux mais usadas
- Como configurar Fail2ban
- Como usar o utilitário fail2ban-client
Instalação
Fail2ban está disponível nos repositórios oficiais de todas as distribuições Linux mais utilizadas. Para instalá-lo no Debian e na distribuição baseada em Debian, podemos usar o seguinte comando:
$ sudo apt install fail2ban
No Fedora realizamos a instalação com o gerenciador de pacotes dnf
:
$ sudo dnf install fail2ban
Antes de podermos realizar a instalação no RHEL ou em um de seus clones como Rocky Linux, precisamos adicionar o repositório EPEL (Extra Package for Enterprise Linux) como fonte de software. No caso do Rocky esta é uma operação muito simples, pois o repositório é configurado automaticamente quando instalamos o pacote epel-release
:
$ sudo dnf install epel-release
Se estiver usando o próprio RHEL, o pacote pode ser baixado e instalado no site da EPEL.
Para garantir que o serviço fail2ban esteja ativo e iniciado na inicialização, lançamos o seguinte comando:
$ sudo systemctl enable --now fail2ban
Configuração Fail2ban
Uma vez instalado o pacote Fail2ban, todos os seus arquivos de configuração podem ser encontrados no diretório /etc/fail2ban
. Devemos evitar modificar arquivos que vêm como parte da instalação (aqueles com extensão “.conf”) e, em vez disso, colocar configurações personalizadas em arquivos correspondentes com extensões “.local”. O arquivo de configuração principal do fail2ban é /etc/fail2ban/fail2ban.conf
. Este arquivo contém configurações genéricas, como o nível de log fail2ban. Colocamos valores de substituição no arquivo /etc/fail2ban/fail2ban.local
, que deve ser criado se não existir. Para alterar o nível de log de “INFO” (o padrão) para “DEBUG”, por exemplo, escreveríamos:
[DEFAULT]
loglevel = DEBUG
Existem três “entidades” principais com as quais temos que lidar ao trabalhar com Fail2ban: filtros, ações e prisões. Vamos dar uma olhada neles.
Filtros
Fail2ban verifica arquivos de log e procura tentativas de autenticação malsucedidas. Com os filtros, basicamente informamos como reconhecer tentativas de autenticação nos arquivos de log de serviços específicos. Filtros prontos para uso podem ser encontrados no diretório /etc/fail2ban/filter.d
:
$ ls /etc/fail2ban/filter.d
3proxy.conf domino-smtp.conf mysqld-auth.conf selinux-ssh.conf
apache-auth.conf dovecot.conf nagios.conf sendmail-auth.conf
apache-badbots.conf dropbear.conf named-refused.conf sendmail-reject.conf
apache-botsearch.conf drupal-auth.conf nginx-botsearch.conf sieve.conf
apache-common.conf ejabberd-auth.conf nginx-http-auth.conf slapd.conf
apache-fakegooglebot.conf exim-common.conf nginx-limit-req.conf softethervpn.conf
apache-modsecurity.conf exim.conf nsd.conf sogo-auth.conf
apache-nohome.conf exim-spam.conf openhab.conf solid-pop3d.conf
apache-noscript.conf freeswitch.conf openwebmail.conf squid.conf
apache-overflows.conf froxlor-auth.conf oracleims.conf squirrelmail.conf
apache-pass.conf gitlab.conf pam-generic.conf sshd.conf
apache-shellshock.conf grafana.conf perdition.conf stunnel.conf
assp.conf groupoffice.conf phpmyadmin-syslog.conf suhosin.conf
asterisk.conf gssftpd.conf php-url-fopen.conf tine20.conf
bitwarden.conf guacamole.conf portsentry.conf traefik-auth.conf
botsearch-common.conf haproxy-http-auth.conf postfix.conf uwimap-auth.conf
centreon.conf horde.conf proftpd.conf vsftpd.conf
common.conf ignorecommands pure-ftpd.conf webmin-auth.conf
counter-strike.conf kerio.conf qmail.conf wuftpd.conf
courier-auth.conf lighttpd-auth.conf recidive.conf xinetd-fail.conf
courier-smtp.conf mongodb-auth.conf roundcube-auth.conf znc-adminlog.conf
cyrus-imap.conf monit.conf screensharingd.conf zoneminder.conf
directadmin.conf murmur.conf selinux-common.conf
Ações
As ações Fail2ban são definidas no diretório /etc/fail2ban/action.d
. As ações recebem o nome do software usado para impor o banimento. Vejamos um exemplo. UFW (Uncomplicated Firewall) é um gerenciador de firewall projetado para ser fácil de usar; este é o conteúdo do arquivo /etc/fail2ban/action.d/ufw.conf
:
# Fail2Ban action configuration file for ufw
#
# You are required to run "ufw enable" before this will have any effect.
#
# The insert position should be appropriate to block the required traffic.
# A number after an allow rule to the application won't be of much use.
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = [ -n "<application>" ] && app="app <application>"
ufw insert from to $app
actionunban = [ -n "<application>" ] && app="app <application>"
ufw delete from to $app
[Init]
# Option: insertpos
# Notes.: The position number in the firewall list to insert the block rule
insertpos = 1
# Option: blocktype
# Notes.: reject or deny
blocktype = reject
# Option: destination
# Notes.: The destination address to block in the ufw rule
destination = any
# Option: application
# Notes.: application from sudo ufw app list
application =
Uma ação é composta por duas seções principais: “Definição” e “Iniciar”. Os comandos especificados no primeiro são executados em diferentes situações: como etapa preliminar (actioncheck), quando uma jail inicia (actionstart), quando ela termina (actionstop), para banir (actionban) e para desbanir (actionunban) um endereço IP.
A seção “Init” contém configurações específicas de ações. Na ação ufw que relatamos acima, por exemplo, você pode ver que ela contém instruções sobre a posição da regra de firewall na lista de regras (insertpos=1) e o tipo de bloco a ser usado (rejeitar vs negar).
Prisões
Finalmente, temos prisões. Uma prisão basicamente associa um filtro e uma ou mais ações. O arquivo de configuração principal do Fail2ban para jails é /etc/fail2ban/jail.conf
; arquivos de configuração drop-in podem ser colocados no diretório /etc/fail2ban/jail.d
.
As prisões são nomeadas de acordo com o filtro que usam: se uma prisão tiver o nome “sshd”, por exemplo, ela será associada ao filtro /etc/fail2ban/filter.d/sshd.conf
, a menos que um seja especificado explicitamente através da opção “filtro”. O nome da prisão é especificado entre colchetes. O Debian fornece uma substituição para a prisão sshd por padrão. Ele está definido no arquivo /etc/fail2ban/jail.d/defaults-debian.conf
:
[sshd]
enabled = true
Os parâmetros padrão para a prisão “sshd” estão no arquivo de configuração principal da prisão. O Debian fornece essa substituição com o parâmetro “enabled” definido como “true” apenas para garantir que a prisão esteja ativa. Aqui estão alguns parâmetros que podem ser usados ao definir uma jail, ou na seção “default” (efetivo para todas as jails existentes):
Option | Role | Default value |
---|---|---|
filter | Filter used by the jail | The filter corresponding to the jail name under /etc/fail2ban/filter.d |
logpath | Specifies the path(s) of the logfiles to be monitored | service-dependent |
action | Actions(s) to be used by the jail. Actions are named after the file in which they are defined, without the extension | %(action)s – see below |
ignoreip | List of IP addresses to ignore | None |
bantime | The ban duration expressed in seconds or with explicitly time suffixes | 10m |
findtime | The interval of time during which the specified number of failed authentication attempts must occur for an IP to be banned | 10m |
maxretry | The number of failures which must occur in the specified findtime to trigger a ban | 5 |
Como a ação padrão é definida
Se você der uma olhada no arquivo de configuração principal do jail (/etc/fail2ban/jail.conf
), na seção “default”, você pode ver que a ação está definida da seguinte maneira (linha 268) :
action = %(action_)s
Na definição acima a variável _action
é “expandida” e seu valor é atribuído ao parâmetro “action”. A própria variável _action
é definida algumas linhas acima (linha 212 no Debian):
action_ = __ %(banaction)s[port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
Nesta expressão algumas outras variáveis são usadas:
- banaction: esta é a ação de banimento “principal”, definida como iptables-multiport por padrão
- port: as portas a serem banidas – definidas como 0:65535 por padrão, para serem substituídas em jails específicas
- protocolo: o protocolo usado na regra de firewall para impor o banimento – tcp por padrão
- chain: a cadeia na qual os saltos devem ser adicionados nas ações de banimento que esperam este parâmetro
As variáveis porta, protocolo e cadeia são utilizadas entre colchetes, separadas por vírgula. Com esta sintaxe, eles são passados como “argumentos” e substituem os respectivos placeholders contidos na definição da ação. Aqui, “action_” é uma das macros disponíveis, que apenas impõe um banimento. Outros são definidos abaixo dele. Alguns exemplos são:
- action_mw – Aplica o banimento e envia um e-mail contendo um relatório whois para o e-mail especificado
- action_mwl – Igual ao acima, mas inclui linhas de log relevantes
Vamos ser banidos!
Vamos verificar se o fail2ban funciona corretamente e permitir que ele provoque um banimento. Como vimos antes, o findtime padrão é 10 minutos e o valor padrão de maxretry é 5: isso significa que se falharmos em 5 tentativas de autenticação em 10 minutos, nosso IP (192.168.122.1 para este exemplo) será banido.
Tento me conectar via SSH ao host com IP 192.168.122.93 fornecendo uma senha errada propositalmente. Isso aciona o banimento do host remoto. Podemos verificar isso dando uma olhada no log do fail2ban:
$ sudo tail /var/log/fail2ban.log
As linhas relevantes são:
2023-09-27 15:54:47,028 fail2ban.actions
[2829]: NOTICE [sshd] Ban 192.168.122.1
Como você pode ver, o IP 192.168.122.1 foi banido. Uma maneira mais conveniente de verificar todos os banimentos ativos é usar o utilitário fail2ban-client. Para obter uma lista de IPs banidos, usamos-a com o subcomando “banned”:
$ fail2ban-client banned
[{'sshd': ['192.168.122.1']}]
Para desbanir um IP (de todas as jails), em vez disso, passamos ele como argumento para o subcomando unban
:
$ sudo fail2ban-client unban 192.168.122.1
O utilitário fail2ban-client também pode ser usado para controlar o servidor (iniciar, parar, recarregá-lo) e realizar algumas configurações de tempo de execução.