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
Í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.