Jelszóvédelem és titkosítás a PowerShell szkriptekben

A rendszergazdák gyakran jelszavakat írnak közvetlenül a PoSh szkript törzsébe, amikor az automatizálási szkripteket írnak a PowerShell-ben. Mint tudod, ez rendkívül nem biztonságos, ha produktív környezetben használják, mert A jelszót egyértelműen láthatják más szerver felhasználók vagy rendszergazdák. Ezért tanácsos egy biztonságosabb módszert használni a jelszavak használatához a PowerShell szkriptekben, vagy a jelszavak titkosításához, ha nem tud interaktív bemenetet használni..

Biztonságos megkérni a felhasználót, hogy interaktív módon adja meg a jelszót a parancsfájlban a parancsmag segítségével Szerezzen be hitelesítő adatokat. Például kérjük a felhasználónevet és a jelszót, és elmentjük egy típusú objektumba PSCredential:

$ Cred = Get-Credential

A változó tulajdonságainak elérésekor megtudhatja a megadott felhasználó nevét.

$ Cred.Username

Amikor megpróbálja megjeleníteni a jelszót, a System.Security.SecureString szöveg kerül visszaadásra, mert A jelszót most SecureString néven tároljuk.

$ Cred.Password

A PSCredential objektum, amelyet a $ Cred változóban mentettünk, most használható cmdlet-ekben, amelyek támogatják az ilyen típusú objektumokat.

A $ Cred.Username és $ Cred.Password paraméterek olyan parancsmagokban használhatók, amelyek nem támogatják a PSCredential objektumokat, de külön felhasználói nevet és jelszót igényelnek.

A Read-Host parancsmagot az AsSecureString attribútummal is felhasználhatja felhasználói jelszó kérésére:
$ pass = Read-Host "Enter Password" -AsSecureString

Ebben az esetben nem fogja látni a $ pass változó tartalmát sem, amelyben a jelszó tárolódik.

A jelszó PowerShell-parancsfájlokban történő használatának fenti módszereiben feltételezték, hogy a jelszót interaktív módon adták meg a szkript végrehajtásakor. De ez a módszer nem alkalmas különféle forgatókönyvekre, amelyek automatikusan vagy az ütemezőn futnak.

Ebben az esetben sokkal kényelmesebb a fiók adatainak (név és jelszó) titkosítása, és titkosított formában a lemezre helyezett szöveges fájlba mentése vagy közvetlenül a szkriptben történő felhasználása..

Tehát a parancsmag segítségével ConvertFrom-SecureString A jelszót konvertálhatja a SecureString formátumból egy titkosított karakterlánccá (a titkosítás a Windows Data Protection API - DPAPI használatával történik). Megjelenítheti a titkosított jelszót a képernyőn, vagy fájlba mentheti:

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

A fájlból titkosított jelszó használatához meg kell végezni a fordított átalakítást a Securestring formátumra a parancsmag segítségével. ConvertTo-SecureString:

$ felhasználónév = "corp \ administrator"
$ pass = Get-Content c: \ ps \ passfile.txt | ConvertTo-SecureString
$ creds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $ felhasználónév, $ pass

Így a $ creds változóban PSCredential objektumot kaptunk a felhasználói hitelesítő adatokkal.

Ha azonban megpróbálja másolni a passfile.txt fájlt egy másik számítógépre, vagy egy másik felhasználónál használja (nem az a felhasználó, amelyben a jelszót létrehozták), akkor látni fogja, hogy a $ creds.password változó üres és nem tartalmaz jelszót. A tény az, hogy a DPAPI segítségével történő titkosítást a felhasználói profilban tárolt kulcsok segítségével hajtják végre. Ezeknek a kulcsoknak a nélkül egy másik számítógépen nem lehet visszafejteni egy fájlt jelszóval.
ConvertTo-SecureString: A kulcs nem használható a megadott állapotban.
"Nem lehet feldolgozni az argumentumot, mert a jelszó argumentuma NULL.
Adjon meg egy nem NULL értéket a jelszó argumentumhoz. "

Tehát, ha a szkript egy másik (szolgáltatási) fiók alatt, vagy egy másik számítógépen fut, akkor egy másik, a DPAPI-re jellemző titkosítási mechanizmust kell használnia. Az idegen titkosítási kulcs a paraméterek segítségével határozható meg -kulcs vagy -SecureKey.

Például a PowerShell segítségével létrehozhat egy 256 bites AES kulcsot, amelyet egy fájl visszafejtéséhez használhat. Mentse el a kulcsot a password_aes.key szövegfájlba.

$ AESKey = Új objektum bájt [] 32
[Biztonság.Cryptográfia.RNGCryptoServiceProvider] :: Létrehozás (). GetBytes ($ AESKey)
$ AESKey | out-file C: \ ps \ password_aes.key

Most elmentheti a jelszót egy fájlba a következő gomb használatával:

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

Ne felejtse el, hogy ha megad egy domain fiókot a Powershell szkriptben, és rendszeresen rendelkezik a jelszavak megváltoztatásával, akkor ezt a fájlt minden alkalommal frissítenie kell a jelszó megváltoztatásakor (külön FGPP jelszó házirendek segítségével külön fiókokhoz külön jelszó házirendet hozhat létre).

Így két fájlt kaptunk: egy fájlt titkosított jelszóval (passfile.txt) és egy fájlt egy titkosítási kulccsal (password_aes.key)..

Átviheti őket egy másik számítógépre, és megpróbálhatja beszerezni a jelszót a fájlból a PowerShellből (a kulcsfájlt elhelyezheti a hálózati könyvtárban).

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

Ha nem akarja az AES kulccsal különálló fájl foglalkozni, akkor a titkosítási kulcsot közvetlenül a szkriptbe varrhatja. Ebben az esetben a kulcs helyett mindkét esetben használni kell

[Byte []] $ kulcs = (1 ... 16)
$ Cred.Password | ConvertFrom-SecureString -Key $ kulcs | Set-Content c: \ ps \ passfile.txt

És dekódoláshoz:

[Byte []] $ kulcs = (1 ... 16)
$ pass = Get-Content c: \ ps \ passfile.txt | ConvertTo-SecureString -Key $ kulcs

Mint láthatja, a jelszó nem üres, ami azt jelenti, hogy sikeresen dekódolta és más számítógépeken is használható.

tanács. A fájlhoz való hozzáférést az AES-gombbal kell korlátozni, hogy csak a szkript futtatása alatt álló felhasználó vagy fiók férjen hozzá. Óvatosan ellenőrizze a password_aes.key fájl NTFS engedélyét a hálózati könyvtárba helyezésekor.

És végül a legszomorúbb pillanat. A tiszta PSCredential objektum jelszavát nagyon egyszerűen kihúzza:

$ Cred.GetNetworkCredential (). Jelszó

A jelszót szöveges formában kibonthatja a SecureStringből:

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

Amint megérti, ezért nem kívánatos a privilegizált fiókokhoz, például a tartományi rendszergazdákhoz tartozó jelszavak mentése a DC kivételével..

Tanács. Annak érdekében, hogy megóvja az adminisztratív nyilvántartásokat a jelszavak memóriákból történő kibontásáról az olyan segédprogramok segítségével, mint a Mimikatz, átfogó intézkedéseket kell alkalmaznia, ideértve a szervezeti tervet is.