Netgate, l'éditeur du logiciel pfSense, a annoncé le 18/03/2021 que le logiciel WireGuard était retiré de pfSense 2.5.
Cette annonce fait suite à une annonce similaire de la part de l'équipe de base (core team) de FreeBSD : WireGuard sera retiré de FreeBSD 13, jusqu'à ce qu'une version plus mature puisse être ajoutée par la suite.
La raison de ce retrait est la présence de graves lacunes en terme de sécurité au niveau du code-source de la version de WireGuard livrée avec pfSense / FreeBSD.
Dans cet article, nous présentons ce qu'il s'est passé.
WireGuard, qu'est-ce que c'est ?
WireGuard est à la fois un logiciel open-source et un protocole de communication permettant de mettre en place un réseau privé virtuel (VPN).
Il s'agit d'une alternative à OpenVPN et IPsec.
La solution WireGuard se veut être une solution simple à mettre en oeuvre, à l'état de l'art en termes de développement, de fonctionnalités et de sécurité et offrir des performances réseaux particulièrement intéressantes.
WireGuard est développé par Jason A. Donenfeld et par les sociétés ZX2C4 et Edge Security.
WireGuard a, à l'origine, été développé et intégré au noyau Linux.
Implémentation de WireGuard sous FreeBSD / pfSense
Il s'agissait d'une des principales nouveautés de pfSense 2.5 : l'intégration de WireGuard au noyau de FreeBSD.
La plupart des distributions GNU/Linux supportent WireGuard depuis un petit moment déjà (car WireGuard a été intégré au noyau Linux 5.6), ainsi qu'OPNsense qui a intégré un support de WireGuard dans l'espace utilisateur (en attendant une intégration au noyau de FreeBSD).
Le développement de WireGuard pour FreeBSD a été assuré par des développeurs de Netgate (l'éditeur de pfSense). Le développement a duré pratiquement un an.
Le code a ensuite été intégré au noyau FreeBSD.
Malheureusement, il est vite apparu que le code intégré au noyau FreeBSD ne respectait pas les standards habituels de qualité et de sécurité.
Le fondateur du projet WireGuard, Jason Donenfeld (qui n'a pas participé au développement de la version présente dans pfSense 2.5) s'est penché sur le code ajouté au noyau de FreeBSD et a émis des critiques sévères que nous retranscrivons ici :
Ce code, c'est ce qui donne une mauvaise image au langage C !
Il y a des instructions "sleep" aléatoires pour corriger des problématiques d'accès concurrents, des fonctions de validation qui renvoient systématiquement "true", des vulnérabilités cryptographiques absolument catastrophiques, des pans entiers du protocole WireGuard non-implémentés, des "kernel panic", des contournements de sécurité, des dépassements de tampon, des "printf" arbitraires enfouis dans la partie cryptographique du code-source, et toute la litanie habituelle des choses horribles qui peuvent aller mal quand les gens ne font pas attention à ce qu’ils écrivent en C.
Il semblerait que cette déclaration soit légèrement exagérée (par exemple en employant le pluriel, là où un seul cas a été constaté). Cependant, toutes ces alertes de sécurité et de qualité du code sont bien réelles et confirmées par d'autres développeurs dont Kyle Evans qui est un guru FreeBSD et mainteneur du package WireGuard pour FreeBSD.
Des problématiques de sécurité sur les Jumbo frame ou d'élévation des privilèges ont également été rapportées.
Dans un premier temps Netgate a annoncé que l'implémentation de WireGuard ne posait pas de réels problèmes de sécurité pour les utilisateurs de pfSense, avant de finalement déconseiller son utilisation, puis enfin retirer le logiciel WireGuard de pfSense.
Peut-on utiliser WireGuard sous pfSense ou FreeBSD ?
Techniquement, la réponse est oui. Mais c'est totalement déconseillé.
Il vaut mieux éviter d'utiliser WireGuard pour le moment et privilégier d'autres solutions comme OpenVPN ou IPsec.
Si vous voulez ou devez à tout prix continuer à utiliser WireGuard sur votre pfSense, alors il est indispensable que celui-ci ne soit pas configuré sur une interface dont le MTU est supérieur à 1420.
Pour vérifier le MTU employé sur votre interface, rendez-vous dans le menu Status > Interfaces :
La valeur du MTU sera indiquée pour chacune de vos interfaces.
Je suis utilisateur d'OPNsense, suis-je concerné ?
Non, pas directement. Le plugin WireGuard proposé sous OPNsense n'est pas celui implémenté avec le noyau FreeBSD.
Il s'agit d'une version tournant dans l'espace utilisateur.
Cependant, la version de WireGuard proposée sous OPNsense reste expérimentale : il reste déconseillé de l'utiliser en production.
Un avertissement est d'ailleurs présent dans la documentation d'OPNsense :
Pour notre part, nous déconseillons l'utilisation de WireGuard aussi bien sous pfSense que sous OPNsense.
Est-ce que WireGuard reviendra sous FreeBSD / pfSense ?
Oui, bien-sûr. Un nouveau développement complet, en repartant de l'implémentation de WireGuard réalisée pour OpenBSD, et auquel participe Jason Donenfeld (à l'origine du projet WireGuard), les équipes de Netgate et des développeurs de FreeBSD et d'OpenBSD a été lancé.
Il est fort probable que WireGuard fasse son retour pour la version FreeBSD 13.1 (ou une suivante).
La future implémentation de WireGuard pour FreeBSD promet d'être de haute qualité, ce qui est une très bonne nouvelle pour tous les utilisateurs de FreeBSD, pfSense et OPNsense.
Si vous souhaitez obtenir davantage d'informations sur le sujet (en anglais), vous pouvez consulter les liens suivants :
WireGuard est supprimé des logiciels pfSense® CE et pfSense® Plus
Suppression du support WireGuard de la base FreeBSD
Déclaration sur la controverse Wireguard
E-mail de Jason A. Donenfeld
Article d'Ars Technica - WireGuard intégré au noyau est en route vers FreeBSD et le routeur pfSense
Pour aller plus loin
[pfSense] Configurer un VPN IPsec site à site
[pfSense] Monter un accès OpenVPN site-à-site
[pfSense] Sécurisez l'accès distant de vos collaborateurs nomades avec OpenVPN
Tous nos articles classés par thème
Voir un article au hasard
Vous avez aimé cet article ? Vous cherchez du matériel de qualité ? Alors contactez-nous.
Retrouvez nos services et firewall pour pfSense
store.provya.fr
Tags de l'article : pfSensesécuritéWireGuard
Dans cet article, nous allons voir comment configurer ses VLAN avec pfSense. Nous aborderons la terminologie associée (trunk port, tagged / untagged port, etc.), puis nous prendrons un exemple concret de configuration de VLAN.
Intérêt des VLAN
L'utilisation de VLAN apporte un certain nombre d'avantages que nous ne détaillerons pas ici. Pour une bonne compréhension des VLAN, nous proposons la lecture de l'article VLAN - Réseaux virtuels sur commentcamarche.net
Les utilisations principales de VLAN sont :
- séparation logique des réseaux Voix & Data
- séparation logique des services d'une entreprise
- mise en place d'un réseau invité différent du réseau local
Mode de fonctionnement des VLAN
Lorsque nous créons un VLAN, nous définissons deux éléments :
- le subnet associé (ex : 192.168.1.0/24)
- l'ID du VLAN (allant de 1 à 4094)
Les terminaux se trouvant sur un VLAN ne pourront communiquer qu'avec les autres terminaux se trouvant sur le même VLAN. S'ils souhaitent communiquer avec les terminaux d'un autre VLAN, les paquets passeront par pfSense. Cela nous permet de configurer au niveau de pfSense des règles fines de filtrage d'un VLAN à un autre.
Il est à noter que le routage d'un VLAN à l'autre peut également se faire au niveau du switch via la mise en place d'ACL (cas que nous n'aborderons pas dans le présent article).
Les VLANs doivent être déclarés et configurés côté pfSense d'une part, et sur les switches d'autre part (qui doivent bien-sûr être des switches supportant les VLAN).
La configuration des switches est le point le plus délicat. La terminologie employée n'étant pas toujours la même chez les constructeurs.
Terminologie
Lorsque nous souhaitons configurer les VLAN sur notre switch, nous avons deux possibilités de configuration :
- tagged port (= trunk port chez Cisco)
- untagged port (= access port chez Cisco)
Tagged port
Un port de switch configuré en "tagged" signifie que l'équipement branché derrière est capable de traiter les tags 802.1q et qu'il est configuré pour les traiter. C'est-à-dire qu'il faudra indiquer dans la configuration de l'équipement qu'il doit marquer ses paquets réseau avec son VLAN d'appartenance.
Untagged port
Un port de switch configuré en "untagged" signifie que la notion de VLAN est totalement transparente pour l'équipement branché derrière. C'est-à-dire qu'il ignore son VLAN de rattachement. C'est le switch qui utilise l'id VLAN associé pour son traitement interne pour la distribution des paquets sur ses ports. Les paquets ne sont pas taggués 802.1q en entrée et sortie des ports du switch configurés en "untagged".
Un switch ne peut avoir sur un port donné qu'un seul VLAN configuré en "untagged" (access). Il peut y avoir, sur ce même port, plusieurs VLANs configurés en "tagged" (trunk).
Cas concret : séparation VLAN voix / VLAN data
Un cas concret et classique d'utilisation des VLAN va être de séparer le réseau VoIP du réseau Data.
Nous prendrons l'exemple du réseau local suivant :
- pfSense fait office de routeur/firewall et de serveur DHCP pour l'ensemble des VLAN
- Les ordinateurs (et tous les autres équipements sauf téléphones) disposent d'une adresse IP sur la plage 192.168.1.0/24 - VLAN 10 (ce sera notre VLAN par défaut - configuré en untagged)
- Les postes téléphoniques disposent d'une adresse IP sur la plage 192.18.2.0/24 - VLAN 20 (VLAN dédié à la téléphonie - configuré en tagged)
- Le switch de cœur de réseau est un switch supportant les VLAN
- Tous les ordinateurs sont branchés derrière un téléphone. C'est-à-dire que sur chaque port du switch il y aura généralement deux équipements branchés : un téléphone (dans le VLAN 20) et un ordinateur (VLAN 10) branché derrière
Le schéma réseau est le suivant :
Configuration du pfSense
Sur le pfSense, nous configurerons donc deux VLANs :
- VLAN "LAN Data"
- VLAN "LAN VoIP"
Pour commencer, nous allons dans le menu "Interface" > "(assign)" :
Puis, nous nous rendons dans l'onglet "VLANs" et cliquons sur l'icône en forme de "+" se trouvant en bas à droite.
Les éléments de configurations sont les suivants :
- Parent interface : l'interface physique à laquelle sera rattachée le VLAN
- VLAN tag : l'ID du VLAN (la valeur doit être comprise entre 1 et 4094)
- VLAN Priority : la priorité à appliquer au VLAN (la valeur doit être comprise entre 0 et 7)
- Description : champ optionnel de description du VLAN
Exemple de résultat obtenu :
Et une fois nos deux VLANs créés, nous disposons de deux interfaces virtuelles :
Afin de configurer nos VLANs, nous devons maintenant associer ces interfaces virtuelles à des interfaces logiques.
Pour cela, nous retournons dans l'onglet "Interface assignments", puis nous cliquons sur l'icône en forme de "+" se trouvant un bas à droite afin d'ajouter une nouvelle interface logique.
Par défaut, l'interface logique créée porte le nom "OPT1" (ou OPT2, OPT3, etc.). Nous associons cette interface logique à l'interface virtuelle du VLAN que nous avons créée précédemment :
Pour modifier l'interface logique créée (et la renommer), nous cliquons sur son nom. Les éléments de configuration sont les suivants :
- Enable Interface : cocher cette case pour activer l'interface
- Description : nom de l'interface
- IPv4 Configuration Type : la configuration IPv4 de cette interface. Dans notre cas, nous choisissons "Static IPv4"
- IPv6 Configuration Type : la configuration IPv6 de cette interface. Dans notre cas, nous choisissons "None"
- MAC controls : par défaut, c'est l'adresse MAC de l'interface physique qui est utilisée. Elle peut être personnalisée ici
- MTU : la MTU pour cette interface. 1500 octets par défaut
- MSS : "Maximum Segment Size", devrait être inférieur au MTU. Nous laissons vide
- Speed and duplex : nous laissons le choix par défaut
Enfin, nous appliquons les paramètre de configuration IP (adresse IP de l'interface et masque réseau associé).
Exemple de résultat obtenu :
Sur cette interface, nous activons le service DHCP. Pour davantage de détails sur la manière de procéder pour l'activation du service DHCP, se référer à notre article dédié : [pfSense] Configurer son serveur DHCP.
Enfin, nous créons une règle de firewall sur notre nouvelle interface logique ("VLAN_voix") afin d'autoriser le trafic.
La configuration côté pfSense est terminée. Il reste à procéder à la configuration côté Switch.
Configuration du Switch
La configuration des VLAN sur le switch dépend du constructeur. Cependant, les étapes à suivre seront toujours les mêmes :
- Déclaration des VLAN sur le switch - sur la plupart des switches, il faut déclarer les VLANs avant de pouvoir les configurer sur n'importe quel port (dans notre cas, nous déclarons 2 VLAN : vlan_data avec l'ID 10 et vlan_voix avec l'ID 20)
- Configuration du port du switch sur lequel est branché le pfSense en mode trunk (ou tagged) sur les VLAN 10 et 20
- Configurer les ports du switch sur lesquels seront branchés les PC en mode access (ou untagged) - dans notre cas sur le VLAN 10
- Configurer les ports du switch sur lesquels seront branchés les téléphones en mode trunk (ou tagged) - dans notre cas sur le VLAN 20
Exemple sur un switch Cisco :
Déclaration des VLANs :
sw# vlan database
sw(vlan)# vlan 10 name "vlan_data"
sw(vlan)# vlan 20 name "vlan_voix"
sw(vlan)# exit
Configuration du port trunk :
sw# configure terminal
sw(config)# interface FastEthernet0/24
sw(config-if)# switchport mode trunk
Ajouter les ports au VLAN :
sw# configure terminal
sw(config)# interface FastEthernet0/12
sw(config-if)# switchport mode access
sw(config-if)# switchport access vlan 20
Nos VLANs sont configurés et prêts à fonctionner.
Peut-on configurer un VLAN sur le port LAN ?
Réponse succincte : oui.
Sur les anciennes versions de pfSense (antérieures à la version 2.4.5), il était très fortement recommandé par l'éditeur de ne pas configurer un VLAN sur un port réseau qui était déjà associé à une interface logique.
Si les notions de port réseau, interface physique, interface virtuelle et interface logique ne vous sont pas familières, nous vous invitons à consulter notre article [pfSense] Comprendre la gestion des interfaces réseaux.
Cette configuration entraînait des anomalies de fonctionnement pour un certain nombre de services (dont le portail captif).
Ce n'est plus du tout le cas aujourd'hui. On peut donc tout à fait configurer ses VLAN sur un port réseau déjà associé à une interface logique !
Pour aller plus loin
[pfSense] Comprendre la gestion des interfaces réseaux
[pfSense] Configurer son serveur DHCP
Tous nos articles classés par thème
Voir un article au hasard
Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous.
Retrouvez nos services et firewall pour pfSense
store.provya.fr
Tags de l'article : pfSensesécuritéVLAN
Héberger son serveur Asterisk sur un cloud public, ou d'une façon générale rendre son serveur Asterisk accessible sur Internet peut être une nécessité ou une facilité d'usage, mais cela implique de le sécuriser avec la plus grande précaution afin d'éviter les mauvaises surprises...
Bonne nouvelle, il est possible de se protéger très facilement en adoptant une démarche pragmatique, en réalisant une simple configuration d'Asterisk et en adoptant les outils fail2ban et iptables.
Cet article est dédié à la sécurisation d'un serveur Asterisk.
Cet article n'est pas un tuto détaillé sur la configuration du logiciel Asterisk.
fail2ban & iptables, qu'est-ce que c'est ?
iptables est un outil accessible en ligne de commande sur n'importe quel serveur GNU/Linux permettant de configurer des règles de filtrage des flux réseaux entrants et sortants d'un serveur. C'est un véritable pare-feu intégré à la machine.
Pour être tout à fait précis, iptables est une interface utilisateur au framework Netfilter qui implémente un pare-feu au sein du noyau Linux.
fail2ban est un outil d'analyse de journaux (log) dont l'objectif premier est de détecter des tentatives d'intrusions ou de connexions infructueuses sur un service et de bannir les adresses IP à l'origine de ces tentatives d'intrusion.
Le trio d'une configuration d'Asterisk pragmatique + fail2ban + iptables va nous permettre de nous mettre en sécurité contre la quasi-totalité des attaques que peut subir notre serveur Asterisk.
[1/4] Pour commencer : soyons pragmatiques
Pour sécuriser Asterisk, il est important d'adopter une approche logique et pragmatique. Pour cela, nous respecterons deux règles très simples :
- n'autoriser que ce qui est nécessaire. C'est-à-dire que l'on n'activera pas les services que l'on n'utilise pas d'une part, et que l'on appliquera des filtrages par adresse IP lorsque cela est possible d'autre part.
- ne pas utiliser un identifiant et/ou un mot de passe simple. Jamais. Il ne faut pas utiliser d'identifiant trivial comme : "100", "abc", "demo", "Pierre", "test", "temporaire", etc. Idem pour les mots de passe.
Filtrer l'authentification SIP par adresse IP
Dans la configuration de nos comptes SIP (fichier sip.conf et dérivés) il est possible de préciser l'adresse IP ou les adresses IP autorisées à s'enregistrer sur les comptes SIP de notre Asterisk.
Cette configuration se fait par compte SIP (ou trunk SIP). Elle permet donc d'être très souple.
Dans la configuration de chaque compte SIP, nous ajoutons les paramètres suivants :
deny=0.0.0.0/0.0.0.0
permit=33.12.13.14/255.255.255.255
La première ligne interdit toutes les adresses IP.
La second ligne autorise exclusivement l'adresse IP 33.12.13.14
Si nous devons autoriser plusieurs adresses IP ou plages d'adresses IP, nous pouvons ajouter autant de lignes permises que nécessaire. Exemple :
deny=0.0.0.0/0.0.0.0
permit=33.12.13.14/255.255.255.255
permit=33.22.23.24/255.255.255.255
Dans cet exemple, les adresses IP 33.12.13.14 et 33.22.23.24 seront autorisées.
Appliquer une sécurité de base sur notre configuration SIP
Il y a deux paramètres indispensables à faire figurer dans notre contexte general de notre configuration SIP :
[general]
...
allowguest=no
alwaysauthreject=yes
...
La signification de ces deux paramètres est la suivante :
- allowguest=no : bloque la possibilité de passer un appel sans être préalablement enregistré
- alwaysauthreject=yes : configure Asterisk pour qu'il renvoi le même message d'erreur générique lors d'une tentative de connexion erronée, que l'identifiant soit valide ou non
Utiliser un bon identifiant et un bon mot de passe
Un bon identifiant SIP est un identifiant faisant au moins 8 caractères. Plus il sera long, mieux ce sera. C'est un identifiant que vous n'avons pas à retenir.
Si l'utilisateur Pierre dispose d'un compte SIP dont l'identifiant est aB7ytWxEd, rien n'empêche qu'il soit joignable sur l'extension 100. Il faut bien distinguer l'identifiant SIP et le numéro ou l'extension d'appel.
Par exemple, pour faire correspondre l'extension 100 au compte SIP aB7ytWxEd, alors dans notre fichier de configuration extensions.conf nous aurons quelque chose comme cela :
; Appel vers l'extension 100
exten => 100,1,Dial(SIP/aB7ytWxEd,25,rtT)
same => n,Voicemail(100@mycontext,u)
same=> n,Hangup()
Bien évidemment, l'identifiant SIP et le mot de passe SIP doivent être différents. Nous recommandons d'utiliser des mots de passe composés d'au-moins 20 caractères.
[2/4] Bye-bye script-kiddies ou comment réduire le nombre d'attaques d'environ 99%
Pour réduire le nombre d'attaques d'au-moins 99%, une configuration très simple mais malheureusement trop rarement appliquée consiste à paramétrer le service Asterisk pour qu'il soit en écoute sur un autre port que le port SIP standard 5060.
Cette configuration n'est pas un élément de sécurité à proprement parler, et il ne faut pas considérer être en sécurité juste parce qu'on applique cette mesure, mais elle nous permettra d'échapper à l'immense majorité des script-kiddies qui scannent le port 5060 des serveurs.
Pour modifier le port SIP d'écoute d'Asterisk, ouvrir le fichier /etc/asterisk/sip.conf et dans la section [general] ajouter ou modifier la valeur de l'option bindport :
[general]
bindport=5872
Dans l'exemple ci-dessus, nous avons configuré notre serveur Asterisk pour que son port SIP d'écoute soit le 5872. Vous pouvez choisir une autre valeur (en fait, nous vous encourageons à choisir une autre valeur).
L'ensemble des configurations réalisées jusqu'à présent permet de réduire la surface d'attaque. Nous allons maintenant voir comment filtrer et sécuriser les services restant actifs.
Nous insistons sur le fait que d'après nos statistiques internes, simplement en changeant le port SIP d'écoute d'Asterisk, on peut passer de plusieurs dizaines de tentatives d'intrusions par force brute par jour à un chiffre compris entre zéro et dix par an.
Ceci étant, il ne faut pas croire que cette configuration soit suffisante pour sécuriser un serveur Asterisk.
[3/4] Configurer fail2ban pour Asterisk
fail2ban est inclus dans toutes les distributions GNU/Linux. Pour l'installer :
Debian/Ubuntu/Mint : apt-get install fail2ban
CentOS/RedHat : yum install fail2ban (s'il ne trouve pas le paquet fail2ban, le faire précéder d'un yum install epel-release)
Dès que fail2ban est installé, il est immédiatement opérationnel pour le port SSH. Nous allons le configurer pour Asterisk.
3.1 - Créons un fichier de log Asterisk pour fail2ban
Dans son mode de fonctionnement, fail2ban lit un fichier de log pour y repérer les tentatives d'intrusions. Nous allons créer un fichier de log Asterisk spécifique pour fail2ban.
Commençons par ouvrir avec notre éditeur de texte préféré le fichier de configuration des logs d'Asterisk /etc/asterisk/logger.conf pour y ajouter la ligne suivante en fin de fichier :
fail2ban => notice,security
On recharge la configuration de journalisation d'Asterisk, en saisissant la commande suivante :
myserver# asterisk -rx 'logger reload'
Cette action a permis la création d'un fichier de log spécifique se situant à l'emplacement /var/log/asterisk/fail2ban (sauf si vous avez modifié le répertoire par défaut de stockage des logs d'Asterisk, bien-sûr) qui contiendra uniquement les informations de type "notice" et "security".
Nous allons maintenant configurer fail2ban pour Asterisk.
3.2 - Créons un "jail" pour Asterisk
Créons un fichier du nom de notre choix dans le répertoire /etc/fail2ban/jail.d/. Dans notre exemple, nous nommerons ce fichier provya.conf ; et ajoutons le code suivant dans le fichier :
[asterisk-provya]
enabled = true
ignoreip = 127.0.0.1 1.2.3.4
filter = asterisk
action = iptables-allports[name=asterisk, protocol=all]
logpath = /var/log/asterisk/fail2ban
findtime = 10m
maxretry = 3
bantime = 360m
Détaillons ligne-par-ligne :
- [asterisk-provya] : nom de notre jail (prison)
- enabled = true : permet d'activer ce jail ; c'est-à-dire cette règle
- ignoreip = 127.0.0.1 1.2.3.4 : la liste des adresses IP sources qui ne doivent pas être prises en compte par fail2ban. Il s'agit généralement des adresses IP légitimes comme l'adresse IP de notre connexion Internet ou d'un serveur VPN, par exemple. Il est recommandé de toujours laisser l'adresse 127.0.0.1. Chaque adresse IP doit être séparée par un simple espace.
- filter = asterisk : le nom du filtre qui contient l'expression régulière qu'utilisera fail2ban pour détecter les tentatives d'intrusion. Le filtre "asterisk" est un filtre déjà pré-existant avec fail2ban. Il est bien fait. Nous l'utilisons.
- action = iptables-allports[name=asterisk, protocol=all] : l'action qui sera exécutée par fail2ban lorsque les critères de déclenchement s'activeront. Dans le cas présent, nous indiquons à fail2ban d'utiliser l'action "iptables-allports" qui est une action pré-existante qui va créer une règle iptables de filtrage. La règle de filtrage iptables comportera le mot clef "asterisk" (ce qui nous permettra de la repérer facilement) et bloquera tous les ports de notre serveur pour l'adresse IP source incriminée (protocol=all).
- logpath = /var/log/asterisk/fail2ban : le nom du fichier de log que fail2ban devra lire pour détecter les tentatives d'intrusion. Il s'agit du fichier de log Asterisk que nous avons créé à l'étape précédente.
- findtime = 10m : la durée sur laquelle le nombre de tentatives de connexion va être prise en compte par fail2ban. Ici, 10 minutes.
- maxretry = 3 : le nombre de tentatives de connexions à partir de laquelle notre filtrage va se déclencher. Ici, 3 tentatives.
- bantime = 360m : la durée de bannissement. Ici, 360 minutes, soit 6 heures. Si vous souhaitez bannir une adresse IP plus d'une journée, il vous faudra personnaliser la valeur de "dbpurgeage" du fichier fail2ban.conf
Ainsi donc, dans cette configuration, nous bannissons pour 6 heures toute adresse IP ayant effectué 3 tentatives de connexions erronées sur notre serveur en moins de 10 minutes.
Attention : pensez à bien configurer le champ "ignoreip" si vous ne voulez pas vous retrouver coupé de votre serveur suite à une mauvaise manipulation... ;-)
3.3 - [Optionnel] Personnalisons le filtre pour Asterisk
Le filtre pour Asterisk fourni par défaut avec fail2ban est bien fait et il n'est pas forcément nécessaire de le changer.
Nous avons seulement déjà remarqué qu'une des règles du filtre peut avoir tendance à créer des faux-positifs. Il s'agit de la ligne :
^Call from '[^']*' \(<HOST>:\d+\) to extension '[^']*' rejected because extension not found in context
Le problème de cette règle est que si un utilisateur compose à 3 reprises en moins de 10 minutes un faux numéro (relativement peu probable, certes, mais cas déjà rencontré), alors son adresse IP va se faire bannir par fail2ban.
De plus, cette règle est inutile si vous avez défini le paramètre allowguest=no dans le fichier sip.conf comme indiqué en début d'article.
Nous commentons donc cette ligne en ajoutant un dièse (#) devant.
Il ne nous reste plus qu'à recharger fail2ban et le tour est joué !
systemctl reload fail2ban
3.4 - Les commandes utiles pour fail2ban
Quelques commandes utiles pour fail2ban :
- fail2ban-client status : liste tous les « jails » configurés
- fail2ban-client status asterisk-provya : affiche le statut du jail spécifié (ici, asterisk-provya) et précise le nombre d'adresses IP bannies
- systemctl restart fail2ban : redémarre le service fail2ban
- fail2ban-client set asterisk-provya banip 1.2.3.4 : permet de bannir manuellement l'adresse IP 1.2.3.4 dans le jail asterisk-provya
- fail2ban-client set asterisk-provya unbanip 1.2.3.4 : permet de dé-bannir manuellement une adresse IP qui a été précédemment bannie
- fail2ban-regex /var/log/asterisk/fail2ban /etc/fail2ban/filter.d/asterisk.conf : permet de tester le bon fonctionnement d'un filtre fail2ban sur un fichier de log
- fail2ban-client get dbpurgeage : affiche la durée maximum durant laquelle les adresses IP bannies seront conservées
- fail2ban-client get asterisk-provya bantime : affiche la durée de bannissement du jail indiqué
La configuration de fail2ban est terminée. Passons à la configuration du filtrage avec iptables.
[4/4] Configurer iptables pour Asterisk
Dernière étape dans notre stratégie de sécurisation de notre serveur Asterisk, la configuration des règles de filtrage des flux réseaux avec iptables.
La démarche va consister à définir le plus précisément possible la liste du trafic réseau que nous souhaitons autoriser, puis interdire le reste du trafic réseau.
Pour cela, nous devons définir quels services tournent sur notre serveur Asterisk et sur quels ports ces services sont joignables.
Par exemple :
- serveur Asterisk (SIP) : port UDP/5060 (ou celui que vous aurez configuré précédemment !)
- serveur Asterisk (flux audio RTP) : ports UDP/10.000-20.000
- serveur SSH : port TCP/22
- interface d'administration web (si installée) : port TCP/443
- ICMP (si l'on souhaite que son serveur réponde au ping) : icmp
Si l'on utilise une distribution Asterisk packagée (type Wazo, Xivo, Elastix, ...), il faut aussi prendre en compte les services spécifiques de ces distributions. Pour Wazo, la liste des flux réseaux est présentée dans la documentation en ligne.
Nous faisons le même travail pour les flux sortant du serveur ; c'est-à-dire les flux réseaux émis par le serveur.
Par exemple :
- mise à jour (HTTP/HTTPS) : ports TCP/80, TCP/443
- flux NTP : port UDP/123
- flux DNS : port UDP/53
- flux trunk SIP : port UDP/5060 (ou celui configuré par votre opérateur SIP)
- flux RTP : ports UDP/10.000-20.000
Par simplicité, il est possible de n'appliquer aucune restriction sur les flux sortants, et de ne filtrer que les flux entrants. C'est un choix à faire en terme de sécurité.
Nous devons ensuite définir pour chacun de ces services, dans la mesure du possible, quelles adresses IP sont autorisées à joindre les services hébergés sur le serveur Asterisk (trafic entrant) et quelles adresses IP sont autorisées à être contactées par le serveur Asterisk (trafic sortant).
Cette étape est importante. Si les adresses IP sources sont connues, il n'y a aucune raison de laisser le serveur Asterisk joignable sans aucune restriction par adresse IP source. C'est la base de la sécurisation du serveur. Et cela évite de se reposer uniquement sur fail2ban pour filtrer les tentatives de connexions mal-intentionnées. Les rôles d'iptables et fail2ban sont complémentaires.
Pour l'exemple d'implémentation de nos règles de filtrage, nous partirons sur le cas suivant :
- Nous autorisons l'accès aux services d'administration du serveur (SSH et HTTPS, par exemple) uniquement pour l'adresse IP de la connexion Internet de notre entreprise : 188.10.11.12
- Nous n'appliquons pas de filtrage par adresse IP pour les services Asterisk (SIP & RTP) afin de permettre l'accès par les utilisateurs nomades
- Nous autorisons la plage d'adresses IP utilisées par notre opérateur SIP : 51.5.6.0/24
Ce qui nous donnera en terme de filtrage des flux entrants les règles suivantes :
iptables -A INPUT -s 51.5.6.0/24 -p udp -m udp --dport 5060 -m comment --comment "Opérateur SIP - flux SIP" -j ACCEPT
iptables -A INPUT -s 51.5.6.0/24 -p udp -m udp --dport 10000:20000 -m comment --comment "Opérateur SIP - flux RTP" -j ACCEPT
iptables -A INPUT -s 188.10.11.12/24 -p tcp -m tcp --dport 443 -m comment --comment "Administration - IP du bureau" -j ACCEPT
iptables -A INPUT -s 188.10.11.12/24 -p tcp -m tcp --dport 22 -m comment --comment "Administration - IP du bureau" -j ACCEPT
iptables -A INPUT -m comment --comment "filtrage fail2ban" -j asterisk-provya
iptables -A INPUT -p udp -m udp --dport 5060 -m comment --comment "Flux SIP Open" -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 10000:20000 -m comment --comment "Flux RTP Open" -j ACCEPT
iptables -A INPUT -p icmp -m comment --comment "si l'on souhaite autoriser les PING" -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m comment --comment "On bloque tout le reste" -j DROP
iptables -A asterisk-provya -j RETURN
Il faut bien évidemment adapter cet exemple à votre configuration réelle et aux services que vous souhaitez filtrer.
Et pour le filtrage des flux sortants :
iptables -A OUTPUT -d 51.5.6.0/24 -p udp -m udp --dport 5060 -m comment --comment "Opérateur SIP - flux SIP" -j ACCEPT
iptables -A OUTPUT -d 51.5.6.0/24 -p udp -m udp --dport 10000:20000 -m comment --comment "Opérateur SIP - flux RTP" -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 10000:20000 -m comment --comment "Flux RTP Open" -j ACCEPT
iptables -A OUTPUT -p udp -m tcp --dport 80,443 -m comment --comment "Flux HTTP/HTTPS" -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 123 -m comment --comment "Flux NTP" -j ACCEPT
iptables -A OUTPUT -d 9.9.9.9/32 -p udp -m udp --dport 53 -m comment --comment "Flux DNS vers Quad9" -j ACCEPT
iptables -A OUTPUT -p icmp -m comment --comment "si l'on souhaite autoriser les PING" -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m comment --comment "On bloque tout le reste" -j DROP
Encore une fois, il faut bien évidemment adapter cet exemple à votre configuration réelle et aux flux que vous souhaitez filtrer.
Commandes utiles pour iptables[/u]
Quelques commandes utiles pour iptables :
- [b]iptables -L -n : liste toutes les règles iptables (l'option -n permet l'affichage des adresse IP au format numérique)
- iptables -L --line-numbers : affiche le numéro de ligne de chaque règle
- iptables -D OUTPUT 2 : supprime la règle numéro 2 de la chaîne OUTPUT
- iptables-save > provya.txt : fait une sauvegarde des règles iptables vers le fichier provya.txt
- iptables-restore < provya.txt : restaure les règles contenues dans le fichier provya.txt
Vous avez toutes les armes en main pour sécuriser correctement et efficacement votre serveur Asterisk.
Il faut bien évidemment adapter ces recommandations à votre usage, à votre besoin et à la localisation du serveur Asterisk (hébergement public type Cloud, hébergement privé derrière un firewall, etc.).
D'une façon générale, au plus vous serez précis dans vos règles de filtrage et mieux ce sera.
Enfin, il faut aussi rester pragmatique et implémenter la solution correspondant aux besoins réels avec les contraintes associées sans chercher à faire trop, ni tomber dans la fainéantise du pas-assez. Bref, à vous de trouver le juste équilibre ! ;-)
Pour aller plus loin
fail2ban est-ce vraiment utile ? Partage d'expérience
[Asterisk] Les commandes utiles pour Asterisk
[Asterisk] Connaître son nombre d'appels simultanés
Tous nos articles classés par thème
Voir un article au hasard
Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous.
Retrouvez nos services et firewall pour pfSense
store.provya.fr
Tags de l'article : asterisklinuxsécurité
Le nouveau service DNS de Cloudfare a suscité beaucoup d'attention et de commentaires.
En nous inspirant de l'article DNS over TLS with pfSense, nous proposons ici un guide rapide et en français sur la configuration de vos serveurs DNS sur pfSense et plus particulièrement sur la configuration du DNS sur TLS.
Edit : cet article n'est plus à jour.
Dans ce mini-guide, nous utiliserons les serveurs DNS de Cloudfare, mais ce guide est également applicable avec les serveurs DNS Quad9.
À noter : cet article n'est plus à jour pour pfSense 2.5.x. Une mise à jour de cet article est à paraître prochainement.
À noter : dans ce guide nous travaillerons avec le mode "DNS resolver" actif et le mode transfert (DNS Query Forwarding) doit être désactivé puisque notre configuration va créer sa propre zone de transfert. Il s'agit de la configuration par défaut de pfSense.
1. Utiliser les serveurs DNS Cloudfare (ou Quad9)
La première étape consiste à configurer pfSense pour qu'il utilise les serveurs DNS de Cloudfare. Pour cela, se rendre dans le menu System > General Setup (ou Système > Configuration générale si votre interface est en français) :
Les serveurs DNS à configurer sont :
Exemple de résultat obtenu :
Cliquer sur le bouton Save (ou Sauvegarder) en bas de page pour enregistrer les modifications.
Si nous avions souhaité utiliser les serveurs DNS de Quad9, les serveurs DNS à configurer auraient été les suivants :
2. Activer DNS sur TLS
Il nous reste à configurer pfSense pour lui dire de contacter ces serveurs DNS sur TLS.
Pour cela, se rendre dans le menu Services > DNS Resolver (ou Services > Résolveur DNS) :
Dans l'onglet General Settings (Paramètres généraux), descendre jusqu'à la zone "Custom options" (il faut cliquer sur le bouton "Display Custom Options" pour l'afficher).
Dans cette zone de texte, copier-coller la configuration suivante :
server:
forward-zone:
name: "."
forward-ssl-upstream: yes
forward-addr: 1.1.1.1@853
forward-addr: 1.0.0.1@853
Pour utiliser les serveurs DNS de Quad9 à la place de ceux de Cloudfare, il suffit d'adapter la valeur des lignes forward-addr. La configuration serait alors :
server:
forward-zone:
name: "."
forward-ssl-upstream: yes
forward-addr: 9.9.9.9@853
forward-addr: 149.112.112.112@853
Exemple de résultat obtenu :
Cliquer sur Save (Enregistrer) pour sauvegarder les modifications. Puis appliquer les changements en cliquant sur "Apply Changes" (Appliquer les modifications).
La configuration est terminée !
Pour aller plus loin
[pfSense] Configurer un dual-WAN (plusieurs connexions Internet)
[pfSense] Configurer un cluster de 2 pfSense redondants (failover)
[pfSense] Monter un accès OpenVPN site-à-site
Tous nos articles classés par thème
Voir un article au hasard
Vous avez aimé cet article ? Vous cherchez un support professionnel ? Alors contactez-nous.
Retrouvez nos services et firewall pour pfSense
store.provya.fr
Tags de l'article : DNSpfSensesécuritéTLS