Protection des attaques de connexion par force brute dans Drupal 8

Kevin

Kevin


Jun 19th 2018 in code recherche

Qu'est-ce qu'une attaque de connexion par force brute?

L'attaque par force brute – ou attaque par exhaustivité – est une méthode utilisée en cryptanalyse pour trouver un mot de passe. Il s'agit de tester, une à une, toutes les combinaisons possibles et imaginables avant d'atteindre la bonne solution.

Comme vous pouvez le deviner, c'est une technique peu subtile, voire barbare, mais furieusement efficace. Elle est la plupart du temps utilisée sur des formulaires de connexion pour tenter de voler un mot de passe.
Combinée avec l'attaque par dictionnaire et par Rainbow table certaines clés ou mot de passe peuvent être découverts en seulement quelques minutes.

A closer examination of major breaches reveals that common attack vector has been the password. The reason is simple: passwords are by far the weakest link in cybersecurity.

Dans les prochaines lignes, je vais vous exposer les dispositifs mis en place dans Drupal 8 afin de contrer ces attaques par force brute sur les formulaires de connexion.
Je vais également vous expliquer comment modifier les différents paramètres de protection afin d'assouplir ou d'endurcir le système de sécurité par défaut.
Enfin, pour les intéressés et les plus endurcis, je vais faire une brève analyse de complexité théorique de l'attaque par force brute.

Dispositif de contre-attaque

L'attaque par force brute se fonde sur le nombre de tentatives: plus on essaie de mots de passe faux et plus nous nous rapprochons de la solution.

Le but de la protection est donc de rendre cette opération la plus coûteuse et laborieuse à l'attaqueur.

2 brevets existent à ce sujet :

  • Celui d'IBM, qui consiste à renvoyer l'information "Mot de passe invalide" après N essais infructueux en un temps T, y compris si le mot de passe est valide : le pirate a alors toutes les chances de considérer comme invalide le mot de passe valide.
  • Celui de Bell qui consiste à doubler le temps d'attente après chaque essai infructueux, pour le faire redescendre ensuite crescendo après un certain temps sans attaque. C'est une variante de ce brevet qui est utilisée dans le Core de Drupal 8;

Ce système de protection porte le doux nom de protection par Flood Control.

Par défaut, Drupal définit N tentatives infructueuses par utilisateur avant d'interdire l'accès à celui-ci pendant X heures.
Évidemment, la seule restriction temporelle par utilisateur n'est pas suffisante: l'attaquant pourrait tenter un assaut sur plusieurs comptes en même temps. C'est pourquoi, en plus d'une limite par compte, il a été mis en place une limite d'échecs par IP.
Ainsi, une adresse IP effectuant plus de N échecs de connexion se verra interdit d'accès pendant X heures.

Grâce cette méthode, les attaques par force brute deviennent alors complètement infructueuses.

Tweaker le système anti-flood de Drupal 8

Nous sommes tous tombés une fois ou l'autre sur le message d'erreur suivant:

There have been more than 5 failed login attempts for this account. It is temporarily blocked. Try again later.

Par défaut, Drupal définit 5 tentatives infructueuses par utilisateur avant d'interdire l'accès à celui-ci pendant 6 heures, avec ou sans mot de passe correct.
De plus, et comme expliqué plus haut, la restriction IP se monte à 50 échecs pour une interdiction de 1 heure.

Ces valeurs sont excellentes et correspondent à la norme, mais parfois il est nécessaire de les modifier, par exemple dans le cas d'une amélioration d'accessibilité - laisser le droit à plus de tentatives. Seul bémol, ces configurations ne sont pas exposées dans l'interface d'administration.

Sur Drupal 7 ce n'était pas un problème de modifier ces valeurs, le module contrib Flood Control permettant de le faire aisément, mais il n'existe aucun portage Drupal 8 à ce jour - Nous sommes d'ailleurs en contact avec l'auteur pour reprendre le lead du projet et proposer une version 8 dans les prochains mois.

Puisqu'il n'existe pas de module pour changer ces valeurs dans Drupal 8, il suffit d'ajouter quelques lignes de configurations dans le fichier settings.php:

Avec ces quelques lignes, vous avez modifié le système de Flood Control de Drupal 8.

Pour les plus curieux

Waouh, vous êtes encore là ?!

Nous allons maintenant nous attarder sur la complexité théorique d'une attaque par force brute.
Je vais vous démontrer par A+B comment créer des mots de passe sécurisés et simples à mémoriser.

Cette partie de l'article n'est plus en lien avec Drupal 8 et son implémentation du Flood Control.

Préparez un Dafalgan, la suite de l'article se corse drastiquement.

Si un mot de passe contient N caractères, indépendants - la présence d'un caractère ne va pas influencer un autre - et uniformément distribués - aucun caractère n'est privilégié - alors, le nombre maximum d'essais nécessaires se monte alors à :

  • 26^N si le mot de passe ne contient que des lettres de l'alphabet totalement en minuscules ou en majuscules ;
  • 52^N si le mot de passe ne contient que des lettres de l'alphabet, avec un mélange de minuscules et de majuscules ;
  • 62^N si le mot de passe mélange les majuscules et les minuscules ainsi que les chiffres.
  • 95^N si le mot de passe mélange les majuscules et les minuscules, les chiffres et les caractères spéciaux d'un clavier selon OWASP (!"#$%&'()*+,-./:;<=>?@[]^_`{|}~").

Il suffit donc d'augmenter la taille de l'alphabet pour augmenter la sécurité d'un mot de passe. Il s'agit ici de valeur supérieure, il faut en moyenne bien moins d'essais pour trouver une clé ou un mot de passe.

Le tableau ci-dessous donne le nombre maximum d'essais nécessaires pour trouver des mots de passe de longueurs variables.

Ces chiffres peuvent faire tourner la tête, mais ne vous y méprenez pas, c'est absolument minuscule.
Pour comparaison, un ordinateur personnel de 2018 est capable de tester plusieurs centaines de milliers voire des millions de mots de passe par seconde (plus exactement 15'050'850'210 passwords/seconds).

Dans le cas des clés utilisées pour le chiffrement, lors de transactions bancaires, durant votre navigation sur Facebook ou tout autre type de données sensibles, la longueur est souvent donnée en bits.
Dans ce cas, le nombre de possibilités à explorer est de l'ordre de 2^N où N est la longueur de la clé en bits.
Une clé de 128 bits représente déjà une limite impossible à atteindre avec la technologie actuelle et l'attaquant doit envisager d'autres solutions cryptanalytiques, certains s'intéressent aux ordinateurs quantiques et leur puissance de calcul incroyable.
Je vous conseille l'excellentissime article de Hackday à ce sujet - Quantum Computing Kills Encryption.

Et si on détruisait un mythe maintenant ?

L'augmentation de l'alphabet augmente certes la complexité d'un mot de passe, mais pas sa sécurité. Seule sa longueur augmente le temps, le coût et donc la robustesse de ceux-ci.

When it comes to passwords size matters.
- Durex

Petite démonstration par l'exemple:

  • Le mot de passe MaisOuEstDoncOrNiCar, 20 caractères alphanumériques: 52^20 = 1.99 × 10^28;
  • Le mot de passe A0s_23$, 7 caractères : 95^7 = 6.98 × 10^13.

Un mot de passe uniquement alphanumérique de 20 caractères est bien plus robustesse (exactement 2.85 × 10^14) qu'un mot de passe immémorisable de 7 caractères.
Evidement, avec les technologies de DeepLearning, utiliser une phrase du domaine public ou une citation est une très mauvaise idée.

En bref, utiliser des phrases sans queue ni tête, non extraite de citation ou autres phrases célèbres et d'une longueur consequent (~16 lettres ou 7 mots) vous assurera une protection optimal.

J'espère avoir réussi à vous sensibiliser quant à l'importance de vos mots de passe. Essayez de ne pas utiliser le même sur plusieurs sites et d'éviter les mots du dictionnaire.


Sources

Pour les plus curieux d'entre vous, voici quelques sources d'informations complémentaires ayant inspiré la création de cet article.

Tamer Zoubi (15 janvier 2018). Increase flood limit and flood interval in Drupal 8.
Retrieved from zoubi.me

Drupal Core (08 mai 2018). Drupal 8 configuration management.
Retrieved from api.drupal.org

Rob Shapland (juin 2012). Techniques for preventing a brute force login attack.
Retrieved from computerweekly.com

Wikipedia (mai 2018). Brute force.
Retrieved from en.wikipedia.org

Arthur Caillau (31 octobre 2013). Éviter les attaques par force brute.
Retrieved from openclassrooms.com

Stackexchange (31 août 2017). Expert on entropy for uncrackable password.
Retrieved from security.stackexchange.com

Better Buys, (mai 2018). Estimating Password Cracking Times.
Retrieved from betterbuys.com