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

Łukasz Cholewa

Jak napisać skrypt w PowerShell i zabezpieczyć poświadczenia
Październik 2, 2018 Katarzyna Sobczak

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.

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)

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

Podziel się

Autor: Łukasz Cholewa

Łukasz Cholewa

Łukasz Cholewa

Zespół: Data Center

Ostatnie artykuły autora

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

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

Zdarza się, że trzeba przygotować skrypt, który wykona za nas jakieś zadanie, a wymagane są do tego poświadczenia. W artykule pokażę jak ustrzec się przed kompromitację poświadczeń i naruszeniem bezpieczeństwa.

Import/Export na żądanie w Azure część 2

Import/Export na żądanie w Azure część 2

W tym artykule opiszę jak stworzyć API przechowywującą listę zakupów w oparciu o ASP.NET Core na platformę Linux.

Azure Resource Manager JSON

Azure Resource Manager JSON

Portal Azure Resources – modyfikacje elementów za pomocą JSON.

Skontaktuj się z Łukaszem

 

Administratorem danych gromadzonych z wykorzystaniem formularza jest A.P.N. Promise S.A. Podane przez Ciebie dane będą przetwarzane w zakresie niezbędnym do podjęcia kontaktu lub realizacji określonego żądania zgodnie z art. 6 ust. 1 lit. b RODO przez okres niezbędny dla realizacji Twojego zgłoszenia. Wszelkie informacje w zakresie przetwarzania podanych przez Ciebie w formularzu danych oraz posiadanych uprawnieniach znajdziesz w Polityce prywatności. Kliknij i dowiedz się więcej jeżeli informacje podane powyżej nie są dostatecznie jasne!