Pesquisa de site

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.

Conclusões

Artigos relacionados: