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 ve yetkiler dahilinde birçok komutun çalıştırılması için kullanılır. Bu yazıda, Linux bir sunucu üzerinden PowerShell Core ile "Negotiate" yöntemi kullanılarak karşı makineye 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 Konfigüre 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 konfigürasyonlar için PowerShell, "Administrator" modda çalıştırılmalıdır.
Get-Service WinRM
Eğer WinRM servisi "Running" durumda değilse "WinRM QuickConfig" komutu ile temel WinRM ayarlarını yaparak servisi aktif hale getirebilirsiniz.
WinRM QuickConfig
SelfSigned SSL sertifikası oluşturmak için aşağıdaki komutu kullanıyoruz. Komutta geçen "DnsName" parametresine DNS, IP ya da Hostname bilginizi yazabilirsiniz.
New-SelfSignedCertificate -DnsName "Your DNS/IP/Hostname" -CertStoreLocation Cert:\LocalMachine\My
WinRM için yapılan birçok konfigürasyon bulunmaktadır. Haliyle bu konfigürasyonların isimlerini, tiplerini ve değerlerini görmeniz gerekebilir. Burada karşımıza sihirli bir komut çı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 konfigürasyon değerlerini görebilirsiniz.
"wsman" içinde bu şekilde gezinebilirsiniz.
cd wsman:
dir
cd .\localhost\
dir
cd client
cd ..
...
Bir konfigürasyonun 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) portunun 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 yeniden başlatabilirsiniz. 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
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'un 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 konfigürasyon öğesi barındırıyor. Bu sebeplerle bağlantı sorunlarını hızlı ve doğru tespit etmek güçleşebiliyor.
Bu konuda birkaç altın ipucu sunmak istiyoruz:
- Öncelikle bağlantı yapmak istediğiniz hedef makinenin 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


