Zaščita gesla in šifriranje v skriptah PowerShell

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

Ne pozabite, da če v skriptu Powershell določite domenski račun in imate v njem redni pravilnik o spremembi gesla, boste to datoteko morali posodobiti vsakič, ko boste geslo spremenili (lahko ustvarite ločen pravilnik gesla za določene račune z uporabo več pravilnikov gesla FGPP.

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.