Baza Wiedzy
Jak napisać skrypt w PowerShell i zabezpieczyć poświadczenia

Jak napisać skrypt w PowerShell i zabezpieczyć poświadczenia

Czasami zdarza się, że trzeba przygotować skrypt, który wykona za nas określone zadanie – jest to tak zwana automatyzacja zadań. Administratorzy piszą skrypty i wstawiają tam poświadczenia. Oczywiście wszystko jest dobrze dopóki jest to DEV-TEST, ale – jak wiadomo – testy przechodzą w produkcję i w takiej wersji pozostają. Niestety może to przełożyć się na kompromitację poświadczeń użytych w skrypcie i naruszyć bezpieczeństwo.

Zaczynając pisać skrypt dobrze jest już od początku szyfrować lub ukrywać poświadczenia. Z pomocą przychodzi nam PowerShell i polecenia ConvertTo-SecureString oraz ConvertFrom-SecureString.

ConvertTo-SecureString jest metodą konwersji tekstu do zabezpieczonej zmiennej obiektu. Pominę opis parametrów. Wszystkich zainteresowanych tą kwestią odsyłam do artykułu pt. ConvertTo-SecureString.

Drugie polecenie to ConvertFrom-SecureString. Więcej o parametrach można przeczytać w artykule pt. ConvertFrom-SecureString.

Kiedy zaczynamy podawać poświadczenia do skryptu i użyjemy opisanego polecenia, PowerShell używa Windows Data Protection API do szyfrowania danych. Oznacza to, że poświadczenia zaszyfrowane w ten sposób są możliwe do odczytania tylko przez dany komputer oraz użytkownika, który wykonał to polecenie. Wyjątkiem jest użycie w poleceniu parametrów -Key bądź -SecureKey. Jeżeli będziemy chcieli odczytać dane na innym komputerze bez podania wspomnianych wcześniej parametrów, pojawi się błąd. Dlatego przy automatyzacji dobrze jest pamiętać o tym, aby użyć parametrów -Key lub -SecureKey.

Ale o tym w dalszej części artykułu.

Przejdźmy zatem do tworzenia poleceń, które ukryją nasze hasło w skrypcie.

Podajemy nasze hasło do zmiennej:


$Haslo = "Qwerty123"

Wpisujemy polecenie do konwersji hasła:


$KonwersjaDo = ConvertTo-SecureString -AsPlainText -Force -String $Haslo

Eksportujemy poleceniem hasło w zaszyfrowanym standardzie do pliku:


$KonwersjaZ = ConvertFrom-SecureString $KonwersjaDo | Out-File C:tempNaszeHaslo.txt

Efektem końcowym jest plik tekstowy, który w bezpiecznej formie przechowuje nasze hasło.

nasze hasło notatnik

Zdjęcie 1. Hasło w pliku w postaci ciągu znaków.

Teraz możemy utworzyć skrypt, który wykorzystywać będzie nasze hasło.

Przykład do użycia w skrypcie:


$Login = "NaszLoginUzytkownika"
$PlikZHaslem = "C:\Temp\NaszeHaslo.txt"
$NaszePoswiadczenia = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Login, (Get-Content $PlikZHaslem | ConvertTo-SecureString)

No dobrze, ale co w sytuacji, gdy chcemy wykorzystać skrypt np. do uruchamiania go na innych serwerach lub stacjach roboczych?

Wtedy musimy użyć parametrów wspomnianych wcześniej: -Key lub -SecureKey przy poleceniu ConvertFrom-SecureString, które pozwalają użyć algorytmu AES. Posłuży nam to do przechowania poświadczeń w taki sposób, aby można użyć ich było gdzie indziej.

Mamy do wyboru minimum dwie wersje wygenerowania klucza: wersja pierwsza dla ambitnych, wersja druga dla leniwych 😊.

Wpisujemy po prostu ciągi cyfr, które zostaną wykorzystane np. 16-bitów, 32-bity.


[Byte[]] $Klucz = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)

Wpisujemy pierwszą i ostatnią wartość do wykorzystania.


[Byte[]] $Klucz = (17..32)

Oczywiście zawsze można skorzystać z jakiegoś generatora wartości. Przykład użycia takowego w skrypcie poniżej:


$PlikKlucza = "C:\temp\klucz.key"
$PlikZHaslem = "C:\Temp\NaszeHaslo.txt"
$Klucz = New-Object Byte[] 32
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($Klucz)
$Klucz | Out-File $PlikKlucza
$Klucz = Get-Content $PlikKlucza
$KonwersjaHaslo = " Qwerty123" | ConvertTo-SecureString -AsPlainText -Force
$KonwersjaHaslo | ConvertFrom-SecureString -key $Klucz | Out-File $PlikZHaslem

Tak przygotowane wcześniej dane można umieścić bezpiecznie w skrypcie:


$Login = "NaszLoginUzytkownika"
$PlikZHaslem = "C:\Temp\NaszeHaslo.txt"
$PlikKlucza = "C:\temp\klucz.key"
$Klucz = Get-Content $PlikKlucza
$NaszePoswiadczenia = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $Login, (Get-Content $PlikzHaslem | ConvertTo-SecureString -Key $Klucz)
login użytkownika
Zdjęcie 2. Wynik podania hasła w skrypcie, forma zaszyfrowana.

Musimy pamiętać o tym, że każdy, kto ma nasz klucz może odszyfrować dane. Dlatego należy go zabezpieczyć. Nie ma metody, która zabezpieczy nas w 100%, jednak zawsze dobrze jest minimalizować szanse na kompromitację naszych poświadczeń.

Leave a comment