Fail2ban vous prévient par SMS avec l’API de Free Mobile

Fail2ban est un outil très pratique pour protéger les serveurs de certaines attaques.

Et en plus, il peut vous prévenir par SMS, si vous avez une carte SIM de Free Mobile

fail2ban

Configuration des filters

Je pensais que la configuration par défaut des filters sous Debian fonctionnait à coup sûr : j’avais tort.

Je vous conseille de tester chaque filter (avec fail2ban-regex, ou en simulant une vraie attaque). J’ai dû plusieurs fois modifier les expressions régulières pour qu’elles correspondent aux logs effectivement générées par mon serveur Apache :

failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$

par :

failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch).*$
  • pour le filtre apache-badbots, j’ai remplacé la regex :
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*"(?:%(badbots)s|%(badbotscustom)s)"$

par :

failregex = ^<HOST>.*"(GET|POST).*HTTP.*"(?:%(badbots)s|%(badbotscustom)s)"$

Mais, une fois bien configuré, c’est très efficace. Dès qu’une ligne dans un fichier de log correspond à une regex d’un filter, fail2ban prend les mesures nécessaires : en général blocage de l’IP via iptables, et envoi d’un email pour prévenir les administrateurs.

FreeMobile

Utilisation de l’API de SMS de Free Mobile

Depuis juin 2014, Free Mobile met à disposition de ses clients une API qui permet d’envoyer gratuitement des SMS sur votre téléphone via un appel d’URL.

Ca n’est pas très compliqué de s’en servir avec fail2ban : il suffit de se créer un nouveau fichier de configuration dans le répertoire action.d, et de le référencer dans jail.conf

Voici le fichier d’action sendSMSFreeMobile.conf que je me suis créé :

# Fail2Ban configuration file to send an SMS through Free Mobile API
#
# Author: Mossroy
#
# $Revision$
#

[Definition]

# Option:  actionstart
# Notes.:  command executed once at the start of Fail2Ban.
# Values:  CMD
#
actionstart =

# Option:  actionstop
# Notes.:  command executed once at the end of Fail2Ban
# Values:  CMD
#
actionstop =

# Option:  actioncheck
# Notes.:  command executed once before each actionban command
# Values:  CMD
#
actioncheck =

# Option:  actionban
# Notes.:  command executed when banning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
actionban = wget --ca-certificate=/path/to/RapidSSLCABundle.pem -O /dev/null "https://smsapi.free-mobile.fr/sendmsg?user=12345678&pass=abcdefgh&msg=Fail2ban : <ip> has been banned by <name>"

# Option:  actionunban
# Notes.:  command executed when unbanning an IP. Take care that the
#          command is executed with Fail2Ban user rights.
# Tags:    <ip>  IP address
#          <failures>  number of failures
#          <time>  unix timestamp of the ban time
# Values:  CMD
#
actionunban = wget --ca-certificate=/path/to/RapidSSLCABundle.pem -O /dev/null "https://smsapi.free-mobile.fr/sendmsg?user=12345678&pass=abcdefgh&msg=Fail2ban : <ip> has been unbanned"

[Init]

# Defaut name of the chain
#
name = default

(il faut bien sûr renseigner dedans votre user et votre mot de passe)

Et dans jail.conf je l’ai configuré comme action par défaut, en plus du blocage et de l’envoi d’email :

# ban & send an e-mail with whois report and relevant log lines
# to the destemail, and also send an SMS with FreeMobile.
action_mwls = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
               %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"]
               sendSMSFreeMobile[name=%(__name__)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_mwls)s

Et ça marche!

Par contre, il y a quelques pièges à évite r:

    • Dans le fichier sendSMSFreeMobile.conf, attention à ne pas mettre le caractère % dans la ligne de commande wget, parce que fail2ban les interprète mal et refuse de démarrer. Je suis tombé sur ce cas au départ, parce que j’avais encodé les espaces en %20.
    • Debian et Ubuntu semblent ne pas connaître le certificat racine de l’URL de l’API. J’ai donc dû bypasser le contrôle du certificat avec l’option –no-check-certificate . Je sais : c’est mal. Mais le risque me paraissant faible, je n’ai pas pris la peine d’installer le certificat racine qui pose problème. Pour le faire, les explications sont là : http://thenubbyadmin.com/2014/01/29/solving-wget-error-cannot-verify-site-certificate-unable-to-locally-verify-the-issuers-authority/
    • EDIT du 27/08/2014 : suite aux suggestions de Leryan, j’ai amélioré les choses pour éviter de bypasser le contrôle du certificat. J’ai plutôt demandé à wget d’accepter le certificat de RapidSSL (voir les commentaires ci-dessous). Ce certificat peut être téléchargé ici : https://knowledge.rapidssl.com/library/VERISIGN/INTERNATIONAL_AFFILIATES/RapidSSL/AR1548/RapidSSLCABundle.txt et doit être placé dans le répertoire indiqué dans le fichier sendSMSFreeMobile.conf
    • Le user/password est ici en dur dans le fichier de configuration. Il peut être judicieux d’ajuster les droits d’accès à ce fichier pour que n’importe qui ne puisse pas le lire
    • Je n’ai pas pris la peine de tester le code HTTP retour : si ça ne marche pas tant pis. Donc attention à ne pas vous baser uniquement sur l’envoi de SMS. C’est juste un « nice-to-have » qui ne remplace pas l’envoi d’email. En particulier, l’envoi de SMS peut être bloqué par Free Mobile (code HTTP 402) si les envois sont trop fréquents

5 réflexions sur « Fail2ban vous prévient par SMS avec l’API de Free Mobile »

  1. Et pourtant, installer un certificat n’est pas bien compliqué :

    En ayant installé ca-certificates, on met notre certificat (de préférence au format PEM je crois) dans /usr/local/share/ca-certificates, puis on lance un update-ca-certificates et zou, c’est fini ;)

    En gros :

    $ openssl s_client -showcerts -connect smsapi.free-mobile.fr:443 /usr/local/share/ca-certificates/smsapi.free-mobile.fr.crt
    $ update-ca-certificates

    Et hoplà, plus d’excuse pour ne pas le faire !

    1. Je reformule :

      $ openssl s_client -showcerts -connect smsapi.free-mobile.fr:443  /usr/local/share/ca-certificates/smsapi.free-mobile.fr.crt
      $ update-ca-certificates
      
  2. Merci Leryan pour ce retour constructif :-)
    C’est vrai que j’ai été un peu fainéant sur ce coup-là.
    Cela dit, je m’interroge sur la meilleure manière de régler ce problème :

    • Forcer à accepter le certificat de smsapi.free-mobile.fr règle facilement le souci, et ne pose pas de problème de sécurité. Par contre, il faudra le mettre à jour à chaque fois qu’il sera renouvelé par Free Mobile. Et il y a un risque non négligeable que je n’y pense pas ;-). Le certificat actuel n’est valable que jusqu’en 2016
    • Installer le certificat manquant de la chaîne (celui de RapidSSL apparemment) dans le magasin ca-certificates de Debian. Je ne suis pas chaud pour cette solution tant que je ne connais pas la raison pour laquelle il n’est pas installé par défaut sur Debian Wheezy (et sur Ubuntu 14.04). Si jamais il y a une « bonne » raison, je risquerais d’accepter (à tort) des certificats générés par RapidSSL (dans n’importe quelle autre appli de l’OS). Mais c’est étrange puisque RapidSSL est accepté par Firefox
    • Indiquer à la ligne de commande wget d’accepter le certificat RapidSSL, uniquement pour cette requête

    J’ai choisi la dernière solution : le certificat de RapidSSL est valable jusqu’en 2020, et on peut demander à wget de l’accepter avec le paramètre –ca-certificate :

    wget --ca-certificate=/path/to/RapidSSLCABundle.pem -O /dev/null "https://smsapi.free-mobile.fr/sendmsg?user=12345678&pass=abcdefgh&msg=Fail2ban : <ip> has been banned by <name>"

    Source : http://thenubbyadmin.com/2014/01/29/solving-wget-error-cannot-verify-site-certificate-unable-to-locally-verify-the-issuers-authority/

    Le certificat en question pouvant être téléchargé ici : https://knowledge.rapidssl.com/library/VERISIGN/INTERNATIONAL_AFFILIATES/RapidSSL/AR1548/RapidSSLCABundle.txt

    Je vais mettre à jour l’article pour cela.

    NB : il doit y avoir une petite coquille dans votre ligne de commande openssl car elle ne semble pas fonctionner en l’état : il manque peut-être quelque chose avant le « /usr/local/share/ca-certificates/smsapi.free-mobile.fr.crt »?

  3. J’allais me préparer à coder mais après une petite recherche google j’ai remarqué que tu l’avais fait proprement, merci beaucoup Mossroy :)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *