· 6 dk okuma

Windows Server RDP Güvenliği: Port, NLA, Kilitleme, Firewall

Windows Server VDS'te RDP güvenliği için beş şeyi birlikte uygulamalısın: NLA'yı zorunlu kılmak, hesap kilitleme politikası tanımlamak, varsayılan Administrator hesabından kurtulmak, başarısız girişleri otomatik engellemek ve 3389/RDP portuna yalnızca izinli IP'lerden erişim vermek. Port değiştirmek tek başına koruma sağlamaz; ama yukarıdaki katmanlarla birlikte log gürültüsünü ciddi biçimde azaltır. Aşağıda hepsini PowerShell komutlarıyla, sırasıyla ve kendini dışarıda bırakmayacak şekilde anlatıyoruz.

İnternete açık bir Windows sunucusunun RDP portu, yayına girdikten dakikalar sonra taranmaya başlar. Güvenlik olay günlüğünde saniyede birkaç başarısız giriş görmen normaldir. Amaç, bu denemelerin başarılı olma ihtimalini sıfıra yakın tutmak ve sunucunun kaynaklarını bu gürültüyle harcatmamaktır.

Önemli: Aşağıdaki değişiklikleri yaparken mevcut RDP oturumunu kapatma. Her adımda yeni bir oturumla test et. Konsol/VNC gibi bir alternatif erişim yolun varsa önceden doğru çalıştığını kontrol et.

1. Önce temel: güncelleme ve güçlü parola

RDP'yi sıkılaştırmadan önce sistemin yamalı olduğundan emin ol. BlueKeep (CVE-2019-0708) gibi RDP açıkları kimlik doğrulamadan önce istismar edilebildiği için hiçbir parola politikası bunlara karşı koruma sağlamaz. Güncel Windows Server 2019/2022/2025 sürümlerinde bu açıklar kapalıdır; yine de Windows Update'i düzenli çalıştır.

Parola için en az 14 karakter ve rastgele üretilmiş bir değer kullan. Kurulum sonrası genel ayarlar için ayrıca Windows Server VDS kurulumu rehberimize göz atabilirsin.

2. Network Level Authentication (NLA)

NLA, oturum açılmadan önce kullanıcıyı kimlik doğrulatır. Böylece saldırgan, sunucuda masaüstü oturumu kaynağı tüketemeden elenir. Modern Windows Server sürümlerinde varsayılan olarak açıktır, ama doğrulamak ve TLS'i zorunlu kılmak iyi bir alışkanlıktır:

$k = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
Set-ItemProperty -Path $k -Name UserAuthentication -Value 1
Set-ItemProperty -Path $k -Name SecurityLayer -Value 2
Set-ItemProperty -Path $k -Name MinEncryptionLevel -Value 3

Değerleri kontrol etmek için Get-ItemProperty $k | Select UserAuthentication, SecurityLayer yeterli. Eski istemcilerden (ör. Windows XP) bağlanamama sorunu yaşarsan bu NLA'nın etkisidir; çözüm istemciyi güncellemektir, NLA'yı kapatmak değil.

3. Varsayılan Administrator hesabından kurtul

Saldırı denemelerinin neredeyse tamamı Administrator kullanıcı adını hedefler. Yeni bir yönetici hesabı oluştur, test et, sonra varsayılanı devre dışı bırak:

$p = Read-Host -AsSecureString "Yeni parola"
New-LocalUser -Name "sysops01" -Password $p -PasswordNeverExpires
Add-LocalGroupMember -Group "Administrators" -Member "sysops01"
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "sysops01"

Yeni hesapla RDP oturumu açabildiğini doğruladıktan sonra:

Disable-LocalUser -Name "Administrator"

Not: Yerel dil Türkçe ise grup adları "Administrators" yerine yerelleştirilmiş görünebilir (ör. "Yöneticiler"). Hata alırsan Get-LocalGroup çıktısındaki adları kullan.

4. Hesap kilitleme politikası

Kilitleme eşiği, tek bir hesaba yönelik parola tahminini yavaşlatır. Yerel politika için:

net accounts /lockoutthreshold:5 /lockoutduration:15 /lockoutwindow:15
net accounts

Bu ayar, 15 dakika içinde 5 başarısız denemeden sonra hesabı 15 dakika kilitler. Dikkat edilecek noktalar:

5. Güvenlik duvarı: RDP'yi sadece izinli IP'lere aç

En etkili tek adım budur. RDP'ye yalnızca ofis, VPN çıkış IP'si veya bastion sunucundan erişilecekse, geri kalan tüm internet için port kapalı olmalıdır. Örnek olarak izinli adresler 203.0.113.10 ve 198.51.100.0/24 olsun.

Önce yeni portu (bölüm 7'deki port değişikliğini yapacaksan) ve izinli kaynakları tanımlayan kuralı ekle:

New-NetFirewallRule -DisplayName "RDP-Izinli-TCP" -Direction Inbound -Protocol TCP `
  -LocalPort 3389 -RemoteAddress 203.0.113.10,198.51.100.0/24 -Action Allow -Profile Any
New-NetFirewallRule -DisplayName "RDP-Izinli-UDP" -Direction Inbound -Protocol UDP `
  -LocalPort 3389 -RemoteAddress 203.0.113.10,198.51.100.0/24 -Action Allow -Profile Any

Yeni bir RDP oturumuyla bu kuralın çalıştığını doğruladıktan sonra, herkese açık varsayılan kuralları kapat:

Get-NetFirewallRule -DisplayName "Remote Desktop*" | Disable-NetFirewallRule

Türkçe sürümlerde kural adları "Uzak Masaüstü" şeklinde olabilir; Get-NetFirewallRule | Where DisplayName -like "*Masa*" ile kontrol et. Önce Get-NetFirewallRule -DisplayName "..." | Format-Table DisplayName, Enabled ile hangi kuralları kapatacağını gör.

Statik IP'n yoksa RDP'yi doğrudan açmak yerine bir VPN arkasına almak daha sağlıklıdır: sunucuda RDP'ye yalnızca VPN alt ağından izin verirsin. Bu amaçla VPN servisleri veya kendi kurduğun bir WireGuard sunucusu kullanılabilir.

6. Brute-force engelleme: başarısız girişlere göre otomatik IP bloklama

Olay günlüğünde başarısız girişler Event ID 4625 olarak kaydedilir. NLA açıkken logon type genellikle 3, klasik RDP'de 10 görünür. Kaynak IP IpAddress alanındadır. Aşağıdaki betik son 10 dakikada 5 veya daha fazla hata üreten IP'leri bir güvenlik duvarı engelleme kuralına ekler. C:\Scripts\rdp-block.ps1 olarak kaydet:

$esik   = 5
$beyaz  = @('203.0.113.10')
$kural  = 'RDP-Brute-Block'
$baslangic = (Get-Date).AddMinutes(-10)

$olaylar = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=$baslangic} -ErrorAction SilentlyContinue
if (-not $olaylar) { return }

$ipler = $olaylar | ForEach-Object {
    $x = [xml]$_.ToXml()
    ($x.Event.EventData.Data | Where-Object Name -eq 'IpAddress').'#text'
} | Where-Object { $_ -and $_ -ne '-' -and $_ -notin $beyaz } |
    Group-Object | Where-Object Count -ge $esik | ForEach-Object Name

if (-not $ipler) { return }

$r = Get-NetFirewallRule -DisplayName $kural -ErrorAction SilentlyContinue
$mevcut = @()
if ($r) { $mevcut = @(($r | Get-NetFirewallAddressFilter).RemoteAddress) }
$hepsi = @($mevcut + $ipler) | Where-Object { $_ -and $_ -ne 'Any' } | Sort-Object -Unique

if ($r) { Set-NetFirewallRule -DisplayName $kural -RemoteAddress $hepsi }
else    { New-NetFirewallRule -DisplayName $kural -Direction Inbound -Action Block -RemoteAddress $hepsi -Protocol TCP }

Windows Güvenlik Duvarı'nda engelleme kuralı, izin kuralından önceliklidir; dolayısıyla listeye giren IP, izinli bir aralıkta bile olsa bağlanamaz. Bu yüzden kendi IP'lerini $beyaz listesine eklemeyi unutma. Betiği her 5 dakikada bir çalıştır:

$a = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument '-NoProfile -ExecutionPolicy Bypass -File C:\Scripts\rdp-block.ps1'
$t = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName 'RDP-Block' -Action $a -Trigger $t -User 'SYSTEM' -RunLevel Highest

Engellenen IP'ler birikir, listeyi ara sıra temizlemek isteyebilirsin. Daha gelişmiş (otomatik süre sonu, çoklu servis) çözümler için IPBan gibi açık kaynak araçlar ya da ticari alternatifler de kullanılabilir; ancak yukarıdaki betik ek yazılım gerektirmeden temel ihtiyacı karşılar.

7. RDP portunu değiştirme

Port değiştirmek bir güvenlik önlemi değil, gürültü azaltma yöntemidir; bir port taraması yeni portu da bulur. Yine de otomatik botların büyük bölümünü eler. Sıralama kritik: önce güvenlik duvarı kuralı, sonra port değişikliği.

$port = 33890
New-NetFirewallRule -DisplayName "RDP-Yeni-TCP" -Direction Inbound -Protocol TCP -LocalPort $port `
  -RemoteAddress 203.0.113.10,198.51.100.0/24 -Action Allow
New-NetFirewallRule -DisplayName "RDP-Yeni-UDP" -Direction Inbound -Protocol UDP -LocalPort $port `
  -RemoteAddress 203.0.113.10,198.51.100.0/24 -Action Allow

Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' `
  -Name PortNumber -Value $port
Restart-Service TermService -Force

Servis yeniden başlatılınca mevcut oturum düşer. Yeniden bağlanırken 203.0.113.10:33890 biçimini kullan. Port değişikliğinden sonra bölüm 5'teki eski 3389 kurallarını silip bölüm 6'daki engelleme kuralının -LocalPort ile yeni portu hedeflemesini istiyorsan kuralı buna göre uyarlayabilirsin (alternatif olarak kuralı portsuz bırakıp tüm TCP trafiği için kullanabilirsin). Dinlemeyi doğrulamak için:

netstat -an | findstr 33890

Yaygın hatalar ve çözümleri

Sorun Neden Çözüm
Port değiştirdim, bağlanamıyorum Güvenlik duvarı kuralı yeni portu içermiyor Konsol erişimiyle kural ekle; her zaman önce kural
Kendi hesabım kilitlendi Eşik çok düşük veya botlar aynı kullanıcıyı denedi net accounts ile eşiği 5-10 yap, net user kullanıcı /active:yes yerine hesabı kilit açma yetkisiyle aç
Kendi IP'm engellendi Beyaz liste yok Betikte $beyaz listesine ekle, kuraldan sil
NLA hatası: "kimlik doğrulama hatası" İstemci eski veya sunucu saati/domain sorunu İstemciyi güncelle, saat senkronunu kontrol et
Betik 4625 bulamıyor Denetim politikası kapalı auditpol /set /subcategory:"{0CCE9215-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable

RDP ve DDoS: farklı katmanlar

Bu rehberdeki önlemler kimlik doğrulama katmanını korur. Port'a yönelik hacimsel bir saldırı (UDP/TCP flood) ise ağ seviyesinde filtrelenmelidir; Windows güvenlik duvarı bant genişliği dolduğunda yardımcı olamaz. Kritik iş yükleri için sunucunun bulunduğu ağda DDoS koruma ve firewall çözümü olması gerekir.

Kontrol listesi

  1. Windows Update güncel.
  2. NLA + TLS zorunlu.
  3. Varsayılan Administrator devre dışı, yeni ad ve güçlü parola.
  4. Kilitleme eşiği 5-10.
  5. RDP yalnızca izinli IP veya VPN'den erişilebilir.
  6. 4625 tabanlı otomatik engelleme çalışıyor.
  7. (İsteğe bağlı) Port özel bir değere taşındı.
  8. Başarılı giriş (4624) olayları periyodik gözden geçiriliyor.

Bu sekiz madde tamamlandığında, internete açık bir Windows Server VDS'in RDP yüzeyi, varsayılan kuruluma göre çok daha dar ve izlenebilir hale gelir.

Sık sorulan sorular

RDP portunu değiştirmek güvenli midir?

Tek başına değildir. Port değiştirmek otomatik botların büyük kısmını eler ve log gürültüsünü azaltır, ancak port taramasıyla yeni port bulunabilir. NLA, güçlü parola, hesap kilitleme ve IP kısıtlamasıyla birlikte kullanılmalıdır.

NLA nedir, açık olması gerekir mi?

Network Level Authentication, oturum açılmadan önce kullanıcıyı doğrular. Kimliği doğrulanmayan bağlantı masaüstü kaynağı tüketemez. Modern Windows Server sürümlerinde varsayılan olarak açıktır ve açık kalmalıdır.

RDP brute-force saldırılarını nasıl tespit ederim?

Güvenlik olay günlüğünde Event ID 4625 (başarısız oturum açma) kayıtlarına bakın. IpAddress alanı kaynak IP'yi verir. Kısa sürede çok sayıda 4625 gören IP'leri güvenlik duvarında engelleyen bir PowerShell betiği veya IPBan gibi araç kullanabilirsiniz.

RDP'yi tamamen internete kapatabilir miyim?

Evet, ve en güvenli yöntem budur. RDP'ye yalnızca VPN alt ağından veya belirli statik IP'lerden izin verin; güvenlik duvarında geri kalan tüm kaynakları engelleyin. Yeni kuralı mutlaka ayrı bir oturumla test ettikten sonra eskileri kapatın.

Windows Server VDS'ini Nixcon ağında güvenle çalıştır.İncele