scenariusz użycia
używanie SecureStringów w PS jest poniekąd wymuszone – w taki sposób przechowywane są hasła, np. w credentialsach:
PS C:\_ScriptZ> $cred=Get-Credential cmdlet Get-Credential at command pipeline position 1 Supply values for the following parameters: Credential PS C:\_ScriptZ> $cred|gm TypeName: System.Management.Automation.PSCredential Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetNetworkCredential Method System.Net.NetworkCredential GetNetworkCredential() GetObjectData Method void GetObjectData(System.Runtime.Serialization.SerializationInfo info, GetType Method type GetType() ToString Method string ToString() Password Property securestring Password {get;} UserName Property string UserName {get;}
SecureString przydaje się do przechowywania haseł, używanych w skryptach – np. skrypt do automatycznego podpięcia licencji office365, który wymaga podania credsów użytkownika z uprawnieniami co najmniej 'User Manager’. można hasło zapisać w pliq jako SS a potem wewnątrz skryptu je odczytać i użyć do złożenia credsów:
PS C:\_ScritpZ>ConvertTo-SecureString -String '<HASLO>' -AsPlainText -Force|ConvertFrom-SecureString|out-file c:\_scriptz\pa.ss PS C:\_ScriptZ> cat .\pa.ss 01000000d08c9ddf0115d1118c7a00c04fc297eb010000006e58e62b318004439a915f2500cbb1c20000000002000000000003660000c0000000100 00000de193527adebd1535b4b243a2dda67de0000000004800000a000000010000000c6781a7fe77fce164d1fcaa0fc68c30f10000000210bc43ae2 3f49acfb0eae607c0b48341400000043264bf254fc25798b847e94d9ea7ea678051bb2 PS C:\_ScritpZ>$ssPassword=Get-Content c:\_scriptz\pa.ss|ConvertTo-SecureString PS C:\_ScritpZ>$oCreds=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "usermanager@w-files.onmicrosoft.com",$ssPassword
bezpieczeństwo SS
rodzą się natychmiast pytania o bezpieczeństwo SecureString – czy takie hasło da się odszyfrować i jak łatwo? hasło jest szyfrowane kluczem, który generowany jest na podstawie hasła użytkownika, a masterkey jest przechowywany na komputerze lokalnym. odpowiedzialne jest za to DPAPI – tutaj znajdziecie więcej informacji. klucz jest przechowywany w $env:USERPROFILE\Application Data\Microsoft\Protect\<GUID>. w efekcie
- plik jest nie do odczytania na innej maszynie
- plik jest nie do odczytania przez innego użytkownika
czyli nic da 'wykradzenie’ pliq lub użycie go w kontexcie innego użytkownika.
są potencjalnie metody potrafiące złamać klucz [np. hawkeye inject], ale nie znalazłem praktycznego opisu i na pewno nie są to metody na poziomie script kiddie. można zatem uznać, że jest to świetne narzędzie dla skryptów, które wymagają podania hasła.
addendum
na koniec – jak odczytać hasło zapisane jako SS? podam dwie metody – dla devów i dla opsów (;
dla devów:
PS C:\_ScriptZ> $ss=cat .\pa.ss|ConvertTo-SecureString PS C:\_ScriptZ> [System.Runtime.InteropServices.marshal]::PtrToStringAuto([System.Runtime.InteropServices.marshal]::SecureStringToBSTR($ss)) <HASLO>
dla opsów:
po zbudowaniu obiektu credential z wcześniejszego przykładu, mamy zmienną $creds
PS C:\_ScriptZ> $creds.GetNetworkCredential().password <HASLO>
eN.
Matu
nExoR
Matu