Što je to 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 Windows Remote Management 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 Windows Remote Managementa. Tamo gdje nije moguće uspostaviti međusobnu autentikaciju obaju strana koje “razgovaraju” kroz WinRM, preporučuje 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.
Izvršavanje skripte uz WinRM protokol
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