fail2ban: protégez votre serveur Asterisk !

By | 10 février 2018 |
This entry is part 8 of 9 in the series Asterisk

fail2ban représente la troisième couche de protection de notre serveur Asterisk.
Les deux premières étant les pare-feu respectifs de notre box internet et du serveur lui même.

Il agit comme un analyseur de log, il permet de détecter les tentatives à répétition d’identification.
Il peut être utilisé pour protéger plusieurs services/protocoles, et le plus souvent pour ssh, apache, asterisk.

Comme son nom l’indique, il bannit les « fails ».
C’est à dire qu’il cherche dans les logs à l’aide de « regex » (expressions régulières) les erreurs de connexions afin de pouvoir bannir (ban) les adresses IPs qui sont à l’origine de ces tentatives.

Si vous le souhaitez, vous trouverez plus d’information sur fail2ban en suivant ces liens:

Installer fail2ban

L’installation de fail2ban sous raspbian (debian sur raspberry) se fait à partir des dépôts, il suffit donc de taper la commande

sudo apt-get update && sudo apt-get install fail2ban

Il en va de même sous Ubuntu ou Debian.

Vous pouvez vérifier la version installée avec la commande

sudo fail2ban-client –version

Configuration de fail2ban

Les fichiers de configuration se trouvent dans le répertoire /etc/fail2ban.
Les plus important sont /etc/fail2ban/fail2ban.conf, /etc/fail2ban/jail.conf.
Il est vivement conseillé de « surcharger » ces fichiers, c’est à dire d’utiliser une extension à ces fichiers,
pour faire cela, vous devez créer les fichiers suivant /etc/fail2ban/fail2ban.local et /etc/fail2ban/jail.local.

Le but étant de protéger notre configuration lorsque l’on update fail2ban.

Fail2ban - fichiers .local

Fail2ban – fichiers .local

Sans oublier les filtres que l’on retrouve dans le répertoire /etc/fail2ban/filter.d

jail.local

Par défaut, fail2ban autorise 5 tentatives de connexions (maxretry = 5) toutes les 10 minutes (findtime =600s),
et s’il trouve ces 5 tentatives banni l’ip pour 10 minutes (bantime=600s).
Si votre serveur Asterisk est online 24/7, cela signifie 5 tentatives toutes les 10 minutes, je vous laisse faire le calcul par an (x6 x24 x365).

Pour autant que vous avez suivi scrupuleusement l’un ou l’autre « tuto » bien placés lors des recherches sur google,
vos users sont 6001, 600x ou 101, 10x (n’utilisez pas les numéros d’extensions comme users!), combien de temps votre mot de passe va tenir ?
Il faut être beaucoup plus sévère !

Section Default

Pour cela, éditons le fichier /etc/fail2ban/jail.local avec les valeurs suivantes

fail2ban - jail.local

fail2ban – jail.local

  • ignoreip: permet de ne pas bannir ces ranges d’adresses IPs
    J’y ai placé la boucle locale (127.0.0.1/8) mon réseau local (192.168.1.1/24) et mon réseau VPN (10.8.0.1/16)
  • findtime (par défaut 600s = 10 minutes): permet de renseigner la période pendant laquelle le log est examiné
    J’y ai placé une heure (3600s)
    l’inconvénient d’un grand findtime est que le système doit analyser des fichiers de logs plus volumineux,
    il y a donc un impact sur les performances.
  • bantime (par défaut 600s): permet de renseigner la durée pendant laquelle l’IP est bannie
    j’y ai placé une journée (86400s)

Section Asterisk

Ajoutons à ce fichier, une section pour notre serveur Asterisk

fail2ban - asterisk

fail2ban – asterisk

On y retrouve

  • entre [ ], le nom de la jail (prison) dans l’exemple « asterisk-iptables »
  • enabled: permet d’activer/désactiver un filtre
    pour l’activer, la valeur doit être true (vrai)
  • filter: permet de pointer vers le fichier filtre
    je créerai plus bas dans ce post un fichier /etc/fail2ban/filter.d/asterisk.conf, je place donc la valeur asterisk
  • port: permet de specifier le port qui sera bloqué
    pour asterisk, comme les connections se font en SIP sur le port 5060, j’ai définit ce port
    (A adapter si votre configuration est différente)
  • action: permet de définir l’action entreprise par ce filtre
    le nom (name=) permet de créer une table iptables dédiée de la forme fail2ban-NAME (avec cette config fail2ban-ASTERISK)
    On peut également décider si l’on souhaite recevoir un mail lorsque le filtre est utilisé.
  • logpath: permet de préciser le fichier de log à analyser
    C’est dans ce fichier que les tentatives de connexions sont enregistrées, pour asterisk /var/log/asterisk/messages
  • maxretry: permet de préciser le nombre maximum de tentative avant d’activer le filtre
    Je n’autorise que 3 tentatives, la 4ième active le filtre
  • findtime: seulement si vous désirez des valeurs différents du défaut (21600s = 6h)
  • bantime: même remarque que pour le findtime

J’ai choisi de créer un fichier jail.local,
vous pouvez également créer les fichiers jail.conf et asterisk.conf dans le répertoire /etc/fail2ban/jail.d/

Filtre Asterisk

Dans la section précédente, nous avons fait référence à un fichier « filtre » /etc/fail2ban/filter.d/asterisk.conf

Ce fichier permet de préciser les « expressions » que le programme devra retrouver dans le fichier de log.
Ces expressions dépendent de votre version d’Asterisk, voici le contenu de mon fichier:

fail2ban - asterisk regex

fail2ban – asterisk regex

comme je suis sympa, si vous voulez copier coller:

failregex = NOTICE.* .*: Registration from ‘.*’ failed for ‘:.*’ – Wrong password
NOTICE.* .*: Registration from ‘.*’ failed for ‘:.*’ – No matching peer found
NOTICE.* .*: Registration from ‘.*’ failed for ‘:.*’ – No matching peer found
NOTICE.* .*: Registration from ‘.*’ failed for ‘:.*’ – Username/auth name mismatch
NOTICE.* .*: Registration from ‘.*’ failed for ‘:.*’ – Device does not match ACL
NOTICE.* .*: Registration from ‘.*’ failed for ‘:.*’ – Peer is not supposed to register
NOTICE.* .*: Registration from ‘.*’ failed for ‘:.*’ – ACL error (permit/deny)
NOTICE.* .*: Registration from ‘.*’ failed for ‘:.*’ – Device does not match ACL
NOTICE.* .*: Registration from ‘\ ».*\ ».*’ failed for ‘:.*’ – No matching peer found
NOTICE.* .*: Registration from ‘\ ».*\ ».*’ failed for ‘:.*’ – Wrong password
NOTICE.* <HOST> failed to authenticate as ‘.*’$
NOTICE.* .*: No registration for peer ‘.*’ \(from \)
NOTICE.* .*: Host <HOST> failed MD5 authentication for ‘.*’ (.*)
NOTICE.* .*: Failed to authenticate user .*@.*
NOTICE.* .*: <HOST> failed to authenticate as ‘.*’
NOTICE.* .*: <HOST> tried to authenticate with nonexistent user ‘.*’
VERBOSE.*SIP/-.*Received incoming SIP connection from unknown peer
SECURITY.* SecurityEvent= »FailedACL ».*RemoteAddress= ».+?/.+?//.+? ».*
SECURITY.* SecurityEvent= »InvalidAccountID ».*RemoteAddress= ».+?/.+?//.+? ».*
SECURITY.* SecurityEvent= »ChallengeResponseFailed ».*RemoteAddress= ».+?/.+?//.+? ».*
SECURITY.* SecurityEvent= »InvalidPassword ».*RemoteAddress= ».+?/.+?//.+? ».*

Comment Tester ?

Vérifier le status de fail2ban

La première chose à faire est de s’assurer que notre configuration est bien en cours d’exécution.
Pour cela, il faut utiliser la commande « reload » du service

sudo service fail2ban reload

Vous pouvez également redémarrer le service

sudo service fail2ban restart

Si aucun message ne s’affiche, c’est que tout est bon, mais vous pouvez-vous en assurez avec

sudo service fail2ban status

fail2ban - service commandes

fail2ban – service commandes

Si vous désirez connaîtres le status de vos jails, vous pouvez utiliser la commande

sudo fail2ban-client status

fail2ban - jails status

fail2ban – jails status

il est également possible de spécifier le status de quelle « jail » on veut contrôler avec « sudo fail2ban-client status  »

fail2ban - jail asterisk status

fail2ban – jail asterisk status

Utiliser fail2ban-regex

la commande « fail2ban-regex <log_file> <filter_file> » permet de tester votre filtre sur un fichier.
Par exemple si j’exécute la commande pour le filtre asterisk sur le fichier /var/log/asterisk/messages

fail2ban_regex_asterisk

fail2ban_regex_asterisk

Ce qui m’indique que le filtre à trouver 10 lignes dans le fichier de log qui correspondent aux « regex »;
vérifions cela avec le couple tail/grep:

5 lignes avec le regex contenant « Wrong password »

regex-wrongpass

regex-wrongpass

5 lignes avec le regex content « InvalidPassword »

regex-invalidpass

regex-invalidpass

(J’ai masqué le user sur le screenshot comme je n’ai supprimé que quelques lettres de son user pour générer cette erreur de connexion, on est jamais trop prudent)

A noter que l’ip ne sera pas bannie car étant dans le range renseigner dans ignoreip.

Est-ce que mon filtre fonctionne ?

comme déjà précisé, vous pouvez utiliser la commande sudo fail2ban-client status afin de vérifier les IPs bannies par votre filtre.

Vous pouvez également afficher le contenu de la table iptables avec la commande

sudo iptables -nL fail2ban-ASTERISK

iptables-fail2ban

iptables-fail2ban

La table est vide car la configuration du firewall n’autorise que les IPs locales ou du VPN à tenter de se connecter.

Le nom de la table fail2ban-ASTERISK dépend de la configuration de votre jail

  • action = iptables-allports[name=ASTERISK, protocol=all]

Voilà ce qui conclut cet article.

Series Navigation<< Comment configurer le modem Technicolor (Voo) pour téléphoner avec SIP (OVH/Asterisk)Connecter Asterisk à son GSM avec CSipSimple >>

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.