Active Directory : Auditer la qualité des mots de passe

I. Présentation

Les mots de passe utilisés par vos utilisateurs sont-ils complexes ? Sont-ils facilement détectables par un dictionnaire ? Certains utilisateurs ont-ils le même mot de passe ? Est-ce que certains mots de passe n’expirent jamais ? Est-ce qu'il y a des utilisateurs qui n'ont pas de mots de passe ? .... ?

Il y a de nombreuses questions que l'on peut se poser quant aux mots de passe des utilisateurs dans un Active Directory, la sécurité des comptes est primordiale et un audit des comptes peut-être réalisé facilement, en PowerShell.

Le module DSInternals disponible gratuitement sur Internet contient un lot de commandlets intéressants pour réaliser des opérations sur un Active Directory en ligne, ou même hors ligne directement sur la base ntds.dit. Il intègre notamment le commandlet "Test-PasswordQuality" qui permet d'analyser les mots de passe dans l'AD et de sortir un rapport suite à l'audit.

J'en profite également pour préciser qu'il y a certainement d'autres méthodes, d'autres solutions, alors si vous avez un retour n'hésitez pas à laisser un commentaire 🙂

Voyons comment l'utiliser. Ce tutoriel est également disponible au format vidéo :

Article actualisé le 26/10/2020 et toujours fonctionnel sur les dernières versions de Windows Server.

II. DSinternals et Test-PasswordQuality

Ouvrez une console PowerShell et commencez par installer le module PowerShell DSInternals :

Install-Module -Name DSInternals

Test-PasswordQuality-1

Ensuite, on va créer un dictionnaire de mots de passe (vous pouvez aussi essayer d'en trouver un sur internet), pour ma part j'en ai créé un pour l'occasion avec quelques mots de passe aléatoire et quelques mots de passe que j'ai définis pour l'occasion sur mes utilisateurs, au sein de mon AD de test :

Test-PasswordQuality-2

Maintenant on va commencer le script, avec tout d'abord l'import du module :

# Modules
Import-Module DSInternals

Puis on va se définir quelques variables :

# Variables prédéfinies
$DictionaryFile = "C:\passwords.txt"
$DC = "ADDS01"
$Domain = "DC=it-connect,DC=local"

Elles correspondent au chemin vers le fichier dictionnaire ($DictionaryFile), au contrôleur de domaine ciblé ($DC) et au domaine sous la forme d'un DN ($Domain).


Ensuite, on va utiliser le commandlet "Get-ADReplAccount" pour lire l'AD et récupérer la liste des objets ainsi que leurs attributs secrets, comme le hash NT, le hash LM ou encore l'historique des hashs de l'utilisateur. Pour chaque utilisateur (via le pipe), on va tester le mot de passe notamment avec le dictionnaire,  tout en intégrant les comptes désactivés.

Note : Les mots de passe ne pourront pas être récupérés en clair directement (sauf s'ils sont définis avec un chiffrement réversible) mais en comparant les hash on pourra en retrouver certains via un dictionnaire.

Voici la commande :

Get-ADReplAccount -All -Server $DC -NamingContext $Domain | `
   Test-PasswordQuality -WeakPasswordsFile $DictionaryFile -IncludeDisabledAccounts

Ce qui donnera l'ensemble suivant :

# Modules
Import-Module DSInternals

# Variables prédéfinies
$DictionaryFile = "C:\passwords.txt"
$DC = "ADDS01"
$Domain = "DC=it-connect,DC=local"

# Audit avec dictionnaire
Get-ADReplAccount -All -Server $DC -NamingContext $Domain | `    
   Test-PasswordQuality -WeakPasswordsFile $Dictionary -IncludeDisabledAccounts

L'exécution du script donnera un rapport comme ceci :

Active Directory Password Quality Report
----------------------------------------

Passwords of these accounts are stored using reversible encryption:
  
LM hashes of passwords of these accounts are present:
  
These accounts have no password set:
  Invité
  
Passwords of these accounts have been found in the dictionary:
  user2                Passw0rd
  user3                Okokokok1
  
Historical passwords of these accounts have been found in the dictionary:
  
These groups of accounts have the same passwords:
  Group 1:
    Administrateur
    florian
    scvmm
  
These computer accounts have default passwords:
  
Kerberos AES keys are missing from these accounts:
  
Kerberos pre-authentication is not required for these accounts:
  
Only DES encryption is allowed to be used with these accounts:
  
These administrative accounts are allowed to be delegated to a service:
  Administrateur
  krbtgt
  
Passwords of these accounts will never expire:
  florian
  Invité
  scvmm
  user1
  user2
  user3
  
These accounts are not required to have a password:
  Invité

Selon les cas de figure dans votre AD et comment il est configuré, plus ou moins d'utilisateurs vont ressortir pour les différents tests. Une bonne complexité des mots de passe jouera pour beaucoup sur la qualité de vos mots de passe.

Si vous souhaitez effectuer le test sans utiliser de dictionnaire, il faudra utiliser simplement ceci (avec les variables à définir quand même) :

# Audit sans dictionnaire
 Get-ADReplAccount -All -Server $DC -NamingContext $Domain |
 Test-PasswordQuality -IncludeDisabledAccounts

Voilà, alors vous allez le faire cet audit ? 🙂

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5499.Voir tous les posts

13 thoughts on “Active Directory : Auditer la qualité des mots de passe

  • Bonjour et merci pour cet excellent tutoriel. 🙂

    Répondre
  • Super ! Merci pour ce tuto également. Des liens pour télécharger un dictionnaire de mot de passe ?
    Merci

    Répondre
  • Voilà se que je cherchais depuis un moment.

    Maintenant je sais qui n’a pas de pwd dans mon domaine :@

    Merci.

    Répondre
  • Bonjour,

    Merci pour cet outil très pratique 🙂

    Savez-vous comment faire pour que la worldlist fonctionne quand une des lignes est vide?
    En effet, il semblerait que ConvertTo-NTHashDictionary ne fonctionne pas quand il reçoit une entrée vide (après je m’y prends peut être mal, je début en powershell 🙂 )

    Merci

    Répondre
  • Bonjour,
    j’ai testé, mais le soucis est que nous avions l’historique de mot de passe activé et qu’il ressort donc des mots de passe en lien avec le dictionnaire, mais qui ne sont pas ceux en cours (concrétement on va retrouver le premier mis lors de la création du compte qui est tout simple). Avez vous une parade à cela ? (j’ai désactivé l’historique de mot de passe car on ne s’en sert pas au final, mais cela ne purge pas la bdd derière)

    Répondre
    • j’ai rien dit, j’avais pas vu que il y avait deux listes, la première sur les mots de passe en cours et la deuxième sur l’historique

      Répondre
  • Bonjour, j’ai ce message lorsque que je tape : install-module -name dsinternals

    install-module…. le terme n’est pas reconnu comme nom d’applet de commande… vérifier que le chemin d’accès est correct.
    une idée peut-être ?
    je me trouve dans le dossier où sont placés les fichiers extrait du dsinternals

    Répondre
  • Bonjour Florian,
    j’étais enthousiasmé à l’idée de pouvoir auditer les mots de passe de mon réseau mais malheureusement la commande ConvertTo-NTHashDictionary ne semble plus supporté en powershell de windows serveur 2016
    Dommage !!!

    Répondre
  • Oula…. Ressortir un article de 2016 n’est pas opportun. Il y a depuis eu pas mal de changement : la complexité, la période de rotation. Tout ça c’est du passé. Même MS a retiré de ses Security Baselines ces trucs. On en est à la segmentation et à la longueur.

    Répondre
    • Bonsoir Laurent,

      Je n’ai pas connaissance de ces changements. Cet outil me semble tout de même intéressant malgré qu’il ne soit pas parfait, et permet également de sensibiliser sur le sujet. Je trouvais pertinent d’en parler dans une vidéo. Connaissez-vous un outil gratuit qui fait mieux ? Je suis preneur 🙂

      Bonne soirée
      Florian

      Répondre
      • Bonsoir Florian
        Ne te fais pas de bile sur ce « flame » balancé sans argument juste au-dessus. DSInternals reste un premier outil qui n’est pas si mal.
        Bien sur il y en a d’autres,
        > gratuit : « https://thycotic.com/solutions/free-it-tools/weak-password-finder/weak-password-finder-nvlss/ »
        Le dev a travaillé avec le dev de DSInternals. Il y a juste des reports plus « zolis » et quelques tests en plus.
        Après il y a d’autres outils plus complets mais payants. Un ex. :
        https://itriskscan.com/assessment-packs/
        Cordialement
        Olivier

        Répondre
  • bonjour.
    Merci pour ce super tuto. Mais j’aurais une petite question. je sais qu’il est possible de vérifier la politique de mots de passe imposé par les GPOs avec Get-ADDefaultDomainPasswordPolicy. je souhaiterai le faire pour tout les utilisateurs de l’AD. avez-vous une petite idée qui m’aiderais à le faire ?
    Cordialement
    Eric

    Répondre

Laisser un commentaire

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

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