Criando Suas Próprias Ações no fail2ban - Parte 3
#
Postado em 04.08.2011 00:00
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 address # number of failures #
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](https://web.archive.org/web/20110827104139/http://sendxmpp.platon.sk/) 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](http://ubuntuforums.org/showpost.php?s=0ecf5b2a9c9a97fbfa5438c354dcfc2c&p=8876182&postcount=3). Conheci o sendxmpp num [post](http://eriberto.pro.br/blog/2011/03/02/mensagens-jabber-via-linha-de-comando-ideal-para-servidores-de-rede/) do [blog](http://eriberto.pro.br/blog/) do [João Eriberto Mota Filho](http://eriberto.pro.br/site/) ([@eribertomota](https://twitter.com/eribertomota)).
Vamos à listagem do arquivo `action.d/gtalk.local`:
[Definition]
actionstart = printf %%b "Hi,\n
The jail has been started successfully.\n
Regards,\n
Fail2Ban"|sendxmpp -t -u -o gmail.com
actionstop = printf %%b "Hi,\n
The jail has been stopped.\n
Regards,\n
Fail2Ban"|sendxmpp -t -u -o gmail.com
actioncheck =
actionban = printf %%b "Hi,\n
The IP has just been banned by Fail2Ban after
attempts against .\n
Regards,\n
Fail2Ban"|sendxmpp -t -u -o gmail.com
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!
{{< figure src="screenshot.png" alt="Janela de chat do mensageiro instantâneo Pidgin, mostrando mensagens enviadas pelo fail2ban." title="Janela de chat do mensageiro instantâneo Pidgin, mostrando mensagens enviadas pelo fail2ban." >}}