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