27/07/2024

PowerShell

PowerShell : comment chiffrer un mot de passe dans un script ?

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

PowerShell - Mot de passe chiffré dans un script

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 :

PowerShell - ConvertFrom-SecureString

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.

PowerShell - Utiliser un mot de passe chiffré

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).

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

3 commentaires sur “PowerShell : comment chiffrer un mot de passe dans un script ?

  • 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

    Répondre
  • 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/

    Répondre

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.