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
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 :
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 ? 🙂
Bonjour et merci pour cet excellent tutoriel. 🙂
Super ! Merci pour ce tuto également. Des liens pour télécharger un dictionnaire de mot de passe ?
Merci
Je vous remercie pour ce tutoriel tout en images! Rien à ajouter, vous êtes super
Voilà se que je cherchais depuis un moment.
Maintenant je sais qui n’a pas de pwd dans mon domaine :@
Merci.
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
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)
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
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
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 !!!
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.
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
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
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