PowerShell : Chiffrer les mots de passe dans les scripts (SecureString et Credentials)
Table des matières
Lorsque vous écrivez un script en PowerShell, il peut vous arriver de devoir vous connecter sur un service annexe.
Nous allons voir comment convertir votre mot de passe en chaine de type SecureString.
La SecureString est reconvertie en mot de passe en clair grâce aux infos de la machine et du compte utilisateur.
Cela offre donc une sécurité suffisante si le script est dérobé puisqu'il ne fonctionnera que pour une machine ET un utilisateur sur celle-ci.
Cependant, si vous voulez exécuter ce même script sur une autre machine, il faudra alors regénérer une SecureString !
On utilisera les commandlets PowerShell ConvertTo-SecureString et ConvertFrom-SecureString.
Ici, j'utilise PowerShell + PowerCli de VMware sous Windows Server 2025 !
Dans un premier temps, vous allez devoir générer une SecureString sur votre machine avec le compte associé.
Imaginons que mon mot de passe soit le suivant :
Générons une SecureString de la façon suivante, grâce à ConvertTo-SecureString ainsi que l'option AsPlainText car notre texte est la chaine en clair :
Maintenant, si on invoque $mdp le système nous retourne ceci :
On va alors récupérer le mot de passe chiffré avec ConvertFrom-SecureString
Le shell me retourne ceci :
On va garder dans un coin cela. C'est notre mot de passe chiffré !
Maintenant, on va pouvoir utiliser le mot de passe chiffré, toujours avec ConvertTo-SecureString mais sans l'option AsPlainText car notre texte est la chaine chiffrée cette fois-ci :
Si on appelle $mdp, on nous signale que c'est un SecureString :
Et maintenant, on peut utiliser ce mot de passe pour se connecter à un service, sans que ce mot de passe soit en clair dans le script.
Prenons un exemple concret, connectons-nous avec ce mot de passe à notre VCenter.
On va utiliser l'option -Credential pour se connecter au VCenter du commandlet Connect-VIServer.
On va générer un objet de type Credentials :
Ensuite, on invoque la commandlet Connect-VIServer :
Et voilà, on a les infos dans la seconde :
Voici le bout se script final :
Sous Linux, le PowerShell est un peu plus limité et ne permet pas de s'appuyer sur des mécanismes de chiffrement sur l'utilisateur et la machine.
Par conséquent, quand je vais générer ma SecureString via :
Je vais obtenir :
On remarque que la SecureString est moins longue... beaucoup moins longue.
Si je repars de la chaine de caractères, je peux regénérer un objet de type Secure String :
J'obtiens bien mon objet de type SecureString :
Cependant, je peux très rapidement tomber sur le mot de passe original via la création d'un objet de type PSCredential et en extrayant la valeur Password :
Ce qui renvoie :
Et voilà, vous pouvez maintenant utiliser des mots de passe dans PowerShell, pour vos scripts, et ceux-ci sont chiffrés et donc pas en clair !
Introduction
Lorsque vous écrivez un script en PowerShell, il peut vous arriver de devoir vous connecter sur un service annexe.
Nous allons voir comment convertir votre mot de passe en chaine de type SecureString.
La SecureString est reconvertie en mot de passe en clair grâce aux infos de la machine et du compte utilisateur.
Cela offre donc une sécurité suffisante si le script est dérobé puisqu'il ne fonctionnera que pour une machine ET un utilisateur sur celle-ci.
Cependant, si vous voulez exécuter ce même script sur une autre machine, il faudra alors regénérer une SecureString !
On utilisera les commandlets PowerShell ConvertTo-SecureString et ConvertFrom-SecureString.
Ici, j'utilise PowerShell + PowerCli de VMware sous Windows Server 2025 !
Etape 1 : Créer un mot de passe chiffré
Dans un premier temps, vous allez devoir générer une SecureString sur votre machine avec le compte associé.
Imaginons que mon mot de passe soit le suivant :
Code TEXT :
Linuxtricks@1234
Générons une SecureString de la façon suivante, grâce à ConvertTo-SecureString ainsi que l'option AsPlainText car notre texte est la chaine en clair :
Code :
$mdp='Linuxtricks@1234'
$mdp = ConvertTo-SecureString -String $mdp -AsPlainText -Force
Maintenant, si on invoque $mdp le système nous retourne ceci :
Code :
PS C:\Users\linuxtricksuser> $mdp
System.Security.SecureString
On va alors récupérer le mot de passe chiffré avec ConvertFrom-SecureString
Code :
$mdp | ConvertFrom-SecureString
Le shell me retourne ceci :
Code TEXT :
01000000d08c9ddf0115d1118c7a00c04fc297eb0100000027501de5d438b0499ab06812502de2bb00000000020000000000106600000001000020000000ec97dc610d4a08e26aa520e15bc23c2b4d007f0ef74439b044f81b89453da6a6000000000e80000000020000200000006e7be823a30f075df6a70a86d6e9b646aa1a5a3a041eeff77276cb0f2098a4f420000000771f81b7627d81adb332e09d23d0626fa2b7f6d0b2d01188cae609ea3d89009640000000e2c5694b5f00cc79a3f028b0c67ece177ff27debb0ee998833e2babbe97f9bf3195207ec800ec746dc9bd5b47670ef52423993744f2814ab7915fce5174caeca
On va garder dans un coin cela. C'est notre mot de passe chiffré !
Etape 2 : Utiliser ce mot de passe chiffré
Maintenant, on va pouvoir utiliser le mot de passe chiffré, toujours avec ConvertTo-SecureString mais sans l'option AsPlainText car notre texte est la chaine chiffrée cette fois-ci :
Code :
$mdp='01000000d08c9ddf0115d1118c7a00c04fc297eb0100000027501de5d438b0499ab06812502de2bb00000000020000000000106600000001000020000000ec97dc610d4a08e26aa520e15bc23c2b4d007f0ef74439b044f81b89453da6a6000000000e80000000020000200000006e7be823a30f075df6a70a86d6e9b646aa1a5a3a041eeff77276cb0f2098a4f420000000771f81b7627d81adb332e09d23d0626fa2b7f6d0b2d01188cae609ea3d89009640000000e2c5694b5f00cc79a3f028b0c67ece177ff27debb0ee998833e2babbe97f9bf3195207ec800ec746dc9bd5b47670ef52423993744f2814ab7915fce5174caeca'
$mdp=$mdp | ConvertTo-SecureString
Si on appelle $mdp, on nous signale que c'est un SecureString :
Code :
PS C:\Users\linuxtricksuser> $mdp
System.Security.SecureString
Et maintenant, on peut utiliser ce mot de passe pour se connecter à un service, sans que ce mot de passe soit en clair dans le script.
Prenons un exemple concret, connectons-nous avec ce mot de passe à notre VCenter.
On va utiliser l'option -Credential pour se connecter au VCenter du commandlet Connect-VIServer.
On va générer un objet de type Credentials :
Code TEXT :
$cred = New-Object System.Management.Automation.PSCredential ("vcenter-adm", $mdp)
Ensuite, on invoque la commandlet Connect-VIServer :
Code :
Connect-VIServer -Server $Vcenter -Credential $cred
Get-VM -Name SRV-WEB01
Et voilà, on a les infos dans la seconde :
Code :
Name Port User
---- ---- ----
vcenter01 443 LINUXTRICKS\vcenter-adm
WARNING: The 'Version' property of VirtualMachine type is deprecated. Use the 'HardwareVersion' property instead.
Name : SRV-WEB01
PowerState : PoweredOn
Notes : RHEL8 Apache PHP
Guest : SRV-WEB01:Red Hat Enterprise Linux 8 (64-bit)
NumCpu : 2
CoresPerSocket : 1
MemoryMB : 2048
MemoryGB : 2
VMHostId : HostSystem-host-1309951
VMHost : esx01.linuxtricks.lan
VApp :
FolderId : Folder-group-v492933
Folder : Redhat
ResourcePoolId : ResourcePool-resgroup-334095
ResourcePool : Resources
HARestartPriority : ClusterRestartPriority
HAIsolationResponse : AsSpecifiedByCluster
DrsAutomationLevel : AsSpecifiedByCluster
VMSwapfilePolicy : Inherit
VMResourceConfiguration : CpuShares:Normal/2000 MemShares:Normal/20480
Version : Unknown
HardwareVersion : vmx-19
PersistentId : 502995e4-8d3d-3e96-fd36-dbccefa72309
GuestId : rhel8_64Guest
UsedSpaceGB : 47.100052206777036190032958984
ProvisionedSpaceGB : 92.09810088481754064559936523
DatastoreIdList : {Datastore-datastore-1324296}
CreateDate : 1/1/1970 12:00:00 AM
SEVEnabled : False
BootDelayMillisecond : 0
MigrationEncryption : Opportunistic
MemoryHotAddEnabled : True
MemoryHotAddIncrement : 128
MemoryHotAddLimit : 3072
CpuHotAddEnabled : False
CpuHotRemoveEnabled : False
ExtensionData : VMware.Vim.VirtualMachine
CustomFields : {[PnC.CustSpec, ], [PnC.Deployed, ], [PnC.GroupID, ], [PnC.Source, ]…}
Id : VirtualMachine-vm-1312151
Uid : /VIServer=linuxtricks\vcenter-adm@vcenter01:443/VirtualMachine=VirtualMachine-vm-1312151/
Voici le bout se script final :
Code :
#Déclaration variables
$Vcenter = "vcenter01"
# Utilisation mdp chiffré via securestring
$mdp = '01000000d08c9ddf0115d1118c7a00c04fc297eb0100000027501de5d438b0499ab06812502de2bb00000000020000000000106600000001000020000000ec97dc610d4a08e26aa520e15bc23c2b4d007f0ef74439b044f81b89453da6a6000000000e80000000020000200000006e7be823a30f075df6a70a86d6e9b646aa1a5a3a041eeff77276cb0f2098a4f420000000771f81b7627d81adb332e09d23d0626fa2b7f6d0b2d01188cae609ea3d89009640000000e2c5694b5f00cc79a3f028b0c67ece177ff27debb0ee998833e2babbe97f9bf3195207ec800ec746dc9bd5b47670ef52423993744f2814ab7915fce5174caeca' | ConvertTo-SecureString
# Objet Credentials
$cred = New-Object System.Management.Automation.PSCredential ("vcenter-adm", $mdp)
#Se connecter au Vcenter
Connect-VIServer -Server $Vcenter -Credential $cred
# Recuperer infos
Get-VM -Name SRV-WEB01
Attention au PowerShell sous Linux
Sous Linux, le PowerShell est un peu plus limité et ne permet pas de s'appuyer sur des mécanismes de chiffrement sur l'utilisateur et la machine.
Par conséquent, quand je vais générer ma SecureString via :
Code :
PS /root> $mdp='Linuxtricks@1234'
PS /root> $mdp = ConvertTo-SecureString -String $mdp -AsPlainText -Force
Je vais obtenir :
Code :
PS /root> $mdp | ConvertFrom-SecureString
4c0069006e007500780074007200690063006b00730040003100320033003400
On remarque que la SecureString est moins longue... beaucoup moins longue.
Si je repars de la chaine de caractères, je peux regénérer un objet de type Secure String :
Code :
PS /home/adrien> $mdp = '4c0069006e007500780074007200690063006b00730040003100320033003400'
PS /home/adrien> $mdp=$mdp | ConvertTo-SecureString
J'obtiens bien mon objet de type SecureString :
Code :
PS /home/adrien> $mdp
System.Security.SecureString
Cependant, je peux très rapidement tomber sur le mot de passe original via la création d'un objet de type PSCredential et en extrayant la valeur Password :
Code :
(New-Object PSCredential 0, $mdp).GetNetworkCredential().Password
Ce qui renvoie :
Code TEXT :
Linuxtricks@1234
Conclusion
Et voilà, vous pouvez maintenant utiliser des mots de passe dans PowerShell, pour vos scripts, et ceux-ci sont chiffrés et donc pas en clair !