PowerShell
Gestione di segreti e credenziali
Ricerca…
introduzione
In Powershell, per evitare di memorizzare la password in chiaro , utilizziamo diversi metodi di crittografia e la memorizziamo come stringa sicura. Quando non si specifica una chiave o una chiave di sicurezza, ciò funzionerà solo per lo stesso utente sullo stesso computer sarà in grado di decrittografare la stringa crittografata se non si sta utilizzando Keys / SecureKeys. Qualsiasi processo eseguito sotto lo stesso account utente sarà in grado di decrittografare quella stringa crittografata sullo stesso computer.
Richiesta di credenziali
Per richiedere le credenziali, si dovrebbe quasi sempre usare il cmdlet Get-Credential
:
$credential = Get-Credential
Nome utente pre-compilato:
$credential = Get-Credential -UserName 'myUser'
Aggiungi un messaggio di richiesta personalizzato:
$credential = Get-Credential -Message 'Please enter your company email address and password.'
Accesso alla password in chiaro
La password in un oggetto credenziale è una [SecureString]
crittografata. Il modo più semplice è ottenere un [NetworkCredential]
che non memorizzi la password crittografata:
$credential = Get-Credential
$plainPass = $credential.GetNetworkCredential().Password
Il metodo helper ( .GetNetworkCredential()
) esiste solo su oggetti [PSCredential]
.
Per trattare direttamente con [SecureString]
, utilizzare i metodi .NET:
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secStr)
$plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
Lavorare con le credenziali memorizzate
Per archiviare e recuperare facilmente le credenziali crittografate, utilizzare la serializzazione XML incorporata di PowerShell (Clixml):
$credential = Get-Credential
$credential | Export-CliXml -Path 'C:\My\Path\cred.xml'
Per reimportare:
$credential = Import-CliXml -Path 'C:\My\Path\cred.xml'
La cosa importante da ricordare è che per impostazione predefinita viene utilizzata l'API di protezione dati di Windows e la chiave utilizzata per crittografare la password è specifica sia per l' utente che per la macchina su cui è in esecuzione il codice.
Di conseguenza, le credenziali crittografate non possono essere importate da un utente diverso né lo stesso utente su un altro computer.
Con la crittografia di diverse versioni della stessa credenziale con diversi utenti in esecuzione e su computer diversi, è possibile avere lo stesso segreto disponibile per più utenti.
Inserendo il nome utente e il nome del computer nel nome del file, è possibile memorizzare tutti i segreti crittografati in un modo che consente allo stesso codice di utilizzarli senza alcun codice fisso:
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"
Il codice che utilizza le credenziali archiviate:
$credential = Import-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
La versione corretta del file per l'utente in esecuzione verrà caricata automaticamente (o fallirà perché il file non esiste).
Memorizzazione delle credenziali in forma crittografata e passaggio come parametro quando richiesto
$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.