Administratorji pogosto pišejo gesla neposredno v telo skripta PoSh, ko v PowerShell pišejo skripte za avtomatizacijo. Kot veste, je to izjemno nevarno, če se uporablja v produktivnem okolju, ker geslo lahko v jasni obliki vidijo drugi uporabniki strežnika ali skrbniki. Zato je priporočljivo uporabiti varnejši način za uporabo gesel v skriptah PowerShell ali šifrirati gesla, če ne morete uporabiti interaktivnega vnosa.
Varno je, da uporabnika prosite, da v skriptu interaktivno vnese geslo s pomočjo cmdleta Pridobite poverilnice. Na primer, zahtevamo uporabniško ime in geslo in ga shranimo v predmetni tip Pscredential:
$ Cred = Pridobivanje poverilnic
Ko dostopate do lastnosti spremenljivke, lahko ugotovite ime uporabnika, ki je bil določen.
$ Cred.Username
Ko pa poskusite prikazati geslo, se bo vrnilo besedilo System.Security.SecureString, ker geslo je zdaj shranjeno kot SecureString.
$ Cred.Password
Objekt PSCredential, ki smo ga shranili v spremenljivko $ Cred, lahko zdaj uporabljamo v cmdletih, ki podpirajo to vrsto predmeta.
Parametre $ Cred.Username in $ Cred.Password je mogoče uporabiti v cmdletih, ki ne podpirajo predmetov PSCredential, vendar zahtevajo ločeno uporabniško ime in geslo.
Če želite zahtevati uporabniško geslo, uporabite ukazni program Read-Host z atributom AsSecureString:$ pass = Preberi-gostitelj "Vnesite geslo" -AsSecureString
V tem primeru tudi ne boste mogli videti vsebine spremenljivke $ pass, v kateri je geslo shranjeno.
Pri zgornjih metodah uporabe gesla v skriptah PowerShell je bilo predpostavljeno, da je bilo geslo vneseno interaktivno, ko je bil skript izveden. Toda ta metoda ni primerna za različne scenarije, ki se izvajajo samodejno ali s pomočjo razporejevalnika.
V tem primeru je bolj priročno šifrirati podatke računa (ime in geslo) in jih v šifrirani obliki shraniti v besedilno datoteko na disku ali uporabiti neposredno v skriptu.
Torej, z uporabo cmdleta Pretvarjanje iz SecureString Geslo lahko pretvorite iz oblike SecureString v šifriran niz (šifriranje se izvede z API-jem za zaščito podatkov Windows - DPAPI). Šifrirano geslo lahko prikažete na zaslonu ali ga shranite v datoteko:
$ Cred.Password | Pretvori iz SecureString | Set-Content c: \ ps \ passfile.txt
Za uporabo šifriranega gesla iz datoteke morate izvesti obratno pretvorbo v obliko Securestring s pomočjo cmdlet-a PretvoriTo-SecureString:
$ username = "corp \ administrator"
$ pass = Pridobite vsebino c: \ ps \ passfile.txt | PretvoriTo-SecureString
$ creds = Novo-objekt-sistem-ime-vrste.Management.Automation.PSCredential -ArgumentList $ uporabniško ime, $ pass
Tako smo v spremenljivki $ creds dobili objekt PSCredential z uporabniškimi poverilnicami.
Če pa poskusite kopirati datoteko passfile.txt v drug računalnik ali jo uporabljate pod drugim uporabnikom (ne tistim, pod katerim je bilo ustvarjeno geslo), boste videli, da je spremenljivka $ creds.password prazna in ne vsebuje gesla. Dejstvo je, da se šifriranje s pomočjo DPAPI izvaja s tipkami, shranjenimi v uporabniškem profilu. Brez teh tipk v drugem računalniku datoteke ne morete dešifrirati z geslom.ConvertTo-SecureString: ključa ni mogoče uporabiti v podanem stanju.
"Argumenta ni mogoče obdelati, ker je vrednost argumenta gesla NULL.
Za argument gesla podajte vrednost, ki ni NULL. "
Če se bo skript izvajal v drugem (storitvenem) računu ali v drugem računalniku, morate uporabiti drug šifrirni mehanizem, ki je edinstven za DPAPI. Tuji šifrirni ključ je mogoče določiti s pomočjo parametrov -Ključ ali -SecureKey.
PowerShell lahko na primer uporabite za ustvarjanje 256-bitnega AES-ključa, s katerim lahko dešifrirate datoteko. Ključ shranite v besedilno datoteko password_aes.key.
$ AESKey = Bajt novega predmeta [] 32
[Security.Cryptography.RNGCryptoServiceProvider] :: Ustvari (). GetBytes ($ AESKey)
$ AESKey | datoteko C: \ ps \ password_aes.key
Zdaj lahko geslo shranite v datoteko s to tipko:
$ Cred.Password | Pretvori iz SecureString -Key (get-content C: \ ps \ password_aes.key) | Set-Content c: \ ps \ passfile.txt
Tako smo dobili dve datoteki: datoteko s šifriranim geslom (passfile.txt) in datoteko s šifrirnim ključem (password_aes.key).
Lahko jih prenesete v drug računalnik in poskusite dobiti geslo iz datoteke iz PowerShell-a (ključno datoteko lahko postavite v omrežni imenik)
$ pass = Pridobite vsebino c: \ ps \ passfile.txt | ConvertTo-SecureString -Key (get-content \\ Server1 \ Share \ password_aes.key)
$ pass
Če se ne želite obremenjevati z ločeno datoteko s tipko AES, lahko šifrirni ključ pripnete neposredno v skript. V tem primeru morate namesto ključa v obeh primerih uporabiti
[Bajt []] $ ključ = (1 ... 16)
$ Cred.Password | Pretvori iz SecureString -Key $ key | Set-Content c: \ ps \ passfile.txt
In za dešifriranje:
[Bajt []] $ ključ = (1 ... 16)
$ pass = Pridobite vsebino c: \ ps \ passfile.txt | ConvertTo-SecureString -Kaj tipko $
Kot vidite, geslo ni prazno, kar pomeni, da je bilo uspešno dešifrirano in ga je mogoče uporabljati v drugih računalnikih.
Namig. Dostop do datoteke je treba omejiti s tipko AES, tako da do nje dostopa le uporabnik ali račun, pod katerim se izvaja skript. Previdno preverite dovoljenja NTFS v datoteki password_aes.key, ko jo postavite v omrežni imenik.In končno, najbolj žalosten trenutek. Geslo iz predmeta PSCredential na jasnem se izvleče zelo preprosto:
$ Cred.GetNetworkCredential (). Geslo
Geslo lahko izvlečete v besedilni obliki iz SecureString:
$ BSTR = [System.Runtime.InteropServices.Marshal] :: SecureStringToBSTR ($ pass)
[System.Runtime.InteropServices.Marshal] :: PtrToStringAuto ($ BSTR)
Kot razumete, je zato gesla za privilegirane račune, na primer skrbnike domen, nezaželeno shranjevati kamor koli razen DC.
Namig. Če želite zaščititi administrativne zapise pred črpanjem gesel iz pomnilnika s pripomočki, kot je Mimikatz, morate uporabiti celovite ukrepe, vključno z organizacijskim načrtom.