Criando Suas Próprias Ações no fail2ban - Parte 3
tech linux sysadmin fail2ban debianEstrutura 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!
