Sommaire
Bonjour à tous,
Spirio propose via le domaine dns.spirio.fr un accès ouvert à un résolveur DNS basé sur le logiciel Blocky et qui inclut des restrictions de domaines afin de protéger les utilisateurs des publicités, malwares et de la pornographie. Le problème avec les mesures de protection est qu’elles peuvent et vont souffrir de faux positifs. Il appartient alors à l’administrateur de ces solutions de superviser leur usage afin de les détecter et de réduire leur nombre.
Détections d’anomalies dans les journaux
C’est lors d’une recherche d’autorisation d’un domaine que je suis tombé sur des requêtes DNS qui m’ont interrogés. Ces requêtes étaient de type ANY et de type TXT et étaient présentes en très grands nombres dans mes journaux.
- Type ANY (« Tous ») : Les requêtes de type ANY demandent au serveur DNS de retourner toutes les informations qu’il a sur un domaine donné. Cela inclut toutes les entrées DNS, telles que les enregistrements A, AAAA, MX, NS, et bien d’autres. Étant donné que cette requête demande un grand nombre d’informations, elle est souvent utilisée pour amplifier le trafic dans le cadre d’une attaque par amplification.
- Type TXT (« Texte ») : Les enregistrements TXT sont utilisés pour stocker des données textuelles arbitraires dans les enregistrements DNS. Les attaquants peuvent manipuler ces enregistrements TXT pour inclure des données volumineuses, telles que des chaînes de caractères aléatoires ou des blocs de texte inutiles. Lorsqu’une requête TXT est envoyée avec une taille d’enregistrement texte exagérée, elle peut générer une réponse beaucoup plus importante que la requête elle-même.
Le nombre important de requêtes et la similitude des adresses IP source m’ont amené à conclure que le résolveur DNS que je mets à disposition était utilisé comme amplificateur DNS.
Attaque DNS par amplification
Une attaque DNS par amplification exploite la nature du DNS pour multiplier de manière significative le volume du trafic réseau, tout en cachant l’origine de l’attaque. Le déroulé d’une attaque DNS par amplification est le suivant :
- L’attaquant envoie de fausses requêtes DNS de type ANY ou TXT à un grand nombre de résolveurs DNS publics, en usurpant l’adresse IP de la cible.
- Les résolveurs DNS, croyant qu’ils répondent à la cible réelle, génèrent des réponses volumineuses contenant toutes les informations disponibles sur le domaine ciblé.
- Ces réponses volumineuses sont renvoyées à la cible réelle, provoquant une saturation de sa bande passante et une interruption de service.
En complément, cela a aussi pour conséquence d’atteindre à la réputation de l’adresse IP de mon serveur.
Tentative de remédiation avec Fail2ban
Configuration de fail2ban
Afin de bloquer les nombreuses requêtes DNS de type ANY que je recevais, j’ai pensé à utiliser fail2ban afin de les bloquer. La mise en place d’une nouvelle règle dans fail2ban fonctionne de la façon suivante :
- Création d’une règle dans le répertoire /etc/fail2ban/rules.d/ ;
- Chargement de la règle dans jail.conf ;
- Redémarrage de fail2ban ;
- Vérification de la présence de la règle de blocage dans nftables.
Prenons l’exemple de cette requête DNS pour dérouler le tutoriel :
May 29 11:42:00 vps-xyz blocky[28185]: 8mA== client_ip=185.173.x.y client_names=185.173.x.y hostname=blocky-hostname question_name=sl. question_type=ANY response_code=NOERROR response_reason=CACHED response_type=CACHED
Création d’un fichier /etc/fail2ban/rules.d/blocky-dns.conf qui contient la règle fail2ban à appliquer.
[Definition]
failregex = .* client_ip=<HOST>.* question_name=sl\. question_type=ANY
ignoreregex =
Il faut ensuite ajouter une jail qui utilisera cette règle. On va pour cela modifier le fichier /etc/fail2ban/jail.d/jail.local et l’ajouter. Je me suis un peu amusé à mettre des durées et des déclenchements spécifiques. La règle de blocage autorise jusqu’à 5 occurrences de la règle précédente dans les 10 dernières minutes avant d’appliquer le bannissement de l’adresse IP à tous les ports pendant 10 minutes. Si la règle de filtrage s’active à nouveau, la durée du bannissement se voit multiplié par 1.5 à laquelle s’ajoute une durée aléatoire inférieur à 10 heures.
[blocky-dns]
enabled = true
filter = blocky-dns
backend = systemd
maxretry = 5
bantime = 600
findtime = 600
bantime.increment = true
bantime.factor = 1.5
bantime.rndtime = 36000
banaction = nftables-allports
On va ensuite redémarrer fail2ban afin que la nouvelle règle de banissement soit prise en compte.
sudo systemctl restart fail2ban
On vérifie ensuite que la règle est bien activée.
sudo fail2ban-client status
Des résultats insatisfaisants
Malgré l’efficacité de la règle, utiliser fail2ban comme outil de protection des attaques par amplification DNS ne me semble pas être une bonne idée.
- Je bloque l’accès aux services de mon serveur aux adresses IP sources alors qu’elles sont aussi victimes ;
- Les filtres fail2ban sont spécifiques et peuvent être abusés et contournés ;
- Les journaux générés par les requêtes sont verbeux et prennent de la place ;
- L’anonymat des requêtes DNS reçues n’est plus maintenu.
Et avec Blocky
La solution idéale serait d’imposer un quota par type de requête DNS par adresse IP. Malheureusement, Blocky ne propose ni cette option pour certains type de requête DNS ni même l’option de quota. La solution que j’ai trouvé consiste à refuser de répondre aux requêtes à toutes les requêtes DNS de type ANY et TXT. J’ai également supprimé les règles fail2ban que j’avais mises en place, car inadaptées.
La désactivation des réponses pour les requêtes DNS de type ANY et TXT a malheureusement pour conséquence d’empêcher d’accéder à ces champs. Cela peut poser problème pour le champs TXT car celui-çi est notamment utilisé pour la Sécurité et validation SPF (Sender Policy Framework) ainsi que pour DNSSEC (DNS Security Extensions).
Conclusion
Même si la solution que j’ai trouvée n’est pas parfaite, elle m’a permis d’arrêter l’utilisation du résolveur DNS comme serveur d’amplification.
L’absence d’option de configuration de Blocky pour répondre à ce type de menace confirme qu’il n’est pas adapté pour être rendu accessible sur internet. C’est d’ailleurs pour cela qu’il porte dans son descriptif : Blocky is a DNS proxy and ad-blocker for the local network written in Go.
Avant de changer de résolveur DNS, je suis ouvert à la mise en place de meilleures solutions.
Laisser un commentaire