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