← Back to Posts

Windows Remote Management (WinRM) Over Linux/Docker/macOS Platforms

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 
Is WinRM Running ?

Eğer WinRM servisi "Running" durumda değilse "WinRM qucikconfig" komutu ile temel winrm ayarlarını yaparak servisi aktif hale getirebilirsiniz.

WinRM QuickConfig 
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
Create SelfSigned Certificate

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
wsman as a drive & folder

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
Listener Details

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

How to configure WinRM for HTTPS manually