PowerShell
Obsługa tajemnic i poświadczeń
Szukaj…
Wprowadzenie
W Powershell, aby uniknąć przechowywania hasła w postaci zwykłego tekstu , używamy różnych metod szyfrowania i przechowujemy je jako bezpieczny ciąg. Jeśli nie określisz klucza ani klucza bezpiecznego, będzie to działać tylko w przypadku tego samego użytkownika na tym samym komputerze, który będzie mógł odszyfrować zaszyfrowany ciąg, jeśli nie używasz kluczy / kluczy bezpieczeństwa. Każdy proces działający na tym samym koncie użytkownika będzie mógł odszyfrować ten zaszyfrowany ciąg na tym samym komputerze.
Monitowanie o poświadczenia
Aby zapytać o poświadczenia, prawie zawsze należy użyć polecenia cmdlet Get-Credential
:
$credential = Get-Credential
Wstępnie wypełniona nazwa użytkownika:
$credential = Get-Credential -UserName 'myUser'
Dodaj niestandardową wiadomość zachęty:
$credential = Get-Credential -Message 'Please enter your company email address and password.'
Dostęp do hasła w postaci zwykłego tekstu
Hasło w obiekcie referencji jest szyfrowane [SecureString]
. Najprostszym sposobem jest uzyskanie [NetworkCredential]
który nie przechowuje zaszyfrowanego hasła:
$credential = Get-Credential
$plainPass = $credential.GetNetworkCredential().Password
Metoda pomocnicza ( .GetNetworkCredential()
) istnieje tylko na [PSCredential]
.
Aby bezpośrednio poradzić sobie z [SecureString]
, użyj metod .NET:
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secStr)
$plainPass = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($bstr)
Praca z zapisanymi poświadczeniami
Aby łatwo przechowywać i odzyskiwać zaszyfrowane dane uwierzytelniające, użyj wbudowanej serializacji XML PowerShell (Clixml):
$credential = Get-Credential
$credential | Export-CliXml -Path 'C:\My\Path\cred.xml'
Aby ponownie zaimportować:
$credential = Import-CliXml -Path 'C:\My\Path\cred.xml'
Ważną rzeczą do zapamiętania jest to, że domyślnie korzysta z interfejsu API ochrony danych systemu Windows, a klucz używany do szyfrowania hasła jest specyficzny zarówno dla użytkownika, jak i komputera , na którym działa kod.
W rezultacie zaszyfrowanego poświadczenia nie może zaimportować inny użytkownik ani ten sam użytkownik na innym komputerze.
Szyfrując kilka wersji tego samego poświadczenia dla różnych działających użytkowników i na różnych komputerach, możesz mieć ten sam klucz tajny dostępny dla wielu użytkowników.
Umieszczając nazwę użytkownika i komputera w nazwie pliku, możesz przechowywać wszystkie zaszyfrowane sekrety w sposób, który pozwala na użycie tego samego kodu bez użycia twardego kodu:
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"
Kod korzystający z przechowywanych poświadczeń:
$credential = Import-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
Prawidłowa wersja pliku dla uruchomionego użytkownika zostanie załadowana automatycznie (lub zawiedzie, ponieważ plik nie istnieje).
Przechowywanie poświadczeń w postaci zaszyfrowanej i przekazywanie ich jako parametru, gdy jest to wymagane
$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.