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
UserAuthentication = 1: NLA zorunlu.SecurityLayer = 2: TLS 1.x tabanlı güvenlik katmanı (eski "RDP Security Layer" kullanılmaz).MinEncryptionLevel = 3: yüksek şifreleme seviyesi.
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:
- Çok düşük eşik (2-3), saldırganın bilinen bir kullanıcı adını sürekli kilitleyerek seni dışarıda bırakmasına (hesap kilitleme DoS'u) yol açabilir. 5-10 makul bir aralıktır.
- Bu politika yalnızca belirli bir kullanıcıyı korur; farklı kullanıcı adlarıyla yapılan "password spraying" saldırısını tek başına durdurmaz. Bu yüzden IP bazlı engelleme (bölüm 6) gerekir.
- Etki alanı (domain) ortamında politika GPO ile yönetilir; yerel ayar ezilebilir.
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
- Windows Update güncel.
- NLA + TLS zorunlu.
- Varsayılan Administrator devre dışı, yeni ad ve güçlü parola.
- Kilitleme eşiği 5-10.
- RDP yalnızca izinli IP veya VPN'den erişilebilir.
- 4625 tabanlı otomatik engelleme çalışıyor.
- (İsteğe bağlı) Port özel bir değere taşındı.
- 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.