Strona korzysta z plików cookies w celu realizacji usług i zgodnie z Polityką Plików Cookies.


12.05.2022

Odszyfrowanie historii

Z inicjatywy prezesa IPN, dr. Karola Nawrockiego, powstało Biuro Nowych Technologii. Jego...
01.04.2022

Program partnerski

NGAGEFirma NFON, ogólnoeuropejski dostawca komunikacji głosowej w chmurze, ogłosił...
01.04.2022

SI w TFI PZU

Na platformie do inwestowania inPZU działa już nowa metoda identyfikacji tożsamości...
01.04.2022

Kooperacja w chmurze

To oparta na stworzonej przez NetApp technologii ONTAP i w pełni zarządzana przez...
01.04.2022

Nowe laptopy od Dynabook

Dynabook wprowadza do swojej oferty dwa laptopy z procesorami Intel Core 12. generacji,...
01.04.2022

Ryzen do stacji roboczych

AMD przedstawił nową gamę procesorów Ryzen Threadripper PRO 5000 serii WX.
31.03.2022

Serwery dla MŚP

Firma Lenovo wprowadziła nowe rozwiązania w zakresie infrastruktury IT Future Ready,...
31.03.2022

Innowacyjny kontroler SSD

Microchip zaprezentował nowe kontrolery SSD, które umożliwią obsługę napędów o pojemności...
31.03.2022

Wydajny jak Brother

Brother dodał do swojej oferty trzy nowe, atramentowe urządzenia wielofunkcyjne, które...

Skrypty i uwierzytelnianie

Data publikacji: 03-02-2022 Autor: Bartosz Bielawski

W pracy administratora zdarza się, że musimy uruchamiać polecenia z uprawnieniami innego użytkownika, najczęściej o podwyższonych uprawnieniach. Delegując uprawnienia, możemy pozwolić sobie na pracę w bezpiecznym (gdyż pozbawionym uprawnień) środowisku, podnosząc je jedynie na czas wykonywania polecenia lub skryptu.

 

W artykule przyjrzymy się temu, jak zadbać, by tego rodzaju skrypty i funkcje przechowywały nasze poświadczenia w sposób możliwie bezpieczny. Omówimy też kilka rozwiązań, które pozwolą nam pominąć przekazywanie poświadczeń przy każdorazowym uruchomieniu skryptu.


> PSCredential

 

Pisząc skrypty bądź funkcje, musimy przede wszystkim zadbać o to, by przekazywanie poświadczeń było nie tylko możliwe, ale także możliwie proste, bez obniżania poziomu zabezpieczeń. Tradycyjnie do przechowywania poświadczeń w PowerShellu wykorzystywany jest typ PSCredential. Przede wszystkim powinniśmy więc zadbać, by przekazywanie dowolnego rodzaju poświadczeń odbywało się za pomocą obiektów tego typu. Nie wystarczy jednak dodanie parametru wykorzystującego ten typ. Będzie to rozwiązanie bezpieczne, ale mało wygodne.


Dodając do naszej funkcji bądź skryptu parametr zawierający poświadczenia, powinniśmy stosować się do kilku reguł. Jeśli korzystamy tylko z jednego obiektu tego typu, to warto nadać parametrowi nazwę „Credential”. Dzięki temu tworzone przez nas polecenie będzie spójne z innymi poleceniami wspierającymi przekazywanie poświadczeń.


Druga, szalenie istotna sprawa, to wsparcie dla użytkowników pragnących podać hasło bądź hasło i nazwę użytkownika w trakcie uruchomienia polecenia. Bardzo często polecenia nie wspierają tego rodzaju pracy z poleceniem Credential, zmuszając nas poniekąd do utworzenia zmiennej w bieżącej sesji, i dopiero tę zmienną przekazywać będziemy dalej:


$poświadczenia = Get-Credential
Invoke-Command -ComputerName test -Credential $poświadczenia `
-ScriptBlock { hostname }


Polecenia poprawnie obsługujące parametr Credential umożliwiają przekazanie do tego parametru ciągu znaków, który traktowany będzie jak nazwa użytkownika. Dalej polecenie poprosi nas jedynie o hasło dla tego właśnie użytkownika:


Invoke-Command -ComputerName test -Credential `
testadministrator -ScriptBlock { hostname }


Aby uzyskać taki efekt, będziemy musieli skorzystać z klasy przekształcającej, o którą wzbogacimy definicję parametru.


Ostatnia rzecz, która może się okazać przydatna, to umożliwienie uruchomienia polecenia bez podawania poświadczeń (jeśli możemy się bez nich obejść) lub wymuszenie podania ich, jeśli bez nich nasze polecenie z pewnością nie zadziała. Poprawnie zaimplementowany parametr PSCredential wyglądałby więc następująco:


function Get-Secret {
 param (
 # Parametr niezbędny
 [Parameter(Mandatory)]
 [PSCredential]
 [Management.Automation.Credential()]
 $Credential
 ) }
function Get-Something {
 param (
 # Parametr przydatny
 [Parameter()]
 [PSCredential]
 [Management.Automation.Credential()]
 $Credential = [PSCredential]::Empty
 )
 if ($Credential -eq [PSCredential]::Empty) {
 # Nie mamy poświadczeń…
} }


Konieczność stosowania atrybutów jest niezwykle istotna. Jeśli odwrócimy kolejność typu naszego parametru (PSCredential) i atrybutu, który potrafi dokonać przekształcenia (Management.Automation.Credential), to uzyskamy efekt daleki od zamierzonego, przynajmniej w starszych wersjach PowerShella – w czasie testów udało się odtworzyć takie zachowanie w PowerShellu w wersji czwartej. Co się wówczas wydarzy? Ciąg znaków, który przekażemy do PSCredential, nie nadaje się do bezpośredniego przypisania do zmiennej typu PSCredential, więc nasza funkcja zwróci w takim przypadku błąd. Co ciekawe, w nowszych wersjach atrybut możemy pominąć. Typ PSCredential sam będzie usiłował dokonać przekształcenia. Poniżej zachowanie funkcji z błędną kolejnością i bez atrybutu w PowerShellu 4 i 5.1:


# Funkcja
function Get-WrongSecret {
 param (
 [Parameter()]
 [Management.Automation.Credential()]
 [PSCredential]
 $Credential
 ) }
# PowerShell 5.1
Get-WrongSecret -Credential test
<zapytanie o hasło dla użytkownika test>
# PowerShell wersja 4.0
Get-WrongSecret -Credential test
Cannot process argument transformation on parameter 'Credential'. Cannot convert the "test" value of type "System.String" to type "System.Management.Automation.PSCredential".


Jeśli więc nasz skrypt ma wspierać również starsze wersje PowerShella, to musimy zadbać o to, by parametr najpierw został przekształcony przez atrybut (który potrafi poradzić sobie z ciągiem znaków), a dopiero wynik takiej transformacji PowerShell spróbuje przypisać do kompatybilnego z nim typu PSCredential.

 

[...]

Artykuł pochodzi z miesięcznika: IT Professional

Pełna treść artykułu jest dostępna w papierowym wydaniu pisma.

.

Transmisje online zapewnia: StreamOnline

All rights reserved © 2019 Presscom / Miesięcznik "IT Professional"