Zaštita lozinkom i šifriranje u skriptu PowerShell-a

Administratori često pišu lozinke izravno u tijelo skripte PoSh prilikom pisanja skripti za automatizaciju u PowerShellu. Kao što znate, ovo je krajnje nesigurno kada se koristi u produktivnom okruženju, jer drugi korisnici poslužitelja ili administratori lozinku mogu jasno vidjeti. Stoga je preporučljivo koristiti sigurniju metodu za korištenje lozinki u PowerShell skriptama ili za šifriranje lozinki ako ne možete koristiti interaktivni unos.

Sigurno je tražiti od korisnika da interaktivno unese lozinku u skriptu koristeći cmdlet Nabavite vjerodajnice. Na primjer, tražimo korisničko ime i lozinku i spremamo ih u objekt tipa PSCredential:

$ Cred = Dobivanje vjerodajnice

Kada pristupite svojstvima varijable, možete saznati ime korisnika koji je naveden.

$ Cred.Username

Ali kad pokušate prikazati lozinku, tekst System.Security.SecureString bit će vraćen, jer lozinka je sada pohranjena kao SecureString.

$ Cred.Password

PSCredential objekt koji smo spremili u $ Cred varijablu sada se može koristiti u cmdletima koji podržavaju ovu vrstu objekta.

Parametri $ Cred.Username i $ Cred.Password mogu se koristiti u cmdletima koji ne podržavaju PSCredential objekte, ali zahtijevaju odvojeno korisničko ime i lozinku.

Možete koristiti i cmdlet Read-Host sa atributom AsSecureString da biste zatražili korisničku lozinku:
$ pass = Pročitajte-domaćin "Unesite lozinku" -AsSecureString

U tom slučaju nećete moći vidjeti ni sadržaj varijable $ pass u kojoj je lozinka pohranjena.

U gornjim metodama korištenja lozinke u skriptu PowerShell-a pretpostavljalo se da je lozinka unesena interaktivno prilikom izvršavanja skripte. Ali ova metoda nije prikladna za razne scenarije koji se pokreću automatski ili putem alata za planiranje.

U ovom je slučaju prikladnije kriptirati podatke računa (ime i lozinku) i spremiti ih u šifriranom obliku u tekstualnu datoteku na disku ili koristiti izravno u skripti.

Dakle, koristeći cmdlet ConvertFrom-SecureString Lozinku možete pretvoriti iz SecureString formata u šifrirani niz (šifriranje se provodi pomoću Windows Data Protection API - DPAPI). Možete prikazati šifriranu lozinku na zaslonu ili je spremiti u datoteku:

$ Cred.Password | Pretvori iz SecureString | Set-Content c: \ ps \ passfile.txt

Da biste koristili šifriranu lozinku iz datoteke, morate izvršiti obrnutu pretvorbu u Securestring format koristeći cmdlet ConvertTo-SecureString:

$ username = "corp \ administrator"
$ pass = Get-Content c: \ ps \ passfile.txt | ConvertTo-SecureString
$ creds = Novo-Objekt -TypeName System.Management.Automation.PSCredential -ArgumentList $ korisničko ime, $ pass

Dakle, u varijabli $ creds dobili smo PSCredential objekt s korisničkim vjerodajnicama.

Međutim, ako pokušate kopirati datoteku passfile.txt na drugo računalo ili je koristite s nekim drugim korisnikom (a ne onim pod kojim je lozinka stvorena), vidjet ćete da je varijabla $ creds.password prazna i da ne sadrži lozinku. Činjenica je da se enkripcija pomoću DPAPI-ja izvodi pomoću ključeva pohranjenih u korisničkom profilu. Bez ovih tipki na drugom računalu ne možete dešifrirati datoteku s lozinkom.
ConvertTo-SecureString: ključ se ne može koristiti u navedenom stanju.
"Argument se ne može obraditi jer je vrijednost argumenta zaporke NULL.
Za argument lozinke odredite ne-NULL vrijednost. "

Stoga, ako će se skripta pokrenuti na drugom (uslužnom) računu ili na nekom drugom računalu, morate upotrijebiti drugačiji mehanizam šifriranja koji je jedinstven za DPAPI. Strani ključ za enkripciju može se odrediti pomoću parametara -ključ ili -SecureKey.

Na primjer, PowerShell možete koristiti za generiranje 256-bitnog AES ključa pomoću kojeg možete dešifrirati datoteku. Spremite ključ u tekstualnu datoteku password_aes.key.

$ AESKey = Bajt novog objekta [] 32
[Security.Cryptography.RNGCryptoServiceProvider] :: Stvori (). GetBytes ($ AESKey)
$ AESKey | datoteka datoteke C: \ ps \ password_aes.key

Sada možete spremiti lozinku u datoteku pomoću ovog ključa:

$ Cred.Password | Pretvori iz SecureString -Key (get-content C: \ ps \ password_aes.key) | Set-Content c: \ ps \ passfile.txt

Ne zaboravite da ako u Powershell skripti odredite račun domene i na njoj imate redovito pravilo promjene zaporke, morat ćete ažurirati ovu datoteku svaki put kada se lozinka promijeni (možete stvoriti zasebno pravilo lozinke za određene račune koristeći više pravila FGPP lozinke.

Tako smo dobili dvije datoteke: datoteku s šifriranom lozinkom (passfile.txt) i datoteku s ključem za šifriranje (password_aes.key).

Možete ih prenijeti na drugo računalo i pokušati dobiti lozinku iz datoteke iz PowerShell-a (ključnu datoteku možete smjestiti u mrežni direktorij)

$ pass = Get-Content c: \ ps \ passfile.txt | ConvertTo-SecureString -Key (get-content \\ Server1 \ Share \ password_aes.key)
$ pass

Ako se ne želite gnjaviti s zasebnom datotekom s AES tipkom, možete šivati ​​šifrirani ključ izravno u skriptu. U ovom slučaju umjesto ključa u oba slučaja trebate upotrijebiti

[Bajt []] $ ključ = (1 ... 16)
$ Cred.Password | Pretvori iz SecureString -Key $ key | Set-Content c: \ ps \ passfile.txt

A za dešifriranje:

[Bajt []] $ ključ = (1 ... 16)
$ pass = Get-Content c: \ ps \ passfile.txt | ConvertTo-SecureString - ključ $ ključ

Kao što vidite, lozinka nije prazna, što znači da je uspješno dešifrirana i može se koristiti na drugim računalima.

vijeće. Potrebno je ograničiti pristup datoteci pomoću AES tipke tako da joj pristupa samo korisnik ili račun pod kojim se pokreće skripta. Pažljivo provjerite NTFS dopuštenja na datoteci password_aes.key kada je stavite u mrežni direktorij.

I konačno, najtužniji trenutak. Lozinka iz objekta PSCredential u prozoru se izvlači vrlo jednostavno:

$ Cred.GetNetworkCredential (). Lozinka

Možete preuzeti ekstrakt lozinke u tekstnom obliku iz SecureString:

$ BSTR = [System.Runtime.InteropServices.Marshal] :: SecureStringToBSTR ($ prolazak)
[System.Runtime.InteropServices.Marshal] :: PtrToStringAuto ($ BSTR)

Kao što razumijete, zato je nepoželjno spremanje zaporki za povlaštene račune, poput domena administratora, bilo gdje osim DC-a.

Vijeće. Da biste zaštitili administrativne zapise od vađenja lozinki iz memorije pomoću alata poput Mimikatz, trebate koristiti sveobuhvatne mjere, uključujući organizacijski plan.