Proteção utilizando fail2ban contra ataques do tipo "força bruta" or brute force


O aplicativo fail2ban, é um agente que monitora os logs, e verifica a quantidade de tentativas de conexão sem sucesso, bloqueando o IP suspeito, após determinado número de insucessos.

O fail2ban pode monitorar a tentativa de login nos serviços ssh, pam, xinetd, apache, vsftpd, proftpd, wuftpd, postfix, couriersmtp, courierauth, sasl e named, e em uma ação pro-átiva bloquear o possível ataque, adicionando uma regra no firewall.

Fail2ban é eficaz em parar ataques de força bruta (brute force), que são comum a hosts conectados à Internet, de maneira elegante, confiável e funcional, sem causar prejuízos aos usuários autênticos dos sistemas e serviços oferecidos.


Este aplicativo pode ser encontrado em sua página oficial http://www.fail2ban.org; é desenvolvido na linguagem python, que o torna portável para praticamente todo sistema operacional.

Em seu site oficial, na seção de downloads (http://www.fail2ban.org/wiki/index.php/Downloads), encontra-se a lista de distribuições que já possuem pacotes para seus fontes. No momento em que este artigo foi escrito, as distribuições eram: Gentoo, Debian, Ubuntu, Fedora, Red Hat/CentOS, Gral Linux, Ipcop, Mandriva, SUSE, openSUSE, ArchLinux, Slackware, FreeBSD e Mac OS X.


Instalação do fail2ban

Requisitos:
python-2.3 ou superior; (http://www.python.org)


Requisitos Opcionais:
gamin-0.0.21 ou superior; (http://www.gnome.org/~veillard/gamin)



Instalação pelos fontes:
wget http://sourceforge.net/projects/fail2ban/files/fail2ban-stable/fail2ban-0.8.4/fail2ban-0.8.4.tar.bz2

tar xvfj fail2ban-0.8.4.tar.bz2 -C /tmp
cd /tmp/fail2ban-0.8.4
python setup.py install


Instalação Debian-like:
aptitude install fail2ban;


Instalação RedHat-like:
1º baixe o rpm adequando para versão Enterprise Linux (EL)utilizada:
EL6:
wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm; ou
EL5:
wget http://mirrors.ucr.ac.cr/epel/5/i386/epel-release-5-3.noarch.rpm; ou
EL4:
wget http://download.fedoraproject.org/pub/epel/4/i386/epel-release-4-10.noarch.rpm;


2º Considerando Centos 5.5, proceda com o comando abaixo para configurar o repositório EPEL:
wget http://mirrors.ucr.ac.cr/epel/5/i386/epel-release-5-3.noarch.rpm
rpm -ivh epel-release-5-3.noarch.rpm

3º e ultimo passo, instalar o fail2ban.
yum install fail2ban;


Configuração
Após a instalação o fail2ban disponibilizará o diretório de configuração '/etc/fail2ban'.
ls /etc/fail2ban/
action.d fail2ban.conf filter.d jail.conf


Os arquivos interessantes para configuração são os destacados de amarelo, vejamos primeiro o fail2ban.conf.

8 [Definition]
9
10 # Option: loglevel
11 # Notes.: Set the log level output.
12 # 1 = ERROR
13 # 2 = WARN
14 # 3 = INFO
15 # 4 = DEBUG
16 # Values: NUM Default: 3
17 #
18 loglevel = 3
19
20 # Option: logtarget
21 # Notes.: Set the log target. This could be a file, SYSLOG, STDERR or STDOUT.
22 # Only one log target can be specified.
23 # Values: STDOUT STDERR SYSLOG file Default: /var/log/fail2ban.log
24 #
25 logtarget = /var/log/fail2ban.log

As linhas importantes deste arquivo são a 18 e a 25, que definem o nível de informação no log e o arquivo de log do fail2ban, para acompanhamento e possíveis correções.

Já no arquivo '/etc/jail.conf', é onde tem-se a maior parte da configuração.

..
18 [DEFAULT]
19
20 # "ignoreip" can be an IP address, a CIDR mask or a DNS host
21 ignoreip = 127.0.0.1
22 bantime = 600
23 maxretry = 3
..

Nas diretivas:
  • ignoreip: é listado os endereços de IP (ex: 127.0.0.1), ou Mascara CIDR-Classless Inter Domain Routing (ex: 192.168.12.0/23, onde 192.168.12.0/23 = 192.168.12.0/24 + 192.168.13.0/24), ou DNS host (ex: perfumes.incolume.com.br ou brito.blog.incolume.com.br), que deverão ser ignorados pelo fail2ban;

  • bantime: é definido o tempo em segundos, que o IP ofensor ficará banido e/ou bloqueado para o serviço;

  • maxretry: é definido a quantidade máxima de tentativas de acesso.

..
32 # Destination email address used solely for the interpolations in
33 # jail.{conf,local} configuration files.
34 destemail = root@localhost
35
36 #
..



  • destemail: Define o email que receberá as notificações, claro, que somente, se o smtp estiver configurado.


  • ..
    40 # Default banning action (e.g. iptables, iptables-new,
    41 # iptables-multiport, shorewall, etc) It is used to define
    42 # action_* variables. Can be overriden globally or per
    43 # section within jail.local file
    44 banaction = iptables-multiport
    ..

  • banaction, linha 44, define qual a ação de banimento será executada, se o firewall for iptables, não modifique.


  • ..
    90 [ssh]
    91
    92 enabled = true
    93 port = ssh
    94 filter = sshd
    95 logpath = /var/log/auth.log
    96 maxretry = 6
    97 sendmail-whois[name=SSH, dest=brito@incolume.com.br, sender=perfumes@incolume.com.br]
    ..

    Finalmente a definição de segurança para os serviços, os quais estão destacados entre colchetes como no fragmento acima, [ssh], [pam-generic], e assim sucessivamente. Estre trecho conterá as mesmas diretivas, para qualquer serviço configurado.


  • enabled: habilita ou desabilita a verificação do serviço;

  • port: a porta na qual o serviço esculta;

  • filter: padrão que será utilizada para identificação do filtro;

  • logpath: arquivo de log com caminho completo;

  • maxretry: quantidade máxima de tentativas de acesso;

  • sendmail-whois: a configuração de notificação por email, sender=remetente, dest = destinatário e name = Assunto;



  • Exemplo de monitoração ao PAM e xinetd:
    ..
    [pam-generic]

    enabled = false
    # pam-generic filter can be customized to monitor specific subset of 'tty's
    filter = pam-generic
    # port actually must be irrelevant but lets leave it all for some possible uses
    port = all
    banaction = iptables-allports
    port = anyport
    logpath = /var/log/auth.log
    maxretry = 6

    [xinetd-fail]

    enabled = false
    filter = xinetd-fail
    port = all
    banaction = iptables-multiport-log
    logpath = /var/log/daemon.log
    maxretry = 2
    ..


    Exemplo de monitoração ao apache:
    ..
    #
    # HTTP servers
    #

    [apache]

    enabled = false
    port = http,https
    filter = apache-auth
    logpath = /var/log/apache*/*error.log
    maxretry = 6

    # default action is now multiport, so apache-multiport jail was left
    # for compatibility with previous (<0.7.6-2) releases
    [apache-multiport]

    enabled = false
    port = http,https
    filter = apache-auth
    logpath = /var/log/apache*/*error.log
    maxretry = 6

    [apache-noscript]

    enabled = false
    port = http,https
    filter = apache-noscript
    logpath = /var/log/apache*/*error.log
    maxretry = 6

    [apache-overflows]

    enabled = false
    port = http,https
    filter = apache-overflows
    logpath = /var/log/apache*/*error.log
    maxretry = 2
    ..


    Exemplo de monitoração ao FTP:
    ..
    #
    # FTP servers
    #

    [vsftpd]

    enabled = false
    port = ftp,ftp-data,ftps,ftps-data
    filter = vsftpd
    logpath = /var/log/vsftpd.log
    # or overwrite it in jails.local to be
    # logpath = /var/log/auth.log
    # if you want to rely on PAM failed login attempts
    # vsftpd's failregex should match both of those formats
    maxretry = 6


    [proftpd]

    enabled = false
    port = ftp,ftp-data,ftps,ftps-data
    filter = proftpd
    logpath = /var/log/proftpd/proftpd.log
    maxretry = 6


    [wuftpd]

    enabled = false
    port = ftp,ftp-data,ftps,ftps-data
    filter = wuftpd
    logpath = /var/log/auth.log
    maxretry = 6
    ..


    Exemplo de monitoração ao DNS:
    ..
    # DNS Servers


    # These jails block attacks against named (bind9). By default, logging is off
    # with bind9 installation. You will need something like this:
    #
    # logging {
    # channel security_file {
    # file "/var/log/named/security.log" versions 3 size 30m;
    # severity dynamic;
    # print-time yes;
    # };
    # category security {
    # security_file;
    # };
    # };
    #
    # in your named.conf to provide proper logging

    # Word of Caution:
    # Given filter can lead to DoS attack against your DNS server
    # since there is no way to assure that UDP packets come from the
    # real source IP
    [named-refused-udp]

    enabled = false
    port = domain,953
    protocol = udp
    filter = named-refused
    logpath = /var/log/named/security.log

    [named-refused-tcp]

    enabled = false
    port = domain,953
    protocol = tcp
    filter = named-refused
    logpath = /var/log/named/security.log
    ..



    Versão PDF


    Referências:
    http://sourceforge.net/projects/fail2ban/files/fail2ban-stable/fail2ban-0.8.4/
    http://fedoraproject.org/wiki/EPEL
    https://fedoraproject.org/keys
    http://en.wikipedia.org/wiki/CIDR_notation
    http://compnetworking.about.com/od/workingwithipaddresses/a/cidr_notation.htm
    http://www.petri.co.il/whats_cidr.htm

    Comentários