Scripts et Programmation

PowerShell : Chiffrer les mots de passe dans les scripts (SecureString et Credentials)

Table des matières

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 :



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='[email protected]'
$mdp = ConvertTo-SecureString -String $mdp -AsPlainText -Force


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


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='4c0069006e007500780074007200690063006b00730040003100320033003400'
$mdp=$mdp | ConvertTo-SecureString


Si on appelle $mdp, on nous signale que c'est un SecureString :

Code :
PS /root/adrien/secu_linux> $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\[email protected]:443/VirtualMachine=VirtualMachine-vm-1312151/
 


Voici le bout se script final :

Code :
#! /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 !
Cette page a été vue 548 fois