Cet article fait partie de notre guide: Guide des bonnes pratiques sur les serveurs Windows

Comment sécuriser les mots de passe avec PowerShell

Stocker des mots de passe en texte brut est une très mauvaise idée ! Il est possible de les chiffrer depuis PowerShell avec des chaînes sécurisées ou le module SecretManagement.

Tous les professionnels de l’informatique savent qu’il ne faut pas stocker les mots de passe en texte clair. Mais cette règle est difficilement respectée quand il faut pouvoir manipuler ce mot de passe ultérieurement depuis des scripts.

Outre l’écriture de mots de passe en clair sur un disque, une erreur classique consiste à stocker un mot de passe sous la forme d’une variable dans un script PowerShell. Cela peut sembler plus sûr, car il est difficile de lire de manière indirecte le contenu d’un script PowerShell. Cependant, PowerShell stocke en mémoire les variables qui correspondent aux chaînes de caractères.

Cela signifie que tout ce qui tourne sur votre système peut accéder à n’importe quelle variable dans votre session PowerShell. Le plus souvent, il s’agira d’un script automatisé depuis un service dont un malware a acquis les droits d’utilisation. Prenons l’exemple d’un script PowerShell qui exécute les commandes suivantes :

$str = 'Password1!' 
$str2 = ConvertTo-SecureString 'Password2!' -AsPlainText -Force
$pw = Read-Host -AsSecureString

En utilisant le dĂ©bogueur de Windows, nous pouvons soit analyser la mĂ©moire du processus en direct, soit par le biais d’un outil de visionnage de la mĂ©moire, comme ProcDump. Grâce Ă  cette analyse, nous pouvons trouver les variables de type chaĂ®ne et voir la valeur de $str, comme le montre la figure 1.

Screenshot de ProcDump qui montre la valeur de $str.
Figure 1. ProcDump montre la valeur de $str.

Si nous utilisons le dĂ©bogueur pour examiner l’objet HistoryInfo de PowerShell, nous pouvons Ă©galement trouver la valeur de $str2, comme le montre la figure 2.

style="font-family: 'courier new', courier, monospace;">$str2, seen in Figure 2.

Screenshot de la valeur de $str2 grâce à l'objet HistoryInfo de PowerShell.
Figure 2. Voir la valeur de $str2 grâce à l'objet HistoryInfo de PowerShell.

Bien qu’une explication complète de la manière de récupérer ces informations soit hors de portée de cet article, sachez que l’analyse de la mémoire de PowerShell peut exposer des chaînes en texte clair.

L’utilisation d’une chaĂ®ne sĂ©curisĂ©e, comme indiquĂ© Ă  la ligne 3 de la figure 2, empĂŞche la lecture du texte en mĂ©moire. Évitez de manipuler le mot de passe d’une manière qui pourrait l’exposer avant qu’il soit devenu une chaĂ®ne de caractères sĂ©curisĂ©e.

Comment utiliser des chaĂ®nes de caractères sĂ©curisĂ©es ?

Les chaĂ®nes de caractères sĂ©curisĂ©es sont souvent nĂ©gligĂ©es en raison de leur complexitĂ©, c’est pourquoi nous allons vous expliquer brièvement comment les utiliser. Le script du premier exemple contient deux lignes diffĂ©rentes de chaĂ®nes sĂ©curisĂ©es. La première montre comment convertir une chaĂ®ne de caractères normale en une chaĂ®ne sĂ©curisĂ©e Ă  l’aide de ConvertTo-SecureString :

$str2 = ConvertTo-SecureString 'Password2!' -AsPlainText -Force

La seconde ligne montre comment utiliser Read-Host pour convertir automatiquement les entrĂ©es saisies au clavier en une chaĂ®ne sĂ©curisĂ©e que l’on stocke dans une variable $pw :

$pw = Read-Host -AsSecureString

Cette commande masque le texte lorsque vous le tapez, comme le montre la figure 3.

Screenshot de Read-Host qui convertit le texte en chaîne sécurisée.
Figure 3. Read-Host convertit le texte en chaîne sécurisée.

Avec une chaĂ®ne de caractères sĂ©curisĂ©e, nous pouvons utiliser un mot de passe en toute sĂ©curitĂ©, mais cela ne fonctionne qu’avec les cmdlets et les fonctions qui prennent en charge les chaĂ®nes sĂ©curisĂ©es. Parfois, vous pouvez avoir besoin de reconvertir la chaĂ®ne sĂ©curisĂ©e en texte brut, ce que vous pouvez faire avec le type pscredential :

[pscredential]::new('user',$pw).GetNetworkCredential().Password

Comment stocker des mots de passe de manière sĂ©curisĂ©e sur un disque Windows ?

Dans Windows PowerShell, utilisez la cmdlet ConvertFrom-SecureString pour convertir une chaĂ®ne sĂ©curisĂ©e de la mĂ©moire de PowerShell en une chaĂ®ne de texte brut â€“ dont le contenu reste nĂ©anmoins chiffrĂ©. Le format texte peut ĂŞtre Ă©crit sur le disque et utilisĂ© ultĂ©rieurement :

$pw | ConvertFrom-SecureString

Le rĂ©sultat ressemblera Ă  la figure 4.

Screenshot de la cmdlet ConvertFrom-SecureString qui chiffre une chaîne.
Figure 4. La cmdlet ConvertFrom-SecureString chiffre une chaîne.

Vous pouvez rediriger cette sortie-Ă©cran directement vers un fichier, tout en sachant qu’elle est chiffrĂ©e. Si le paramètre -Key n’est pas spĂ©cifiĂ©, l’API de protection des donnĂ©es de Windows sĂ©curise la chaĂ®ne de sorte qu’elle ne puisse ĂŞtre dĂ©cryptĂ©e que par le mĂŞme utilisateur, sur la mĂŞme machine. Sinon, choisissez de spĂ©cifier une clĂ© de chiffrement personnalisĂ©e avec le paramètre -Key :

$key = 0..255 | Get-Random -Count 32 | %{[byte]$_} 
$pw | ConvertFrom-SecureString -Key $key

Vous devez stocker la clé séparément du mot de passe chiffré en clair.

Pour dĂ©chiffrer la chaĂ®ne de caractères, utilisez la clĂ© avec ConvertFrom-SecureString :

$encStr = Get-Content .\password.txt 
$encStr | ConvertFrom-SecureString -Key $key

Comment stocker des mots de passe de manière sĂ©curisĂ©e sur n’importe quel disque ?

Comme la mĂ©thode de stockage des mots de passe prĂ©sentĂ©e dans la prĂ©cĂ©dente section dĂ©pend de l’API de protection des donnĂ©es de Windows, elle est spĂ©cifique Ă  Windows. Mais Microsoft a dĂ©veloppĂ© un module de gestion des mots de passe compatible avec Windows PowerShell sur toutes les plates-formes : le module SecretManagement.

Le module SecretManagement vous permet de vous interfacer de manière universelle avec un système de stockage chiffrĂ©, ou « coffre-fort Â». Le module SecretManagement ne chiffre pas lui-mĂŞme, il fournit juste un accès vers un coffre-fort qui, lui, chiffre les contenus.

Pour le stockage sĂ©curisĂ© des contenus secrets (dont les mots de passe, mais pas uniquement), Microsoft fournit le système de stockage SecretStore – un coffre-fort basique, mais efficace. PowerShell peut aussi se connecter Ă  d’autres systèmes de coffre-fort, comme KeePass, LastPass ou 1Password. Pour cela, il faut passer par des modules tiers, dĂ©veloppĂ©s par la communautĂ© ; ce ne sont pas des versions officielles crĂ©Ă©es par Microsoft ou par les marques respectives.

Pour rĂ©fĂ©rencer un coffre-fort avec le module SecretManagement, utilisez la cmdlet Register-SecretVault :

Register-SecretVault -Name FirstVault -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault

Spécifiez le module qui correspond à votre coffre-fort. Ici, nous utilisons le module SecretStore qui correspond au coffre-fort du même nom développé par Microsoft. Lors de la création d’un coffre-fort, aucun mot de passe ne vous sera demandé pour sécuriser le coffre-fort. Cela n’arrivera que lorsque vous y stockerez un premier secret, ce qui se fait avec la cmdlet Set-Secret :

Set-Secret -Name FirstPassword -Secret "Password1!"

À ce moment, le système vous demandera de sécuriser le coffre-fort avec un mot de passe.

Ensuite, pour relire le secret prĂ©cĂ©demment stockĂ©, utilisez la cmdlet Get-Secret :

Get-Secret -Name FirstPassword

Par défaut, cette méthode renvoie le mot de passe sous la forme d’une chaîne sécurisée. Toutefois, si vous avez besoin du mot de passe en texte clair, utilisez le paramètre -AsPlainText.

Pour approfondir sur Administration de systèmes