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 RedHat Enterprise Linux 8 mais ça fonctionne pareil sous Windows !
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 :
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 RedHat Enterprise Linux 8 mais ça fonctionne pareil sous Windows !
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
Maintenant, si on invoque $mdp le système nous retourne ceci :
Code :
PS /root/adrien/secu_linux> $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 :
4c0069006e007500780074007200690063006b00730040003100320033003400[/code] 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 [b]ConvertTo-SecureString[/b] mais sans l'option [b]AsPlainText[/b] car notre texte est la chaine chiffrée cette fois-ci : [cod]$mdp='4c0069006e007500780074007200690063006b00730040003100320033003400' $mdp=$mdp | ConvertTo-SecureString[/code] Si on appelle $mdp, on nous signale que c'est un SecureString : [code]PS /root/adrien/secu_linux> $mdp System.Security.SecureString[/code] 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 [b]-Credential[/b] pour se connecter au VCenter du commandlet [b]Connect-VIServer[/b]. On va générer un objet de type Credentials : [code=text]$cred = New-Object System.Management.Automation.PSCredential ("vcenter-adm", $mdp)[/code] Ensuite, on invoque la commandlet [b]Connect-VIServer[/b] : [code]Connect-VIServer -Server $Vcenter -Credential $cred Get-VM -Name SRV-WEB01[/code] 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/ [/code] Voici le bout se script final : [code=text]#! /usr/bin/env pwsh #Déclaration variables $Vcenter = "vcenter01" # Utilisation mdp chiffré via securestring $mdp = '4c0069006e007500780074007200690063006b00730040003100320033003400' | ConvertTo-SecureString $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
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 !