GMGall’s blog

Programação, Linux e o que mais der na telha

Criando suas próprias ações no fail2ban – parte 3

Criando suas próprias ações

Estrutura de uma ação

Cada ação é um arquivo no diretório action.d. Esses arquivos seguem a seguinte estrutura:

[Definition]

# Option:  actionstart
# Notes.:  comando executado ao iniciar o Fail2Ban.
# Values:  CMD
#
actionstart =


# Option:  actionstop
# Notes.:  comando executado ao encerrar o Fail2Ban
# Values:  CMD
#
actionstop =


# Option:  actioncheck
# Notes.:  comando executado antes de cada comando actionban
# Values:  CMD
#
actioncheck =


# Option:  actionban
# Notes.:  comando executado ao banir um IP. Observe que o comando
#          é executado com as permissões do usuário executando o Fail2Ban.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
actionban = ipfw add deny tcp from <ip> to <localhost> <port>


# Option:  actionunban
# Notes.:  comando executado ao "desbanir" um IP. Observe que o comando
#          é executado com as permissões do usuário executando o Fail2Ban.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
actionunban = ipfw delete `ipfw list | grep -i <ip> | awk '{print $1;}'`

[Init]

# Option:  port
# Notes.:  specifies port to monitor
# Values:  [ NUM | STRING ]
#
port = ssh

# Option:  localhost
# Notes.:  the local IP address of the network interface
# Values:  IP
#
localhost = 127.0.0.1

O arquivo que usei de exemplo acima já vem com o pacote e configura uma ação que usa o ipfw para bloquear os IPs. Traduzi os comentários da seção [Definition] para explicar o que cada entrada define.

A seção [Init] define “variáveis” que podem ser usadas ao longo do arquivo. Nesse exemplo, port e localhost, mas que variáveis definir é por conta do usuário. Lembrando que <ip> vira o IP/hostname casado no grupo <host> dos filtros.

Definindo uma ação

Existem ações predefinidas que bloqueiam por iptables, ipfw, shorewall, TCP wrappers, que avisam por e-mail a cada bloqueio… Mas não existe nenhuma que avise via Gtalk. Vamos criar uma ação que faz isso.

Usarei o programa sendxmpp para definir uma ação que enviará uma mensagem para mim no Gtalk a cada evento. Como configurar o sendxmpp para o Gtalk pode ser visto aqui. Conheci o sendxmpp num post do blog do João Eriberto Mota Filho (@eribertomota).

Vamos à listagem do arquivo action.d/gtalk.local:

[Definition]

actionstart = printf %%b "Hi,\n
              The jail <name> has been started successfully.\n
              Regards,\n
              Fail2Ban"|sendxmpp -t -u <from> -o gmail.com 

actionstop = printf %%b "Hi,\n
             The jail <name> has been stopped.\n
             Regards,\n
             Fail2Ban"|sendxmpp -t -u <from> -o gmail.com 

actioncheck =

actionban = printf %%b "Hi,\n
            The IP <ip> has just been banned by Fail2Ban after
            <failures> attempts against <name>.\n
            Regards,\n
            Fail2Ban"|sendxmpp -t -u <from> -o gmail.com <to>

actionunban =

[Init]

name = default

from =

to =

Essa ação enviará uma mensagem para o usuário definido em to tendo como remetente o usuário definido em from ao iniciar, parar e ao bloquear um IP.

Ativando sua ação

As ações são definidas por jail ou globalmente na seção [DEFAULT] de jail.local. Ações definidas nas jails tem prioridade sobre as definidas globalmente.

Observe o seguinte trecho de jail.local:

#
# ACTIONS
#

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

# email action. Since 0.8.1 upstream fail2ban uses sendmail
# MTA for the mailing. Change mta configuration parameter to mail
# if you want to revert to conventional 'mail'.
mta = sendmail

# Default protocol
protocol = tcp

#
# Action shortcuts. To be used to define action parameter

# The simplest action to take: ban only
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]

# ban & send an e-mail with whois report to the destemail.
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
%(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]

# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
%(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]

# Choose default action. To change, just override value of 'action' with the
# interpolation to the chosen action shortcut (e.g. action_mw, action_mwl, etc) in jail.local
# globally (section [DEFAULT]) or per specific section
action = %(action_)s

A variável action define a ação globalmente. As outras variáveis definidas antes (action_mvl, action_mw e action_) são atalhos úteis. Leia os comentários com atenção para entender como essas variáveis interagem.

Repare que mais de uma ação pode ser setada por linha e que cada ação pode receber parâmetros entre colchetes. Esses parâmetros definem os valores das variáveis declaradas na seção [Init]. Os atalhos action_mvl, action_mw e action_ são úteis por já ativarem ações e passarem parâmetros funcionais para tarefas rotineiras como banir e enviar um e-mail com informações úteis.

Para definir nossa ação gtalk globalmente, basta fazer

action = %(action_)s
        gtalk[name=%(__name__)s, from=gmgall, to=gmgall]

e recarregar as configurações do serviço:

# /etc/init.d/fail2ban reload

Funciona!

Screenshot do pidgin mostrando a mensagem enviada pela ação que acabamos de criar

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: