PowerShell : comment chiffrer un mot de passe dans un script ?
Sommaire
I. Présentation
Dans ce tutoriel, nous allons apprendre à chiffrer un mot de passe dans un script PowerShell en utilisant le SID de l'utilisateur qui va générer la chaîne sécurisée. C'est une façon, parmi d'autres, de ne pas écrire le mot de passe en clair dans un script.
Ce mot de passe chiffré sera ensuite utilisable pour réaliser diverses actions : s'authentifier auprès de Microsoft 365, auprès d'Azure ou encore pour créer un compte Active Directory qui utilise ce mot de passe (cas d'un mot de passe par défaut que l'on attribue à tous les nouveaux utilisateurs.
Dans cet article, je vais utiliser deux commandes incontournables lorsque l'on manipule des chaînes de caractères sécurisées (SecureString) :
II. Chiffrer le mot de passe avec PowerShell
L'objectif va être de chiffrer le mot de passe "MonSuperMotDePasse" pour que l'on puisse l'utiliser dans le script sans qu'il soit visible en clair. Tout d'abord, on crée une chaîne sécurisée à partir de notre mot de passe qui est un texte brut, ce qui implique d'utiliser l'option "-AsPlainText". Le paramètre "-Force" est nécessaire lorsque l'on utilise "-AsPlainText" sauf si l'on utilise PowerShell 7+ (mais ça fonctionne quand même, car c'est toujours accepté pour des raisons de compatibilité).
$MotDePasse = "MonSuperMotDePasse" $MotDePasse = ConvertTo-SecureString -String $MotDePasse -AsPlainText -Force
Si l'on essaie de lire le contenu de cette variable ou que l'on regarde son type ($MotDePasse.GetType()), on voit qu'il s'agit d'une SecureString. C'est tout bon.
System.Security.SecureString
Ensuite, nous allons récupérer sous forme de texte la chaîne chiffrée, mais sans dévoiler notre super mot de passe :
$MotDePasse | ConvertFrom-SecureString
Une valeur est retournée dans la console. Par exemple :
Il s'agit du mot de passe chiffré : c'est cette valeur que nous allons utiliser dans la prochaine partie de cet article.
III. Utiliser le mot de passe chiffré
Maintenant, toujours à partir du même compte utilisateur, on va utiliser ce mot de passe et on peut aussi définir un nom d'utilisateur. La variable $Utilisateur contient le nom d'utilisateur, tandis que la variable $UtilisateurMdp contient le mot de passe sous la forme d'une SecureString. On utilise ConvertTo-SecureString sans le paramètre "-AsPlainText", car ici ce n'est pas un texte brute mais une chaîne déjà chiffrée que l'on veut stocker dans une SecureString.
Ce qui donne (on réutilise bien la valeur précédente) :
$Utilisateur = "[email protected]" $UtilisateurMdp = 01000000d08c9ddf0115d1118c7a00c04fc297eb010000006c76e757249edf429fc0ee5c2acb5b710000000002000000000010660..... | ConvertTo-SecureString
Ensuite, on peut vérifier que $UtilisateurMdp est bien une SecureString.
Il ne reste plus qu'à l'utiliser dans notre script !
Par exemple, nous pouvons créer un utilisateur dans l'Active Directory qui va hériter de ce mot de passe :
New-ADUser -Name "TestMdp" -AccountPassword $UtilisateurMdp
Dans le même esprit, pour s'authentifier sur Azure AD, sur Microsoft Teams, etc.
$Creds = New-Object System.Management.Automation.PSCredential($Utilisateur,$UtilisateurMdp) Connect-AzureAD -Credential $Creds Connect-MicrosoftTeams -Credential $Creds
Tout cela pour montrer que l'on peut utiliser la SecureString pour définir un mot de passe lors de la création d'un compte ou comme mot de passe dans le cadre de l'authentification sur un service.
IV. Conclusion
Grâce à cette méthode, vous êtes capable de stocker un mot de passe chiffré dans un script PowerShell en utilisant une SecureString et sans qu'il soit visible en clair dans le code ! Il faut savoir que la chaîne chiffrée que l'on a générée dans cette mise en pratique est liée à l'utilisateur et à l'ordinateur, donc il faudra penser à la générer sur l'environnement cible directement pour éviter les dysfonctionnements (et mauvaises surprises). Pour que ce soit "portable", il faudrait s'appuyer sur une clé externe comme une clé AES, par exemple.
Si le sujet du chiffrement avec PowerShell vous intéresse, je vous recommande de regarder du côté de la commande PowerShell "Protect-CmsMessage" (associée à une méthode basée sur de la cryptographie asymétrique).
Bonjour,
A la suite de la lecture de votre article je me suis penché sur l’utilisation de « Protect-CmsMessage » et je me suis permis de publier ici un petit exemple.
# ————————————————————–
# CREER ET IMPORTER LE CERTIFICAT
# ————————————————————–
# Nom du certificat
$CertificateName = « Document SelfSignedCertificate »
# Ajoute un nombre aléatoire au certificate pour éviter les doublons
$CertificateName = $CertificateName + » » + (Get-Random)
# Date d’expiration
$CertExpirationYear = [int]100
# Scope
# LocalMachine / CurrentUser
$Store = « LocalMachine »
# magasin LocalMachine / CurrentUser
$CertStorePath = « cert:\$Store\my »
# ————————————————————–
# Crée un certificat autosigné pour la signature de documents
# Attention le type doit être : -KeyUsage DataEncipherment -Type DocumentEncryptionCert
New-SelfSignedCertificate -CertStoreLocation $CertStorePath -Subject (« CN= » + $CertificateName) -KeyAlgorithm RSA -KeyLength 2048 -Provider « Microsoft Enhanced RSA and AES Cryptographic Provider » -KeyExportPolicy Exportable -KeyUsage DataEncipherment -Type DocumentEncryptionCert -NotAfter (Get-Date).AddYears($CertExpirationYear)
# ————————————————————–
# ENCRYPTER LE TEXTE OU LE MOT DE PASSE
# ————————————————————–
# Chargement du certificat
$Certificate = ((Get-Childitem $CertStorePath) | Where-Object { $_.subject -like « *$CertificateName* » })
# Exemple
$LeTexte = « Voici le mot de passe à encoder avec le certificat »
# Encodage du texte ou du mot de passe
Protect-CmsMessage -To $Certificate -Content $LeTexte
# ————————————————————–
# DECRYPTER LE TEXTE OU LE MOT DE PASSE
# ————————————————————–
# Charge le certificate
$Certificate = ((Get-Childitem $CertStorePath) | Where-Object { $_.subject -like « *$CertificateName* » })
# Chaine de caractère ou mot de passe encrypté
$EncryptedPass = @’
—–BEGIN CMS—–
MIIB8QYJKoZIhvcNAQcDoIIB4jCCAd4CAQAxggFpMIIBZQIBADBNMDkxNzA1BgNVBAMMLk5BQk9P
IERvY3VtZW50IFNlbGZTaWduZWRDZXJ0aWZpY2F0ZSA0MjEzODI2MTYCEG5om+k9OAq1SmiwakJf
ULswDQYJKoZIhvcNAQEHMAAEggEADAiJLHuJlW0SR/oRGoYR7QK+1WBYyNnwv1sRbl2QbTPUVTLV
3K6Tw8BSxyxVYYG0cV509xl8innjptzeE6l+3l8FtU71A6xvTs/xSp00oSjvrBSgSjZPcmtGWvgg
PCfQR7Ksym2U3yZfBsCfEQcrYU8M5ko+j1mVYzrkuZRGC5Nr8cu0cBFJ2raXxBPyzKjyQPQYOFLe
5Db0Pj4VYW2TQpo/I4M47p19LuubQ6s9tsxfrDdRKeubczJF6Vt9gDE7pzqug/VNzcqfTSD8mvSz
jC7k+ClCXsX63sd7R+TnxMwx4RNfuHTR5QLEC8p5incws0Qpo9ykZiNZAdpx6bX/+zBsBgkqhkiG
9w0BBwEwHQYJYIZIAWUDBAEqBBAVoY6ds+2rzDnPWFvZGe5QgEBo1sUznbLGFv5jr0XnFFt5W8IB
roYMUoXm66Z+vuKpc9j3rxHe9joa05h4iJccBUwBeW60S8oiqSNtu8ugL9mA
—–END CMS—–
‘@
# Décrypte le texte à l’aide du certificat
$EncryptedPass | Unprotect-CmsMessage -To $Certificate
Bonjour,
Super, merci beaucoup d’avoir partagé votre travail ! Sympa !
Merci pour cet article.
Juste une petite remarque : attention au fichier d’historique généré par le module PSReadLine.
Dans l’exemple, la commande
$MotDePasse = « MonSuperMotDePasse »
est stockée et visible en clair dans l’historique !
Le mieux quand on joue avec les mots de passe est de commencer par saisir la commande
Set-PSReadLineOption -HistorySaveStyle SaveNothing
Je vous conseille un excellent article à ce sujet ; )
https://www.it-connect.fr/comment-gerer-lhistorique-des-commandes-powershell-executees/