Jak ukládat hesla v PowerShellu?

Přestože následující nemám moc rád, faktem zůstává, že ukládání hesel v plain textu je nesmysl a docela dost velký bezpečnostní problém, který třeba PHP nemá zrovna moc vyřešeno. V PHP je doporučeno hesla k databázím a další loginy, které nelze uložit jako hash, vyčlenit mimo prostor přístupný „veřejnosti“, třeba tak, že se v rootu, kam není normálně přístup, vytvoří .env soubor a do něj se napíší login údaje a ty se pak vyčítají pomocí $_ENV supergrlobální proměnné. Ve zdrojovém kódu tak najdete mimo hesel jen odkaz na tuto proměnnou. Jinak hesla se nijak nešifrují a to vidím jako problém. V tomhle to má Microsoft mnohem lépe vyřešené. Ten používá vlastní systém pro ukládání hesel a je nekompromisně implementovaný do PowerShellu. No a pracuje se s ním následovně.

Bezpečnost a automatizace je problém. Uložit nějaké heslo bezpečně totiž vyžaduje nějaké jiné heslo k jeho přečtení. No a proto zde Microsoft se svým uzavřeným systémem má oproti Linuxu navrch.

Pokud se napsaný skript nepoužívá k nějaké automatizaci, je doporučeno se pokaždé na login údaje ptát. To lze udělat takto

$userCredential = Get-Credential (vyvolá přihlašovací okno)
nebo
$pass = Read-Host "Zadejte heslo" -AsSecureString (žádost o heslo v konzoli)

Heslo z proměnné nejde zobrazit. Místo toho se zobrazí pouze informace o tom, že se jedná o objekt System.Security.SecureString.

V případě nutnosti automatizace je to trochu složitější. Pro tyto případy se používá cmdlet ConvertTo-SecureString. Použití je následovné.

V následujícím příkazu vytvoříme kryptograficky ošetřený string, který můžete dle libosti používat pro automatizaci. Pozor na to, že string funguje pouze pod účtem ve kterém byl vytvořen. Toto omezení lze obejít pomocí definice Keys/SecureKeys.

$encPass = 'SuperTajnéNeuhodnutelnéHeslo123' | ConvertTo-SecureString -AsPlainText - Force | ConvertFrom-SecureString

Pokud chcete pro automatizaci použít přihlašovací údaje do Windows, udělejte to následovně.

(Get-Credential).Password | ConvertFrom-SecureString | Out-File "C:\password.txt"

Pro uložení vstupu z konzole použijte následující

Read-Host "Zadejte heslo" -AsSecureString | ConvertFrom-SecureString | Out-File "C:\password.txt"

Zpětné vytvoření SecureString objektu pak lze udělat následovně.

$heslo = Get-Content "C:\password.txt" | ConvertTo-SecureString
nebo
$userCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $uzivatel, (Get-Content $souborSHeslem | ConvertTo-SecureString)