PowerShell
Gestion des secrets et des informations d'identification
Recherche…
Introduction
Dans Powershell, pour éviter de stocker le mot de passe en texte clair, nous utilisons différentes méthodes de chiffrement et le stockons en tant que chaîne sécurisée. Lorsque vous ne spécifiez pas de clé ou de clé sécurisée, cela ne fonctionnera que si le même utilisateur sur le même ordinateur pourra déchiffrer la chaîne chiffrée si vous n'utilisez pas Keys / SecureKeys. Tout processus exécuté sous ce même compte d'utilisateur pourra déchiffrer cette chaîne chiffrée sur le même ordinateur.
Demander des informations d'identification
Pour demander des informations d'identification, vous devez presque toujours utiliser l'applet de commande Get-Credential
:
$credential = Get-Credential
Nom d'utilisateur pré-rempli:
$credential = Get-Credential -UserName 'myUser'
Ajoutez un message d'invite personnalisé:
$credential = Get-Credential -Message 'Please enter your company email address and password.'
Accéder au mot de passe en texte clair
Le mot de passe dans un objet de référence est un [SecureString]
. Le moyen le plus simple est d'obtenir un [NetworkCredential]
qui ne stocke pas le mot de passe crypté:
$credential = Get-Credential
$plainPass = $credential.GetNetworkCredential().Password
La méthode d'assistance ( .GetNetworkCredential()
) n'existe que sur les objets [PSCredential]
.
Pour gérer directement un [SecureString]
, utilisez les méthodes .NET:
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secStr)
$plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
Travailler avec des informations d'identification stockées
Pour stocker et récupérer facilement les informations d'identification chiffrées, utilisez la sérialisation XML intégrée de PowerShell (Clixml):
$credential = Get-Credential
$credential | Export-CliXml -Path 'C:\My\Path\cred.xml'
Pour réimporter:
$credential = Import-CliXml -Path 'C:\My\Path\cred.xml'
La chose importante à retenir est que, par défaut, il utilise l'API de protection des données Windows et que la clé utilisée pour chiffrer le mot de passe est spécifique à l' utilisateur et à la machine sur laquelle le code est exécuté.
Par conséquent, les informations d'identification cryptées ne peuvent pas être importées par un utilisateur différent ni par le même utilisateur sur un autre ordinateur.
En cryptant plusieurs versions du même identifiant avec différents utilisateurs en cours d'exécution et sur différents ordinateurs, vous pouvez disposer du même secret pour plusieurs utilisateurs.
En plaçant le nom de l'utilisateur et de l'ordinateur dans le nom du fichier, vous pouvez stocker tous les secrets cryptés de manière à ce que le même code puisse les utiliser sans coder en dur:
Encrypter
# run as each user, and on each computer
$credential = Get-Credential
$credential | Export-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
Le code qui utilise les informations d'identification stockées:
$credential = Import-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
La version correcte du fichier pour l'utilisateur en cours d'exécution sera chargée automatiquement (ou échouera car le fichier n'existe pas).
Stockage des informations d'identification sous forme chiffrée et transmission en tant que paramètre lorsque requis
$username = "[email protected]"
$pwdTxt = Get-Content "C:\temp\Stored_Password.txt"
$securePwd = $pwdTxt | ConvertTo-SecureString
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securePwd
# Now, $credObject is having the credentials stored and you can pass it wherever you want.
## Import Password with AES
$username = "[email protected]"
$AESKey = Get-Content $AESKeyFilePath
$pwdTxt = Get-Content $SecurePwdFilePath
$securePwd = $pwdTxt | ConvertTo-SecureString -Key $AESKey
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securePwd
# Now, $credObject is having the credentials stored with AES Key and you can pass it wherever you want.