Powershell Remoting i WinRM

Windows Remote Management ili WinRM je upravljački protokol koji se koristi za međusobnu komunikaciju računala/servera različitih proizvođača, različitih operativnih sustava i različitog hardvera.

Baziran je na SOAP-u, a komunicira putem HTTP/HTTPS protokola.

WinRM je dio operativnog sustava i defaultno je upaljen na svakom serveru, no za korištenje je potrebna dodatna konfiguracija.

Konfiguracija WinRM-a

Kako bismo provjerili trenutnu konfiguraciju WinRM servisa, iz Powershella na udaljenom računalu/serveru pokrenemo sljedeću naredbu:

winrm get winrm/config

Kako bismo provjerili trenutnu konfiguraciju listenera, iz Powershella na udaljenom računalu/serveru pokrenemo sljedeću naredbu:

winrm e winrm/config/listener

Output nam prikaže detalje oko konfiguracije listenera, adrese, porta i slično.

 

Ako protokol nije uključen, za uključivanje i konfiguraciju s defaultnim vrijednostima možemo koristiti naredbu:

winrm quickconfig

Pokretanjem ove naredbe u biti pokrećemo WinRM servis, kreiramo listenera koji “sluša” na svim IP adresama i u firewallu dozvoljavamo pristup portovima kojime se WinRM služi. Standardno je to port 5985 za HTTP.

Za kreiranje HTTPS listenera, potrebno je dodatno pokrenuti:

winrm quickconfig -transport:https

ili ako se koristi certifikat:

winrm create winrm/config/Listener?Address=*+Transport=HTTPS ‘@{Hostname=”domena.hr”; CertificateThumbprint=”1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234″}’

Dodatno je još potrebno otvoriti i port 5986 u firewallu:

New-NetFirewallRule -DisplayName “Windows Remote Management (HTTPS-In)” -Direction Inbound -Protocol TCP -Action Allow -RemoteAddress 1.2.3.4 -LocalPort 5986

 

Autentikacija

Postoji nekoliko načina autentikacije:

Basic – najnesigurniji način autentikacije jer se korisničko ime i lozinka se šalju u plain text obliku. Ne može se koristi u Active Directory okruženju. Može se koristiti s lokalnim korisničkim računom koji mora biti u Administrator grupi.

Certificate – ako se koristi self-signed certifikat treba ga uvesti lokalno na klijentskom računalu u Trusted Root Certification Authorities store. Autentikacija certifikatom se ne može koristiti u domenskim okruženjima, odnosno s domenskim korisničkim računom.

Kerberos – klijent i server se međusobno autenticiraju koristeći Kerberos certifikate. Jedna je od najsigurnijih opcija autentikacije u WinRM protokolu. Ne može se koristiti u workgroup okruženju jer zahtijeva da su klijent i server u istoj domeni.

NTLM – stariji mehanizam autentikacije koji podržava i workgroup i AD okruženje. Defaultno se koristi gdje nije podržan Kerberos. NTLM autentikacija jamči identitet klijenta i ne šalje lozinku prema odredišnom računalu/serveru. Ukoliko se na destination serveru postavi SSL certifikat ova autentikacija može jamčiti i identitet servera.

CredSSP – omogućava da se nakon uspješne autentikacije na prvom serveru ili računalu, korisničko ime i lozinka enkriptiraju i šalju na sljedeći server ili računalo. CredSSP podržava i workgroup i AD okruženje.

Negotiate – kada je postavljen “Negotiate”, metoda autentikacije se “dogovara”. Ako su klijent i server u istoj domeni koristi se Kerberos, a ako nisu u domeni, koristi se NTLM.

 

Provjeru postavljenog načina autentikacije možemo izvršiti pomoću:

winrm get WinRM/Config/Service/Auth

A naredbom:

winrm set WinRM/Config/Service/Auth ‘@{Basic=”false”;Kerberos=”false”;Negotiate=”true”;Certificate=”true”;CredSSP=”false”}’

možemo uključiti Certificate i Negotiate autentikaciju, a ostale isključiti.

 

TrustedHosts

TrustedHosts je lista računala kojima dozvoljavamo pristup putem WinRM-a. Tamo gdje nije moguće uspostaviti međusobnu autentikaciju obaju strana koje “razgovaraju” kroz WinRM, preporuča se podešavanje ovog popisa, i to, što restriktivnije što je moguće. TrustedHosts može sadržavati druge servere u workgroupi ili one u drugoj domeni.

Pregled TrustedHosts liste možemo obaviti naredbom:

Get-Item WSMan:\localhost\Client\TrustedHosts

Dodati server ili računalo u tu listu možemo naredbom:

Set-Item -Path WSMan:\localhost\Client\TrustedHosts -Value ‘MojServer1’

 

Enkripcija

Enkripcija se vrši pomoću TLS protokola kroz HTTPS ili message level enkripcije kada se koristi HTTP. TLS enkripcija je naprednija i sigurnija, podržava sve načine autentikacije, ali zahtijeva instalirani certifikat i podešen HTTPS listener. Common Name certifikata mora odgovarati imenu hosta, mora biti validnog trajanja (da nije istekao ili da je opozvan) i ne smije biti self-signed.

 

Nekoliko naredbi…

Koristeći ovaj protokol, možemo pokrenuti Powershell naredbu na udaljenom računalu/serveru.

Na primjer:

Invoke-Command -ComputerName MojServer2 -ScriptBlock { netstat } -credential Administrator

Ovom linijom pozivamo pokretanje netstat alata na računalu ili serveru čije je ime hosta MojServer2, a koristeći kredencijale korisnika Administrator. Nakon što potvrdimo pokretanje ove linije, otvara nam se prozor gdje trebamo unijeti lozinku za Administratora.

 

Također, možemo, na primjer, narediti ponovno pokretanje nekog servisa:

Invoke-Command -ComputerName MojServer3 -ScriptBlock { Restart-Service MSSQLSERVER } -credential Administrator

 

Naredbe na udaljenom računalu/serveru možemo pokretati i korištenjem već spremljenih pristupnih podataka.

Kredencijale najprije upisujemo u varijablu:

$credential = Get-Credential

Zatim lozinku spremamo u datoteku, u sigurnom, enkriptiranom obliku:

$credential.Password | ConvertFrom-SecureString | Set-Content C:\direktorij\MojServer4_enkriptirana_lozinka.txt

Kod pokretanje naredbe na udaljenom računalu, lozinku iz datoteke izvlačimo u varijablu koju koristimo kod slanja kredencijala:

$lozinka = Get-Content C:\direktorij\MojServer4_enkriptirana_lozinka.txt | ConvertTo-SecureString
$pristupnipodaci = New-Object System.Management.Automation.PSCredential(“Administrator”, $lozinka)
Invoke-Command -ComputerName MojServer5 -ScriptBlock { netstat } -credential $pristupnipodaci

Ovom linijom pozivamo pokretanje netstat naredbe na računalu ili serveru čije je ime hosta MojServer5, a koristeći korisničko ime i lozinku iz datoteke, odnosno varijable $pristupnipodaci.

 

Koristeći WinRM protokol, možemo narediti izvršavanje skripte, koja se nalazi lokalno na klijentu na lokaciji C:\skripta.ps1, na udaljenom računalu/serveru.

Invoke-Command -FilePath C:\skripta.ps1 -ComputerName MojServer6 -credential $pristupnipodaci

 

Osim pokretanja pojedinačnih naredbi, možemo kreirati i cijeli session, iz kojeg ćemo onda interaktivno pokretati naredbe, kao da smo direktno na udaljenom računalu/serveru. Ovakav način je vrlo sličan upravljanju Linux strojem pomoću SSH protokola.

$lozinka = ‘Lozinka123!’
[SecureString]$sigurnalozinka = $lozinka | ConvertTo-SecureString -AsPlainText -Force
$pristupnipodaci = New-Object System.Management.Automation.PsCredential(“Administrator”, $sigurnalozinka)
Enter-PSSession -Computername MojServer7 -UseSSL -Credential $pristupnipodaci

Naravno, ovo je primjer, i u produkciji nećemo koristiti ovakvu lozinku 🙂

Kada smo u interaktivnoj sesiji, možemo pokrenuti nekoliko naredbi, npr. top 5 procesa po korištenju CPU-a:

Get-Process | Where { $_.name -ne “Idle” } | Sort TotalProcessorTime -Descending | Select -First 5 -Property ID,ProcessName,TotalProcessorTime | Format-Table -AutoSize

Za izlazak iz remoting sessiona dovoljno je pokrenuti:

Exit-PSSession

 

Povezani članci

Odgovori