Windows Remote Management (WinRM) Over Linux/Docker/macOS Platforms
Published on 29 Sep 2021
· Around 15 minutes to read
WinRM Nedir ?
Windows Remote Management (WinRM), Microsoft tarafından WS-Management protokolü üzerinde geliştirilmiş SOAP tabanlı bir iletişim protokolüdür. Uzak istemcilerin/sunucuların yönetilmesi, yetkiler dahilinde bir çok komutun çalıştırılması için kullanılır. Linux bir sunucu üzerinden PowerShell Core ile "Negotiate" methodu kullanılarak karşı makinaya nasıl bağlanılır ve karşımıza çıkabilecek olası sorunları çözerken nasıl bir yol izlemeliyiz gibi yönlendirici konulara değinmeye çalışacağız.
WinRM Nasıl Konfigure Edilir ?
İşlem yapacağımız istemci/sunucu üzerinde Powershell komut satırı açarak, WinRM servisinin çalışır durumda olduğunu kontrol ediyoruz. (Windows dili Türkçe ise servis ismi "Windows Uzaktan Yönetim (WS-Management)" olarak görünür.)
Not: Bu konfigurasyonlar için Powershell "Administrator" modda çalışıtırmalıdır.
Get-Service WinRM
Eğer WinRM servisi "Running" durumda değilse "WinRM qucikconfig" komutu ile temel winrm ayarlarını yaparak servisi aktif hale getirebilirsiniz.
WinRM QuickConfig
SelfSigned SSL sertifikası oluşturmak için bu komutu kullanıyoruz. Komutta geçen "DnsName" parametresine, DNS, IP yada Hostname bilgisiniz yazabilirsiniz.
New-SelfSignedCertificate -DnsName "Your DNS/IP/Hostname" -CertStoreLocation Cert:\LocalMachine\My
WinRM için yapılan bir çok konfigurasyon bulunmaktadır. Haliyle bu konfigurasyonların isimlerini, tiplerini, değerlerini görmeniz gerekebilir. Burada sihirli bir komut karşımıza çıkıyor, "cd wsman:".
"wsman" bir sürücü ve dizin yapısı olarak düşünülebilir. "cd", "cd ..", "dir" gibi dizin komutları ile istediğiniz path'e gidebilir ve konfigurasyon değerlerini görebilirsiniz.
"wsman" içinde bu şekilde gezinebilirsiniz.
cd wsman:
dir
cd .\localhost\
dir
cd client
cd ..
...
Bir konfigurasyonun değerini değiştirmek için "Set-Item" komutunu kullanabilirsiniz. Örnek olarak, "Negotiate" authentication yöntemini açmak/kapatmak istiyorsanız bu şekilde kullanabilirsiniz.
cd WSMan:\localhost\Service\Auth\
Set-Item .\Negotiate true # enable Negotiate Authentication
Set-Item .\Negotiate false # disable Negotiate Authentication
Dinleyici (Listener) Nasıl Eklenir ?
WinRM listener'lar üzerinden haberleşir. HTTPS üzerinden haberleşmesini istediğimiz için, HTTPS tipinde bir listener eklememiz gerekiyor. Bunun için bu komutu kullanıyoruz.
winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="DNS_HERE"; CertificateThumbprint="CERTIFICATE_THUMBPRINT_HERE"}'
Listener'ın istekleri dinleyebilmesi için, Windows Firewall üzerinde 5986(TCP) açık olduğunu kontrol etmelisiniz. 5986 WinRM HTTPS için standart porttur, farklı bir port kullanmak istiyorsanız, listener içindeki "Port" bilgisini değiştirip, "winrm" servisini restart edebilirsiniz. Listener'ların hangi portları kullandığını görmek için yukarıda belirtilen "cd wsman:" komutu ile ilgili dizine ulaşabilirsiniz.
cd wsman:
cd localhost
cd listener
dir
cd "your-https-listener-name"
dir
Powershell komutu ile firewall kuralı eklemek için bu komutu kullanabilirsiniz.
netsh advfirewall firewall add rule name="Windows Remote Management (HTTPS-In)" dir=in action=allow protocol=TCP localport=5986
Linux/macOS üzerinden WinRM Bağlantısı Nasıl Açılır?
Linux/macOS üzerinden powershell bağlantısı için Powershell Core yüklü olması gerekiyor. "pwsh" komutunu yazdığınızda hata alıyorsanız, Powershell'i yüklemelisiniz. Aşağıdaki komutlar ile bağlantınızı yapabilirsiniz. Credential bilgileri girilirken, domainde olan bir kullanıcı için "domain\username" formatında giriş yapabilirsiniz.
pwsh
$credential = Get-Credential
$options = New-PSSessionOption -SkipCACheck -SkipCNCheck
$session = New-PSSession -SessionOption $options -Credential $credential "IP-HERE" -Authentication Negotiate
Enter-PSSession $session
Sorun Giderme
Firewall, güvenlik uygulamaları gibi engelleyici unsurların çok olduğu kurumsal ortamlarda, WinRM göründüğünden daha karmaşık bir hal alabiliyor. Bunun yanında WinRM, kendi içinde çok fazla konfigurasyon öğesi barındırıyor. Bu sebeplerle, bağlantı sorunlarını hızlı ve doğru tespit etmek güçleşebiliyor.
Bu konuda bir kaç altın ipucu sunmak istiyoruz:
- Öncelikle bağlantı yapmak istediğiniz hedef makinanın portuna erişim olduğundan emin olun. (WinRM standart HTTPS Portu 5986 idi, "telnet 'HEDEF-IP' 5986" komutu ile erişim kontrolü yapabilirsiniz.)
- Hedef sistem üzerinde 5986 Portunun windows firewall üzerinden açık olduğundan emin olun.
- Erişim olduğu halde bağlantı sorunu devam ediyorsa, hedef sunucunun "Event Viewer" içindeki bağlantı işlemine karşılık gelen log ve detayı, çözüm için ipucu verecektir.
- SSL sertifikası oluşturulurken kullanılan IP/DNS bilgisinin doğruluğundan ve bu IP/DNS bilgisi ile hedef sisteme erişilebildiğinden emin olun.
- Eğer "Event Viewer" üzerindeki hatanın detayında "0XC000035b" hata kodunu görüyorsanız, bu adımları uygulayarak çözüme ulaşabilirsiniz.
cd wsman:
cd localhost
cd service/auth
set-item cbthardeninglevel 'None'
restart-service winrm
Kaynaklar
Installation and configuration for Windows Remote Management