23/12/2024

PowerShell

PowerShell : gérer ses credentials avec le module Secret Management

I. Présentation

Dans ce tutoriel, je vous propose de découvrir comment utiliser les modules Secret Management et Secret Store pour gérer ses credentials avec PowerShell. Vous verrez que nous irons même plus loin.

- Tutoriel disponible au format vidéo :

Depuis plusieurs mois, les équipes de Microsoft travaillent sur le développement d'un module PowerShell nommé Secret Management. Avec ce module, Microsoft offre une nouvelle manière de gérer les credentials avec PowerShell.

En effet, Secret Management va s'appuyer sur un coffre-fort (vault) pour stocker les identifiants et mots de passe, ainsi que même, pourquoi pas, des clés de licence ou d'API. Pour le coffre-fort, on peut s'orienter vers un second module développé par Microsoft et baptisé Secret Store, mais ce n'est pas tout !

Il y a des modules tiers qui vont permettre à Secret Management d'interagir avec d'autres coffres-forts : KeePass, LastPass, Chromium, Bitwarden, 1Password, etc... Ainsi qu'Azure Key Vault, au niveau du Cloud Microsoft. Une recherche avec le mot clé "SecretManagement" sur le site PowerShell Gallery permet d'avoir la liste : powershellgallery.com - SecretManagement

Sinon, en PowerShell directement tant qu'à faire :

Find-Module -Tag "SecretManagement"
Les modules tiers de Secret Management : KeePass, LastPass, etc.

Ce que je vous propose dans cet article, c'est une initiation complète au module Secret Management en s'appuyant sur Secret Store pour le stockage. Par la suite, d'autres publications vont suivre pour les interactions avec d'autres coffres-forts, notamment KeePass. Avant cela, quelques petits rappels sur le fonctionnement de Get-Credentials et des credentials de manière générale avec PowerShell.

Note : les modules Secret Management et Secret Store sont multi-plateformes, c'est-à-dire qu'ils fonctionnent aussi sur macOS et Linux, en plus de Windows.

II. Get-Credentials : quelques rappels

Pour manipuler un couple identifiant/mot de passe en PowerShell, on s'appuie sur l'utilisation d'un objet de type PSCredential. On peut le générer très facilement en appelant la commande Get-Credential.

En stockant le résultat dans une variable, on peut utiliser les identifiants dans d'autres commandes le temps que la session PowerShell est active.

Prenons un exemple... On va stocker un nom d'utilisateur et un mot de passe dans la variable $Identifiants.

$Identifiants = Get-Credential

Si l'on regarde le contenu de la variable qui est un objet de type PSCredential, on voit qu'il y a deux propriétés : UserName et Password.

$Identifiants

Le nom d'utilisateur (UserName) apparaît bien en clair, quant au mot de passe (Password) il s'agit d'une chaîne sécurisée.

On peut facilement récupérer en clair la valeur du mot de passe :

$Identifiants.Password | ConvertFrom-SecureString -AsPlainText
Get-Credential : la méthode actuelle

Dès lors que l'on ferme la console PowerShell dans laquelle on a créé notre objet, cet objet est perdu. Il faut recréer cet objet à chaque fois que l'on ouvre la console si l'on en a besoin : ce n'est pas pratique, disons-le ! Passons à l'utilisation de Secret Management et Secret Store pour voir en quoi ce module est bénéfique pour gérer les credentials ?.

III. Installation de Secret Management et Secret Store

A. Installer les modules

Pour installer le module Secret Management, ouvrez une console PowerShell et exécutez la commande suivante :

Install-Module -Name Microsoft.PowerShell.SecretManagement

Appuyez sur la touche "A" puis sur Entrée pour valider l'installation. Répétez cette même opération pour le module Secret Store :

Install-Module -Name Microsoft.PowerShell.SecretStore

Dès lors que les deux modules sont installés, vous pouvez passer à la suite...

Installation des modules SecretManagement et SecretStore

B. Secret Management et Secret Store : les commandes disponibles

Pour lister les commandes intégrées à ces deux modules, utilisez ces deux commandes :

Get-Command -Module Microsoft.PowerShell.SecretManagement
Get-Command -Module Microsoft.PowerShell.SecretStore
Liste des commandes des modules SecretManagement et SecretStore

En fait, il y a des commandes pour gérer le coffre-fort en lui-même et notamment définir sa configuration et son mot de passe maître. Il y a aussi des commandes pour gérer les identifiants : récupérer un credential dans le coffre-fort, créer, modifier et supprimer un nouvel identifiant, etc. Nous verrons comment utiliser ces commandes tout au long de l'article.

IV. Créer son coffre-fort Secret Store

A. Register-SecretVault

Pour stocker les identifiants, nous devons créer un coffre-fort grâce au module Secret Store. Pour le créer, on va utiliser la commande "Register-SecretVault" pour lui donner un nom (-Name), en l'occurrence MySecretStore, et le définir par défaut (-DefaultVault).

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

La commande ne retourne pas de confirmation, néanmoins le coffre-fort est bien créé. Vous remarquerez que nous n'avons pas non plus déclaré le mot de passe maître pour le moment.

B. Obtenir la liste des vaults / coffres-forts

La commande Get-SecretVault permet d'obtenir la liste des coffres-forts enregistrés sur la machine locale pour l'utilisateur courant. C'est également un moyen de voir quel est le coffre-fort par défaut.

Get-SecretVault
Get-SecretVault

D'ailleurs, la modification du coffre-fort par défaut s'effectue à l'aide de la commande Set-SecretVaultDefault.

C. Get-SecretStoreConfiguration

Essayons de consulter la configuration de notre vault avec la commande suivante :

Get-SecretStoreConfiguration

Tiens, tiens, un mot de passe est demandé : c'est le moment de créer le mot de passe maître pour protéger notre coffre-fort.

Note : si vous perdez ce mot de passe, vous perdez définitivement l'accès à votre coffre-fort !

Pour consulter les informations du coffre-fort, il faudra le déverrouiller à l'aide de ce mot de passe maître.

Get-SecretStoreConfiguration

La commande ci-dessus retourne des informations sur la configuration du coffre-fort.

Get-SecretStoreConfiguration
  • Scope

La valeur par défaut "CurrentUser" ne peut pas être modifiée et elle signifie que le coffre-fort créé est accessible seulement par l'utilisateur en cours sur votre machine.

  • Authentication

Pour accéder au coffre-fort, il faut s'authentifier avec un mot de passe puisque la valeur est "Password". Concrètement, cela protège les identifiants stockés dans le coffre-fort par contre c'est contraignant pour aller piocher à l'intérieur si l'on veut automatiser des tâches.

Il est possible de modifier cette valeur pour accéder au coffre-fort sans devoir indiquer le mot de passe maître, mais en termes de sécurité, ce n'est pas recommandé ! Si vous y tenez, voici la commande :

Set-SecretStoreConfiguration -Authentication None
  • PasswordTimeout

À partir du moment où le coffre-fort est déverrouillé avec le mot de passe maître, il va se verrouiller automatiquement lorsque ce délai d'expiration (timeout) sera atteint. Par défaut, la valeur est de 900 secondes, ce qui correspond à 15 minutes.

Si vous déverrouillez le vault et que vous avez des interactions avec lui, le timeout se remet à zéro à chaque fois. Pour modifier cette valeur, voici la commande à utiliser en prenant pour exemple 10 minutes (600 secondes) :

Set-SecretStoreConfiguration -PasswordTimeout 600
  • Interaction

Le mode d'interaction par défaut "Prompt" signifie que le mot de passe maître sera demandé directement dans la console. En fait, si la méthode "Prompt" est désactivée et remplacée par la valeur "None", il faut utiliser le cmdlet Unlock-SecretStore pour déverrouiller le coffre-fort.

Set-SecretStoreConfiguration -Interaction None

Après avoir modifié le mode d'interaction, si l'on essaie de consulter la configuration on obtient une erreur. Il faut d'abord déverrouiller le coffre-fort pour permettre l'accès.

Exemple d'utilisation de la commande Unlock-SecretStore

D. Modifier le mot de passe maître du coffre-fort

À condition de connaître, le mot de passe maître actuel, vous pouvez changer le mot de passe à l'aide de la commande suivante : Set-SecretStorePassword.

Set-SecretStorePassword

Le mot de passe actuel sera demandé, puis le nouveau !

E. Où est stocké le coffre-fort créé par Secret Store ?

Sur Windows, le coffre-fort sera stocké dans un dossier sous "Application Data" au sein du profil de l'utilisateur courant.

%LOCALAPPDATA%\Microsoft\PowerShell\secretmanagement

Pour le moment, Secret Management n'est pas compatible avec les comptes MSA, car ils n'ont pas de profil directement.

Pour les machines non-Windows, le chemin est bien sûr différent :

$HOME/.secretmanagement

Le coffre-fort est maîtrisé, on peut maintenant apprendre à l'utiliser.

V. Créer son premier identifiant à l'aide de Secret Management

A. Stocker une chaîne simple dans son coffre-fort

Pour créer un nouveau secret, il n'y a pas de commande du style "New-Secret", par contre il y a la commande Set-Secret qui sert principalement à créer un nouveau secret, mais aussi à modifier un secret existant (en réécrasant le secret). 

Pour créer un secret, on doit préciser le coffre-fort (vault) ciblé : s'il y en a pas de spécifié, ce sera celui par défaut qui sera utilisé. Enfin, on spécifie le nom du secret via le paramètre -Name, ici "Compte1". Si l'on appuie sur Entrée sans spécifier autre chose, le type sera par défaut sur "SecureString".

Essayez cette commande :

Set-Secret -Vault MySecretStore -Name Compte1

Il faudra indiquer la valeur du secret lorsque le prompt va apparaître, puis le mot de passe maître du vault.

Pour lister le contenu du vault, on s'appuie sur la commande Get-SecretInfo. Grâce à elle, on peut vérifier que notre secret est bien créé :

Get-SecretInfo
Get-SecretInfo
Get-SecretInfo : lister le contenu du coffre-fort

Pour consulter la valeur du secret que l'on vient de créer, il faut convertir la chaîne sécurisée (SecureString) vers une valeur texte en clair. Il faut savoir que pour utiliser un secret, on l'appelle avec Get-Secret en précisant le coffre-fort et le nom du secret. Ensuite, il suffit d'utiliser ConvertFrom-SecureString avec l'option -AsPlaintText pour obtenir le secret en clair dans la console.

Remarque : l'option -AsPlainText est disponible à partir de PowerShell 7.0

Get-Secret -Vault MySecretStore -Name Compte1 | ConvertFrom-SecureString -AsPlainText

Pour ma part, la commande me retourne la valeur "azerty", ce qui correspond bien à mon secret, et quel secret ! ?

B. Stocker un couple utilisateur et mot de passe dans le coffre-fort

Nous avons vu que l'on pouvait stocker une simple chaîne de caractères dans notre coffre-fort. En fait, il y a plusieurs types de secrets supportés : Hashtable, Byte, String, SecureString et PSCredential. Ce dernier type de secret m'intéresse tout particulièrement, car il va permettre de stocker dans le coffre un couple "login/password" complet. On pourra l'utiliser dans différentes commandes PowerShell : interroger l'Active Directory, se connecter à distance sur une machine avec Enter-PSSession, etc.

Cette fois-ci, on va nommer le secret "CompteDomaine" et spécifier le paramètre -Secret pour lequel on va s'appuyer sur Get-Credential. Une fois la commande exécutée, il faudra : indiquer le nom de l'utilisateur, ici "[email protected]" puis le mot de passe associé.

Set-Secret -Vault MySecretStore -Name CompteDomaine -Secret (Get-Credential)
Set-Secret
Set-Secret avec Get-Credentials

Attention, quand vous ajoutez un mot de passe pour un compte utilisateur dans votre coffre-fort, à aucun moment il n'y a une vérification du mot de passe. Autrement dit, vous pouvez entrer n'importe quoi dans votre coffre-fort, il n'y a pas de mécanisme qui va vérifier que votre mot de passe est valide.

Si l'on veut récupérer le mot de passe en clair suite à l'ajout dans le coffre-fort :

$CompteDomaine = Get-Secret -Vault MySecretStore -Name CompteDomaine
$CompteDomaine.Password | ConvertFrom-SecureString -AsPlainText

Ou en une seule ligne on peut le faire aussi :

(Get-Secret -Vault MySecretStore -Name CompteDomaine).Password | ConvertFrom-SecureString -AsPlainText

C. Ajouter des métadonnées via -Metadata

Le fait d'utiliser le coffre-fort via Secret Store permet d'ajouter à nos secrets des métadonnées complémentaires. Microsoft ne garantit pas la compatibilité avec les autres coffres-forts, mais au moins nous pouvons déjà tester avec celui-ci.

On peut imaginer ajouter plusieurs informations : une description, une date de création, une date d'expiration, etc. On est libre en fait sur la création des métadonnées et chaque secret peut avoir ses propres métadonnées.

Pour ajouter à notre secret "CompteDomaine" une métadonnée nommée "description" avec la valeur "Connexion au domaine Active Directory it-connect.local", on va utiliser cette commande :

Set-SecretInfo -Vault MySecretStore -Name CompteDomaine -Metadata @{description = "Connexion au domaine Active Directory it-connect.local"}

L'option -Metadata est disponible également avec Set-Secret lors de la création initiale du secret.

Ensuite, il suffit de consulter le contenu de notre coffre-fort en affichant la colonne Metadata :

Get-SecretInfo | Ft Name, Metadata

VI. Exploiter son coffre-fort au quotidien avec Secret Management

Puisque notre coffre-fort est créé et qu'il contient déjà deux secrets, dont un avec le type PSCredentials, nous allons pouvoir exploiter cet identifiant.

Typiquement, on arrive le matin, on démarre sa machine et on commence sa première tâche d'administration de la journée qui nécessite de se connecter sur une machine Windows 10 à distance. L'objectif, c'est de se connecter sur la machine PC-W10 à partir de l'hôte SRV-ADDS-01.

Lors du premier accès de la journée à notre coffre-fort, il faudra saisir le mot de passe maître. Ensuite, il reste déverrouiller tant que le timeout ne se déclenche pas.

Si l'on prend la commande Enter-PSSession, on va s'intéresser au paramètre -Credential : on va lui spécifier, non pas "Get-Credential" comme on peut avoir l'habitude de le faire, mais Get-Secret pour appeler notre secret "CompteDomaine".

Enter-PSSession -ComputerName PC-W10 -Credential (Get-Secret -Vault MySecretStore -Name CompteDomaine)

Comme vous pouvez le voir ci-dessous, grâce à mon secret conservé de manière sécurisée dans mon coffre-fort j'ai pu me connecter à distance sur ma machine.

Enter-PSSession et Get-Secret
Enter-PSSession et Get-Secret

Pour utiliser le coffre-fort dans un script pour automatiser une tâche, il y a un point bloquant : le mot de passe maître. En même temps, c'est un peu embêtant de s'en passer... Dans ce cas, il vaut mieux utiliser une méthode permettant de l'appeler de façon sécurisée au début du script pour déverrouiller l'accès au coffre-fort et permettre l'exécution correcte du script.

Tout basiquement, vous pouvez stocker la chaîne sécurisée dans un fichier texte, mais elle est réversible très facilement. L'idéal étant d'utiliser une clé AES ou un certificat pour chiffrer le fichier.

"MonMotDePasseMaitre" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\Temp\MonMotDePasseMaitre.txt"

Le module PowerShell "Secret Management" est super intéressant et il devient rapidement indispensable ! Je vous recommande vivement de vous y mettre pour stocker et protéger vos credentials. L'inconvénient du coffre-fort via Secret Store c'est qu'il est local et propre à l'utilisateur courant : pas de partage du coffre-fort. Même si on déplace le coffre-fort sur un partage ou un OneDrive, l'inconvénient c'est que ce n'est pas supporté par Microsoft.

Pour apprendre à utiliser Secret Management avec une base KeePass : ce qui change la donne vis-à-vis de la problématique que je viens d'évoquer.

PowerShell, Secret Management et KeePass

J'en parle aussi au sein de la vidéo sur Secret Management intégrée en début d'article !

author avatar
Florian BURNEL Co-founder of IT-Connect
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.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

1 commentaire sur “PowerShell : gérer ses credentials avec le module Secret Management

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.