Post

PowerShell ile Modern Uzaktan Yönetim: Protokoller, Portlar ve Pratik Komut Rehberi

PowerShell ile Modern Uzaktan Yönetim: Protokoller, Portlar ve Pratik Komut Rehberi

PowerShell Modern Uzaktan Yönetim ve Betik Mimarisi Windows sistem yönetiminde modern protokoller, standartlar ve PowerShell araçları.

Windows tabanlı sistemlerde ve kurumsal ortamlarda sistem yöneticiliği yaparken sistemleri uzaktan yönetmek, envanter toplamak ve güvenli iletişim kurmak için kullanılan temel mimari bileşenler şunlardır: CIM (WMI Veri Modeli), WinRM, PSRemoting, OpenSSH, PowerShell Direct, JEA, CredSSP, RPC ve SMB. Bu rehberde; protokollerin çalışma mantığını, güvenlik duvarı (Firewall) port yapılandırmalarını, toplu sunucu yönetimini, sahada karşılaşılan Double-Hop ve Workgroup gibi kritik senaryoların çözümlerini ve doğrudan üretim ortamında kullanabileceğiniz pratik komutları bulabilirsiniz.


1. Mimari Genel Bakış: Hangisi Ne İşe Yarar?

Modern uzaktan yönetim mimarisi 4 temel katman üzerinden çalışır:

KatmanKavram / TeknolojiGörevi ve TanımıKullanım Alanı
1. Bilgi Deposu (Veri Modeli)CIM & WMIİşletim sisteminin donanım, yazılım, servis ve kullanıcı gibi tüm kaynaklarını sınıflar halinde tutan standart veri modelidir.Sistem & Donanım Envanteri
2. Taşıyıcı Protokol (Ağ Tüneli)WinRM, WS-Man, OpenSSH, RPCİstemci ile sunucu arasındaki veri aktarımını sağlayan ağ iletişim protokolleridir.Ağ İletişimi & Şifreleme
3. Oturum YeteneğiPSRemotingPowerShell’in uzaktaki makinede etkileşimli oturum açma veya komut yürütme altyapısıdır (Windows’un SSH kabuğu gibi).Uzaktan Konsol & Script Yürütme
4. Yönetim Araçları (İstemci)Get-CimInstance, Invoke-Command, Enter-PSSessionYöneticinin doğrudan çalıştırdığı modern PowerShell komut satırı araçlarıdır.Yönetici Konsolu

2. Temel Kavramlar ve Tanımlar

  • CIM (Common Information Model) & WMI: DMTF tarafından belirlenmiş açık standartlı veri modelidir. Donanım, işletim sistemi ayarları ve süreçler gibi sistem kaynaklarını standart sınıflar altında sunar. Modern PowerShell dünyasında tüm veri sorgulamaları CIM cmdlet’leri (Get-CimInstance, Invoke-CimMethod vb.) ile doğrudan modern ve firewall dostu WinRM protokolü üzerinden yürütülür.
  • WinRM (Windows Remote Management): Microsoft’un WS-Management protokolünü uygulayan yerel uzaktan yönetim servisidir. Windows sistemlerin uzaktan standart ve güvenli portlar üzerinden yönetilmesini sağlar.
  • PSRemoting (PowerShell Remoting): PowerShell’in uzak bilgisayarlar üzerinde etkileşimli konsol açma (Enter-PSSession) ve uzaktan tekil veya toplu script blokları çalıştırma (Invoke-Command) yeteneğidir. PSRemoting varsayılan olarak WinRM protokolünü kullanır.
  • PowerShell Direct: Hyper-V ana makinesinden sanal makinelere (VM) ağ bağlantısı, IP adresi veya güvenlik duvarı kuralına ihtiyaç duymadan doğrudan Hyper-V VMBus üzerinden bağlanan özel yönetim kanalıdır.
  • JEA (Just Enough Administration): Kullanıcılara tam yerel yönetici hakkı vermek yerine, yalnızca izin verilen PowerShell komutlarını ve parametrelerini çalıştırmalarını sağlayan rol tabanlı güvenlik (RBAC) altyapısıdır.
  • WS-Management (WS-Man): Sistemler arasında SOAP ve XML tabanlı web servisleri mesajlaşmasıyla yönetim verisi transferi sağlayan açık web protokolüdür. WinRM, bu protokolün Microsoft implementasyonudur.
  • OpenSSH (SSH Remoting): PowerShell 7+ ile birlikte yerel olarak desteklenen, Windows ve Linux karma ortamlarında anahtar tabanlı güvenli kimlik doğrulama sunan endüstri standardı uzaktan yönetim protokolüdür (Port 22).
  • CredSSP (Credential Security Support Provider): Bir sunucudan başka bir sunucuya atlama yapılırken (Double-Hop senaryolarında) kimlik bilgilerinin güvenli bir şekilde devredilmesini sağlayan kimlik doğrulama mekanizmasıdır.
  • RPC (Remote Procedure Call): Bir programın ağ üzerindeki başka bir bilgisayarda kod çalıştırmasını sağlayan alt seviye işletim sistemi iletişim protokolüdür. Modern sistemlerde yönetim trafiği doğrudan RPC yerine güvenlik duvarı dostu WinRM üzerinden taşınır.
  • SMB (Server Message Block): Windows ortamlarında dosya, yazıcı ve adlandırılmış boru (named pipe) paylaşımını sağlayan ağ protokolüdür (TCP 445). Uzak bilgisayarların yönetimsel disk paylaşımlarına (örn. \\Sunucu\C$) erişirken SMB protokolü devreye girer.

PowerShell Remoting Mimarisi ve İletişim Protokolleri WinRM, OpenSSH ve güvenli uzaktan yönetim ağ mimarisi.


3. İletişim Portları ve Güvenlik Duvarı Rehberi

Uzak yönetim işlemlerinin güvenlik duvarına (Firewall) takılmaması için ilgili servislerin dinlediği varsayılan portlar:

Protokol / ServisVarsayılan PortTaşıma & Şifreleme DurumuKullanım Alanı
WinRM & WS-Man (HTTP)TCP 5985HTTP protokolü taşır ancak Kerberos/NTLM ile paket yükü (payload) AES-256 ile şifrelidir.Domain içi varsayılan WinRM / PSRemoting bağlantısı.
WinRM & WS-Man (HTTPS)TCP 5986TLS / SSL sertifikası ile uçtan uca şifreli HTTPS bağlantısı.Güvenli / DMZ ve Workgroup WinRM bağlantıları.
PSRemoting (SSH)TCP 22OpenSSH anahtar veya parola şifrelemesi.PowerShell 7+ karma (Windows/Linux) ortamlar.
CIM Cmdlet’leriTCP 5985 / 5986Varsayılan olarak WinRM kullanır; firewall üzerinden kolayca geçer.Modern PowerShell CIM sorguları.
SMB (Dosya Paylaşımı)TCP 445SMB 3.x şifreleme destekli dosya paylaşım protokolü.Yönetimsel paylaşımlar (C$, Admin$, dosya yazma).
PowerShell DirectPort Yok (VMBus)Donanım veriyolu üzerinden izole kanal; ağ ve firewall gerektirmez.Hyper-V Host’tan Sanal Makine (VM) yönetimi.
RPC Endpoint MapperTCP 135RPC tabanlı alt servisler ve eski entegrasyonlar.İşletim sistemi çekirdek servis iletişimi.
RPC Dinamik PortlarıTCP 49152 - 65535RPC oturumlarında dinamik tahsis edilen port aralığı.Özel RPC servis trafiği.

Not: Belirtilen portlar varsayılan değerlerdir. Kurumsal ağlarda sistem yöneticileri bu portları özelleştirebilir veya IP bazlı erişim listeleriyle (ACL) sınırlandırabilir.


4. Hızlı Donanım ve Sistem Envanteri Sorgulama (Temel CIM Sınıfları)

Sistem yöneticilerinin en sık ihtiyaç duyduğu donanım ve sistem bileşenlerini sorgulamak için kullanılan temel CIM sınıfları ve doğrudan çalıştırabileceğiniz hazır PowerShell komutları:

Bileşen / Kaynakİlgili CIM SınıfıHazır PowerShell Komutu
İşlemci (CPU)Win32_ProcessorGet-CimInstance Win32_Processor \| Select-Object Name, NumberOfCores, MaxClockSpeed
BIOS & Seri NoWin32_Bios(Get-CimInstance Win32_Bios).SerialNumber
Anakart ModeliWin32_BaseBoard(Get-CimInstance Win32_BaseBoard).Product
Fiziksel DisklerWin32_DiskDriveGet-CimInstance Win32_DiskDrive \| Select-Object Model, Size, MediaType
Bellek (RAM Toplamı)Win32_PhysicalMemory(Get-CimInstance Win32_PhysicalMemory \| Measure-Object Capacity -Sum).Sum / 1GB
İşletim SistemiWin32_OperatingSystemGet-CimInstance Win32_OperatingSystem \| Select-Object Caption, Version, OSArchitecture
Ekran Kartı (GPU)Win32_VideoControllerGet-CimInstance Win32_VideoController \| Select-Object Name, DriverVersion
Aktif IP YapılandırmasıWin32_NetworkAdapterConfigurationGet-CimInstance Win32_NetworkAdapterConfiguration -Filter "IPEnabled = True" \| Select-Object Description, IPAddress

5. Her Kavram ve Protokol İçin Hazır PowerShell Komutları

Rehberde adı geçen tüm protokol, servis ve kavramlar için sistem yöneticilerinin günlük işlerde doğrudan kullanabileceği komut örnekleri:

A. Bağlantı, Port ve Protokol Test Komutları (Troubleshooting)

1. WinRM ve WS-Management servisinin yanıt verip vermediğini test etme:

1
Test-WSMan -ComputerName "MUHASEBE-03"

2. WinRM HTTP (5985) portunun ağ üzerinden açık olduğunu doğrulama:

1
Test-NetConnection -ComputerName "MUHASEBE-03" -Port 5985

3. RPC Endpoint Mapper (135) port erişimini test etme:

1
Test-NetConnection -ComputerName "MUHASEBE-03" -Port 135

4. SMB (445) dosya paylaşım port erişimini test etme:

1
Test-NetConnection -ComputerName "MUHASEBE-03" -CommonTCPPort SMB

B. WinRM ve PSRemoting Oturum Yönetimi

5. Sunucuda WinRM ve PSRemoting servisini aktif edip güvenlik duvarını açma:

1
Enable-PSRemoting -Force

6. WinRM (Port 5985) üzerinden uzak makinede etkileşimli konsol açma:

1
Enter-PSSession -ComputerName "MUHASEBE-03"

7. PowerShell 7+ ile OpenSSH (Port 22) üzerinden etkileşimli konsol açma:

1
Enter-PSSession -HostName "MUHASEBE-03" -UserName "admin"

8. Kalıcı oturum (PSSession) açma ve SMB kapalıyken WinRM tünelinden dosya kopyalama:

1
2
3
$session = New-PSSession -ComputerName "MUHASEBE-03"
Copy-Item -Path "C:\LocalScript.ps1" -Destination "C:\Temp\" -ToSession $session
Remove-PSSession -Session $session

C. Uzaktan Komut ve Script Yürütme (Invoke-Command)

9. Uzak bilgisayarda en çok CPU kullanan ilk 10 işlemi listeleme:

1
2
3
Invoke-Command -ComputerName "MUHASEBE-03" -ScriptBlock { 
    Get-Process | Sort-Object -Property CPU -Descending | Select-Object -First 10 
}

10. Uzak bilgisayardaki bir servisi kontrol etme ve yeniden başlatma:

1
2
3
Invoke-Command -ComputerName "MUHASEBE-03" -ScriptBlock {
    Get-Service -Name "Spooler" | Restart-Service -Force -PassThru
}

11. Uzak sunucuda yüklü yazılımları güvenli Registry yoluyla listeleme:

1
2
3
4
5
6
Invoke-Command -ComputerName "MUHASEBE-03" -ScriptBlock {
    Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*,
                     HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
    Where-Object DisplayName |
    Select-Object DisplayName, DisplayVersion, Publisher, InstallDate
}

12. Uzak makinedeki aktif TCP ağ bağlantılarını çekme:

1
2
3
4
Invoke-Command -ComputerName "MUHASEBE-03" -ScriptBlock {
    Get-NetTCPConnection | Where-Object { $_.State -eq "Established" } | 
    Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess
}

D. CIM Oturumu ve Sistem Sorgulama (Get-CimInstance & Invoke-CimMethod)

13. Tekrarlayan sorgular için WinRM tabanlı kalıcı CIM Oturumu açma:

1
2
$cim = New-CimSession -ComputerName "MUHASEBE-03"
Get-CimInstance -CimSession $cim -ClassName Win32_OperatingSystem | Select-Object Caption, Version

14. WinRM kapalı sistemler için DCOM/RPC üzerinden CIM Oturumu açma:

1
2
3
$dcomOption = New-CimSessionOption -Protocol Dcom
$cimDcom = New-CimSession -ComputerName "MUHASEBE-03" -SessionOption $dcomOption
Get-CimInstance -CimSession $cimDcom -ClassName Win32_OperatingSystem

15. Uzak makinenin donanım ve üretici özetini çekme:

1
2
Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName "MUHASEBE-03" | 
    Select-Object Name, Manufacturer, Model, TotalPhysicalMemory, PrimaryOwnerName

16. Disk kullanım oranlarını ve boş alanları (GB) hesaplama:

1
2
3
4
Get-CimInstance -ClassName Win32_LogicalDisk -ComputerName "MUHASEBE-03" -Filter "DriveType=3" |
    Select-Object DeviceID, 
                  @{Name="Size(GB)";Expression={[math]::Round($_.Size/1GB,2)}}, 
                  @{Name="FreeSpace(GB)";Expression={[math]::Round($_.FreeSpace/1GB,2)}}

17. Yerel kullanıcı hesaplarını listeleme:

1
2
Get-CimInstance -ClassName Win32_UserAccount -ComputerName "MUHASEBE-03" | 
    Select-Object Name, Caption, AccountType, Disabled, PasswordRequired

18. Uzak bilgisayarda açık olan kullanıcı oturumunu zorla sonlandırma (Method Call):

1
Invoke-CimMethod -ClassName Win32_OperatingSystem -MethodName Win32Shutdown -Arguments @{Flags = 4} -ComputerName "MUHASEBE-03"

E. Olay Günlükleri ve SMB Dosya Yönetimi

19. Sistem Olay Günlüğünden son 50 kaydı hızlıca çekme (Get-WinEvent):

1
2
Get-WinEvent -FilterHashtable @{LogName='System'} -MaxEvents 50 -ComputerName "MUHASEBE-03" | 
    Select-Object TimeCreated, Id, LevelDisplayName, Message

20. Güvenlik günlüğünden başarılı kullanıcı oturum açma (Event ID 4624) kayıtlarını süzme:

1
2
3
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4624; StartTime=(Get-Date).AddDays(-7)} |
    Where-Object { $_.Properties[5].Value -eq 'ahmet.yilmaz' } |
    Select-Object TimeCreated, Id, Message

21. SMB (Port 445) üzerinden uzak bilgisayara dosya ve veri yazma:

1
2
3
$remotePath = "\\MUHASEBE-03\C$\Temp\config.json"
$configData = @{ Environment = "Production"; Version = "1.2.0"; UpdatedBy = "Admin" } | ConvertTo-Json
Set-Content -Path $remotePath -Value $configData

F. Toplu Sunucu Yönetimi ve Performans Optimizasyonu (Scale & Performance)

22. Yüzlerce sunucuya paralel komut gönderme ve iş parçacığı havuzunu sınırlama (-ThrottleLimit):

1
2
3
4
5
# Bir metin dosyasındaki sunucu listesini okuyup aynı anda en fazla 30 iş parçacığı ile komut yürütme
$servers = Get-Content -Path "C:\Admins\ServerList.txt"
Invoke-Command -ComputerName $servers -ThrottleLimit 30 -ScriptBlock {
    Get-Service -Name "wuauserv" | Select-Object Status, StartType
}

23. Uzun süren uzaktan yönetim görevlerini arka plan işine (-AsJob) devretme:

1
2
3
4
5
6
7
8
9
# Uzak sunucuda arka planda komut başlatma (konsolu kilitlemez)
$job = Invoke-Command -ComputerName "MUHASEBE-03" -ScriptBlock {
    Start-Sleep -Seconds 60
    Get-Volume
} -AsJob -JobName "DiskKontrolGorevi"

# Arka plan işlerinin durumunu kontrol etme ve çıktıyı alma
Get-Job -Name "DiskKontrolGorevi"
Receive-Job -Name "DiskKontrolGorevi" -Keep

24. PowerShell 7+ ile ForEach-Object -Parallel kullanarak çok çekirdekli CIM sorgusu:

1
2
3
4
5
6
7
8
9
10
# Yerel işlemci çekirdeklerini kullanarak çoklu CIM sorgularını paralel koşturma
$servers = @("SUNUCU-01", "SUNUCU-02", "SUNUCU-03", "SUNUCU-04")
$servers | ForEach-Object -Parallel {
    $os = Get-CimInstance -ComputerName $_ -ClassName Win32_OperatingSystem
    [PSCustomObject]@{
        Server = $_
        OS     = $os.Caption
        Uptime = (Get-Date) - $os.LastBootUpTime
    }
} -ThrottleLimit 10

G. Oturum Sürekliliği (Disconnected Sessions) ve Kaynak Kotaları

25. Uzak sunucuda çalışan oturumu bağlantıyı keserek (Disconnect) açık bırakma:

1
2
3
# Uzun sürecek bir işlem başlatıp oturumu arka planda çalışmaya bırakarak bağlantıyı koparma
$session = New-PSSession -ComputerName "MUHASEBE-03" -Name "YedeklemeOturumu"
Invoke-Command -Session $session -ScriptBlock { Start-Process -FilePath "C:\backup.bat" -Wait } -InDisconnectedSession

26. Kesilmiş (Disconnected) oturuma başka bir bilgisayardan yeniden bağlanma:

1
2
3
# Uzak makinedeki açık/bekleyen oturumları sorgulama ve kaldığı yerden bağlanma
Get-PSSession -ComputerName "MUHASEBE-03"
Connect-PSSession -ComputerName "MUHASEBE-03" -Name "YedeklemeOturumu"

27. WinRM oturum başı bellek limitini (MaxMemoryPerShellMB) artırma:

1
2
3
# Büyük veri sorgularında "Bellek yetersiz" hatasını önlemek için 1024 MB sınırını 2048 MB'a yükseltme
Set-Item -Path "WSMan:\localhost\Shell\MaxMemoryPerShellMB" -Value 2048
Restart-Service -Name WinRM

H. Sanallaştırma ve Konteyner Yönetimi (PowerShell Direct & Container)

28. Hyper-V Sanal Makinesine IP ve ağ kartı olmadan doğrudan erişme (PowerShell Direct):

1
2
# Ağ katmanını ve güvenlik duvarını tamamen atlayarak Hyper-V VMBus üzerinden VM içine bağlanma
Enter-PSSession -VMName "Database-VM" -Credential (Get-Credential)

29. Windows Container veya Docker içerisine PowerShell ile doğrudan bağlanma:

1
2
# Belirli bir konteyner ID'si üzerinden doğrudan izole ortama girme
Enter-PSSession -ContainerId "c1a2b3c4d5e6" -RunAsAdministrator

I. Çapraz Platform ve OpenSSH ile Güvenli Bağlantı (PowerShell 7+)

30. SSH anahtarı (Key-based) kullanarak Linux veya Windows sunucuda PSRemoting oturumu açma:

1
2
# Parola girmeden Ed25519 özel anahtarı ile güvenli SSH Remoting konsolu başlatma
Enter-PSSession -HostName "192.168.1.100" -UserName "sysadmin" -KeyFilePath "~/.ssh/id_ed25519"

31. SSH üzerinden uzak sunucuda tek satırda script bloğu çalıştırma:

1
2
3
Invoke-Command -HostName "192.168.1.100" -UserName "sysadmin" -KeyFilePath "~/.ssh/id_ed25519" -ScriptBlock {
    uname -a; uptime
}

6. Sahadan Gerçek Dünya Senaryoları ve İleri Düzey Çözümler

6.1. “Double-Hop” (Çift Sıçrama) Problemi ve Çözümü

Sistem yöneticilerinin uzaktan yönetim yaparken en sık karşılaştığı kısıtlama Double-Hop sorunudur.

  • Sorun Nedir? Bilgisayarınızdan Sunucu-A‘ya WinRM ile bağlandığınızda kimliğiniz Kerberos ile doğrulanır. Ancak Sunucu-A üzerindeyken Sunucu-B‘deki bir dosya paylaşımına (\\Sunucu-B\Yedek) veya SQL veritabanına erişmeye çalıştığınızda varsayılan olarak Access is Denied hatası alırsınız. Çünkü Kerberos varsayılan güvenlik kuralı gereği kimlik bilginizi ikinci bir uzak noktaya otomatik olarak devretmez.
  • Çözüm 1: CredSSP (Credential Security Support Provider) Kullanımı: İstemci ve hedef sunucu üzerinde CredSSP devredilmesini etkinleştirerek kimlik bilgilerinin ikinci sıçramaya aktarılması sağlanır:
1
2
3
4
5
6
7
8
9
10
# 1. İstemci bilgisayarda CredSSP istemci rolünü ve hedef sunucu desenini onaylama:
Enable-WSManCredSSP -Role Client -DelegateComputer "*.sirket.local" -Force

# 2. Hedef sunucuda (Sunucu-A) CredSSP sunucu rolünü aktif etme:
Enable-WSManCredSSP -Role Server -Force

# 3. İstemciden CredSSP kimlik doğrulaması ile komut yürütme:
Invoke-Command -ComputerName "Sunucu-A.sirket.local" -Authentication CredSSP -Credential (Get-Credential) -ScriptBlock {
    Get-ChildItem -Path "\\Sunucu-B.sirket.local\Yedek"
}
  • Çözüm 2: Modern Yaklaşım (RBCD): Kurumsal Active Directory ortamlarında CredSSP yerine Kaynak Tabanlı Kısıtlı Yetkilendirme (Resource-Based Constrained Delegation - RBCD) yapılandırılarak kimlik bilgileri istemciden hedef sunucuya açık metin taşınmadan güvenli delegasyon sağlanır.

6.2. Domain Dışı (Workgroup) Sunucuların Yönetimi ve TrustedHosts

Active Directory olmayan veya farklı bağımsız çalışma gruplarındaki (Workgroup) sunuculara WinRM ile bağlanırken Kerberos karşılıklı güveni bulunmadığı için bağlantı reddedilir.

  • Çözüm: İstemci makinenin WinRM yapılandırmasındaki TrustedHosts listesine hedef IP veya isimlerin eklenmesi gerekir:
1
2
3
4
5
6
7
8
# 1. İstemci makinede TrustedHosts listesine uzak sunucunun IP adresini ekleme:
Set-Item -Path "WSMan:\localhost\Client\TrustedHosts" -Value "192.168.1.50,192.168.1.51" -Concatenate -Force

# 2. Güncel güvenilen host listesini kontrol etme:
Get-Item -Path "WSMan:\localhost\Client\TrustedHosts"

# 3. Workgroup ortamında yerel kullanıcı kimliği ile oturum açma:
Enter-PSSession -ComputerName "192.168.1.50" -Credential (Get-Credential)

Güvenlik Notu: TrustedHosts değerine asla genel ağlarda * (yıldız) atamayın. Yalnızca yönetmek istediğiniz spesifik IP adreslerini veya FQDN isimlerini virgülle ayırarak ekleyin.


6.3. DMZ ve Güvensiz Ağlar İçin WinRM HTTPS (Port 5986) Listener Kurulumu

Firewall arkasında, DMZ bölgesinde veya genel ağ üzerinden yönetilecek sunucularda HTTP (Port 5985) yerine TLS/SSL sertifikalı HTTPS dinleyicisi kurulmalıdır:

1
2
3
4
5
6
7
8
9
10
11
# 1. Sunucu üzerinde geçerli bir Server Authentication sertifikası oluşturma (veya CA sertifikası alma):
$cert = New-SelfSignedCertificate -DnsName "sunucu.sirket.com" -CertStoreLocation "Cert:\LocalMachine\My"

# 2. Sertifika parmak izini kullanarak HTTPS dinleyicisini (TCP 5986) tanımlama:
New-Item -Path WSMan:\LocalHost\Listener -Transport HTTPS -Address * -CertificateThumbprint $cert.Thumbprint -Force

# 3. Güvenlik duvarında 5986 portuna izin verme:
New-NetFirewallRule -DisplayName "WinRM HTTPS Port 5986" -Direction Inbound -LocalPort 5986 -Protocol TCP -Action Allow

# 4. İstemciden HTTPS protokolü üzerinden güvenle bağlanma:
Enter-PSSession -ComputerName "sunucu.sirket.com" -UseSSL -Credential (Get-Credential)

6.4. JEA (Just Enough Administration) ile Sıfır Güven (Zero Trust) Yönetimi

Klasik sistem yönetiminde destek uzmanlarına sunucu üzerinde tam “Local Administrator” yetkisi vermek büyük bir güvenlik açığıdır. JEA, kullanıcıya yalnızca işini yapmaya yetecek kadar yetki verir.

  • Çalışma Mantığı:
    1. Role Capability (.psrc): Kullanıcının çalıştırabileceği cmdlet’ler ve parametreler filtrelenir (Örn: Sadece Restart-Service -Name Spooler serbest, Stop-Service yasak).
    2. Session Configuration (.pssc): Bu rolün hangi Active Directory grubuna atanacağı ve arka planda hangi sanal yüksek yetkili hesapla çalıştırılacağı tanımlanır.
1
2
3
4
5
# 1. Sunucu tarafında hazırlanan JEA yapılandırma dosyasını (.pssc) uç nokta olarak kaydetme:
Register-PSSessionConfiguration -Name "ServisYonetimUcu" -Path "C:\JEA\ServisYonetimi.pssc" -Force

# 2. Yetkilendirilmiş kullanıcının kısıtlı JEA uç noktasına bağlanması:
Enter-PSSession -ComputerName "MUHASEBE-03" -ConfigurationName "ServisYonetimUcu"

Bu oturumda kullanıcı Get-Process veya yetkisi dışındaki herhangi bir komutu çalıştırmayı denediğinde komut sistem tarafından tanınmaz ve engellenir.


6.5. Güvenlik Denetimi: Script Block Logging ve Transcription

Kurumsal ortamlarda uzaktan çalıştırılan tüm betiklerin denetlenmesi ve SIEM sistemlerine aktarılması siber güvenlik standardıdır.

  • Script Block Logging (Olay ID 4104): PowerShell motorunun bellekte derlediği ve yürüttüğü her komut bloğu doğrudan Microsoft-Windows-PowerShell/Operational günlüğüne kaydedilir. Gizlenmiş (obfuscated) saldırı kodları bile çözüldükten sonra ham haliyle yakalanır.
  • PowerShell Transcription: Oturum boyunca ekrana gelen ve girilen her karakterin belirlenen merkezi bir ağ paylaşımına .txt dosyası olarak kaydedilmesini sağlar.
1
2
3
4
5
6
7
8
9
10
# 1. Script Block Logging (Olay ID 4104) özelliğini Kayıt Defteri üzerinden aktif etme:
$logPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging"
if (-not (Test-Path $logPath)) { New-Item -Path $logPath -Force }
Set-ItemProperty -Path $logPath -Name "EnableScriptBlockLogging" -Value 1 -Type DWord

# 2. Transcription (Tüm konsol trafiğini merkezi bir paylaşıma metin olarak kaydetme):
$transPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription"
if (-not (Test-Path $transPath)) { New-Item -Path $transPath -Force }
Set-ItemProperty -Path $transPath -Name "EnableTranscripting" -Value 1 -Type DWord
Set-ItemProperty -Path $transPath -Name "OutputDirectory" -Value "\\LogServer\PSTranscripts" -Type String

7. Hızlı Sorun Giderme: En Sık Karşılaşılan WinRM Hataları ve Teşhis Rehberi

Uzak yönetim sırasında bir hata ile karşılaşıldığında sorunun ağdan mı, kimlik doğrulamasından mı yoksa servis yapılandırmasından mı kaynaklandığını tespit etmek için aşağıdaki tablodan yararlanabilirsiniz:

Karşılaşılan Hata / BelirtiTemel NedenÇözüm Adımı
0x803380E4 (WSMAN_STATUS_TIMEDOUT)Sunucuya ulaşılamıyor veya Firewall 5985 portunu engelliyor.Test-NetConnection -ComputerName HEDEF -Port 5985 ile portu test edin; sunucuda Enable-PSRemoting -Force çalıştırın.
0x8009030E / Access is DeniedKimlik doğrulama reddedildi veya Workgroup ortamında Kerberos arandı.Domain ortamında FQDN kullanın; Workgroup ise istemcide IP’yi TrustedHosts listesine ekleyin.
Connecting to remote server failed (Client cannot connect)WinRM servisi durmuş veya dinleyici (listener) silinmiş.Sunucuda winrm quickconfig çalıştırarak dinleyicileri yeniden oluşturun ve servisi başlatın.
MaxMemoryPerShellMB quota exceededOturum için ayrılan RAM limiti aşıldı.Set-Item WSMan:\localhost\Shell\MaxMemoryPerShellMB -Value 2048 ile kotayı artırın.
The SSL connection cannot be established5986 HTTPS sertifikasının adı sunucu adı ile uyuşmuyor veya geçersiz.Sertifikanın CN/SAN adını kontrol edin; istemcide CA kök sertifikasının yüklü olduğunu doğrulayın.

WinRM Servis Teşhis ve Doğrulama Komutları

Sunucu tarafındaki WinRM altyapısını yerel olarak doğrulamak için komut satırından çalıştırabileceğiniz temel araçlar:

1
2
3
4
5
6
7
8
# 1. Aktif dinleyicileri (HTTP 5985 / HTTPS 5986) listeleme:
winrm enumerate winrm/config/listener

# 2. Tüm WinRM istemci ve servis ayarlarını dökme:
winrm get winrm/config

# 3. Uzak sunucunun WS-Management kimliğini ve sürümünü test etme:
winrm id -r:MUHASEBE-03

8. Sistem Yöneticileri İçin 10 Altın Kural

  1. CIM Standartlarını Kullanın: Tüm envanter ve veri çekme operasyonlarınızda doğrudan Get-CimInstance kullanın. WinRM üzerinden çalıştığı için modern güvenlik duvarlarından kolayca geçer ve yüksek performans sunar.
  2. Yazılım Envanterinde Registry’i Tercih Edin: Canlı sistemlerde yazılım listesi toplarken sunucu performansını korumak için doğrudan Kayıt Defteri (Uninstall) yollarını sorgulayın.
  3. WinRM Şifreleme Mekanizmasını Bilin: Port 5985 (HTTP) adından dolayı şifresiz sanılsa da Active Directory ortamında Kerberos/NTLM ile paket yükü AES-256 ile şifrelenir. DMZ ve Workgroup ağlarında ise Port 5986 (HTTPS) veya OpenSSH (Port 22) tercih edin.
  4. Ağ Portlarını Sıkılaştırın: WinRM altyapısına geçildiğinde, güvenlik duvarında geniş dinamik RPC port aralıklarını (TCP 49152-65535) açık tutma zorunluluğu ortadan kalkar; sadece gerekli yönetim portlarını açarak saldırı yüzeyini daraltın.
  5. Protokolleri Görevine Göre Ayırın: Dosya ve paylaşım erişimlerinde SMB (Port 445), oturum açma ve uzaktan komut yürütmede WinRM/PSRemoting (Port 5985/5986), veri sorgulamada ise CIM sınıflarını kullanın.
  6. Toplu Yönetimde ThrottleLimit Tanımlayın: 50’den fazla sunucuya aynı anda komut gönderirken ağın ve yerel makinenin tıkanmaması için -ThrottleLimit parametresiyle iş parçacığı havuzunu kontrol altında tutun.
  7. Uzun Süren Görevleri Arka Plana Devredin: Saatler süren yedekleme veya analiz scriptlerinde konsolunuzun kilitlenmemesi için -AsJob veya Disconnect-PSSession kullanın.
  8. Double-Hop Çözümünde Güvenliği Elden Bırakmayın: CredSSP kullanırken yetki devrini genel desenler (*) yerine sadece belirli hedef sunucularla (*.sirket.local) sınırlandırın; mümkünse modern RBCD yaklaşımını tercih edin.
  9. En Az Yetki (Least Privilege) ve JEA Uygulayın: Sunucu üzerinde rutin görevleri yürüten ekiplere yerel yönetici şifresi vermek yerine, sadece izin verilen komutları çalıştırabilecekleri JEA uç noktaları sağlayın.
  10. Tüm Yönetimsel Aktiviteleri Kayıt Altına Alın: Kurumsal sunucularda Script Block Logging (Olay 4104) ve Transcription özelliklerini grup ilkesi (GPO) ile aktif ederek tüm uzaktan yürütülen işlemleri denetlenebilir kılın.

Umarım faydalı bir başvuru kaynağı olmuştur. Sorularınızı ve katkılarınızı yorumlarda paylaşabilirsiniz!

This post is licensed under CC BY 4.0 by the author.