31.01.2023

Etki alanında olmayan makinelere powershell ile uzaktan bağlanmak

Kısacası PSRemoting. Uzun konu. Ama pratik olarak etki alanında (domain) olmayan makinelerin birbirlerine nasıl uzaktan bağlanacaklarına hızlıca bakalım.

İki makine de workgroup modunda. Bağlantıyı başlatarak karşı tarafta bağlanacak makineye "kaynak", kendisine bağlanılmasını bekleyecek makineye de "hedef" diyelim.

Bu ikisinin de güvenlik duvarları açık olabilir. Kaynak makinenin dışarı çıkışının engellenmediğini varsayarak bu tarafta yapılacak birşey yok. Ama hedef makine dinleme modunda olduğundan bu makinede uygun portlar açacak ayarların yapılması gerekecek. Ayrıca hedef makinede bu bağlantıyı bekleyecek (dinleyecek) bir yapı da olmalı. Bu da WinRM hizmeti. Varsayılan olarak yeni sistemlerde bu kapalı geliyor. Bunun da açılması gerekecek. Birkaç küçük ayrıntı daha var. Şükür ki bunları otomatik yapan bir cmdlet var. Hedef makinede sadece şunu yazmak yeterli:

PS> Enable-PSRemoting

Eğer bunu yazınca ağ profilimiz ile ilgili şikayet ediyorsa Public profildeyiz demektir. İki seçeneğimiz var; ya -SkipNetworkProfileCheck parametresini kullanarak tekrar deneyebiliriz ya da ağ profilimizi değiştirmeliyiz. Bence ikincisi daya iyi bir seçenek. Değiştirmek için

PS> Set-NetConnectionProfile -NetworkCategory Private

Hedef makine ile işimiz bitti. Şimdi sıra kaynak makinede. Powershell ile bağlanırken kullanıcı adı ve şifre bilgileri karşı makineye gönderileceğinden karşıdaki makinenin gerçekten güvenilir olup olmadığından emin olmamız istenir. Bu sebeple rastgele makinelere bağlanmayı denerken kullanıcı adı ve şifre bilgilerini göndermememiz için güvenilir bilgisayarlar listesi oluşturulmuş. Sadece bu listedeki bilgisayarlara bağlanabiliriz. Bu liste de WSMan sürücüsünde localhost\Client\TrustedHosts gibi bir adrestedir. Mevcut içeriğini görüntülemek için

PS> Get-Item WSMan:\localhost\Client\TrustedHosts

kullanabiliriz. Hedef makinemizin adının da "hedef" olduğunu varsayarsak bu dosyaya bu bilgisayarın ismini girmemiz gerek. Şöyle bir komut kullanabiliriz:

PS> Set-Item WSMan:\localhost\Client\TrustedHosts -Value "hedef"

Bu komut TrustedHosts'un içeriğini değiştirir. Birden fazla ekleme yapmak için -Concatenate parametresi kullanılabilir. Bir de "sunucu" adında bir makine daha ekleyelim:

PS> Set-Item WSMan:\localhost\Client\TrustedHosts -Value "hedef" -Concatenate

Bu aşamada artık bağlanabiliriz:

PS> Enter-PSSession -Computername hedef -Credential (Get-Credential "hedef\kullanici")

Burada sorun varsa belki hedef makinedeki güvenlik duvarını tekrar kontrol etmek isteyebiliriz.

PS> Get-NetFirewallRule "WINRM-HTTP-In-TCP*"

Bu komut sonucunda 2 kural dönecektir. İkisi de 5985/TCP portunu etkinleştiren kuraldır ama özelliklerini aşağıaki gibi kıyaslayayım:

Kural ismi
Ağ profiliKapsamPort/ProtokolPrivate Profilde
WINRM-HTTP-In-TCPPublic
Yerel alt ağ
5985/TCPDevre dışı
WINRM-HTTP-In-TCP-NoScopeDomain ve Private
-yok-5985/TCPEtkin

Bu tabloda vurgulamak istediğim, isminde NoScope geçen Domain ve Private profilleri için oluşturulmuş bir kural. Bizim profilimiz de Private olduğu için burada etkinleştirilmiş duruma olmalı. Diğer kuralda ise kapsam (scope) belirtilmiştir, sadece yerel alt ağ. Eğer olur da public profili etkinleştirirsek bizim kontrol etmemiz gereken kural bu olacak.

Buna alternatif olarak hedef makine SSH sunucusu varsa ssh ile de bağlanmak mümkün. O yazımda yazmadığım şekilde Windows makineye ssh yüklemek için (bugün için beta) artık winget de kullanabiliriz:

PS> winget install "OpenSSH Beta"

2024-05-02: Bir makinenin uzaktan bağlantı alıp alamayacağını kontrol etmek için

Test-WSMan

kolay yapılandırma için (WinRM servisini başlatıp, başlangıç tipini otomatik seçip herhangi bir IP adresinden gelecek HTTP bağlantılarını dinlemeye başlaması ve Windows Firewall üzerinden WinRM portunu açması için)

winrm quickconfig

ve hatta https üzerinden yapılandırma için

winrm quickconfig -transport:https

kullanılabilir. WinRM yapılandırmasını kontrol etmek için

winrm get winrm/config/client
winrm get winrm/config/service

ve WinRM hizmetinin durumunu görmek için

winrm enumerate winrm/config/listener

kullanılabilir. Ya ad TrustedHosts'u değiştirmek için

winrm set winrm/config/config '@{TrustedHosts="192.168.1.5"}'

---

https://www.techthoughts.info/powershell-remoting/

https://github.com/techthoughts2/Learn-PowerShell-Code-Examples/blob/master/LearnPowerShell/EP9%20-%20PowerShell%20Remoting.ps1

Hiç yorum yok: