Bir sabah işe geldiğinizde sunucunuzun Event Log’larında binlerce başarısız RDP giriş denemesi gördüğünüzü hayal edin. Administrator hesabına dakikada 50-60 farklı IP’den kaba kuvvet saldırısı geliyor, sunucu yavaşlamış ve siz panikle ne yapacağınızı düşünüyorsunuz. Bu senaryo maalesef günlük hayatta çok sık yaşanıyor. RDP (Remote Desktop Protocol), Windows sunucu yönetiminin vazgeçilmezi ama aynı zamanda en çok hedef alınan servislerden biri. Bu yazıda RDP güvenliğini katman katman nasıl sağlayacağınızı, gerçek saldırı senaryolarına karşı ne yapmanız gerektiğini ve production ortamında test edilmiş yöntemleri detaylıca ele alacağız.
RDP Saldırılarını Anlamak
RDP varsayılan olarak 3389 portunda dinleme yapar ve internet üzerinden erişilebilir durumdaysa dakikalar içinde tarama araçlarının radarına girer. Shodan gibi arama motorlarında “port:3389” yazarak saniyeler içinde milyonlarca açık RDP sunucusu listelenebilir. Saldırganlar bu listeyi kullanarak otomatize araçlarla kaba kuvvet saldırısı başlatır.
En yaygın RDP saldırı türleri şunlardır:
- Brute Force Saldırıları: Administrator, admin, user gibi yaygın kullanıcı adlarına sözlük tabanlı parola denemeleri
- Credential Stuffing: Daha önce sızdırılmış kullanıcı adı/parola kombinasyonlarının denenmesi
- BlueKeep ve DejaBlue: CVE-2019-0708 gibi RDP protokol açıklarını kullanan exploit saldırıları
- Man-in-the-Middle: Şifrelenmemiş veya zayıf sertifikalı RDP bağlantılarının dinlenmesi
- Pass-the-Hash: NTLM hash’lerini kullanarak kimlik doğrulama bypass etme girişimleri
Gerçek bir örnek vermek gerekirse, 2023 yılında küçük bir muhasebe firmasının sunucusu tam olarak bu şekilde ele geçirildi. Varsayılan portta açık RDP, zayıf Administrator parolası ve güncellenmeyen Windows Server 2012 R2 kombinasyonu fidye yazılımı saldırısıyla sonuçlandı. Önlemler basitti ama uygulanmamıştı.
Temel Güvenlik Adımı: RDP Portunu Değiştirme
İlk ve en kolay adım varsayılan portu değiştirmek. Bu tek başına yeterli değil ama otomatik tarama araçlarının büyük çoğunluğunu eleyecektir. Registry üzerinden yapılır:
# Registry ile RDP portunu değiştirme (PowerShell olarak çalıştırın)
$portNumber = 33890
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" -Name "PortNumber" -Value $portNumber
# Windows Firewall'da yeni portu açma
New-NetFirewallRule -DisplayName "RDP Custom Port" -Direction Inbound -Protocol TCP -LocalPort $portNumber -Action Allow
# Eski 3389 portunu firewall'dan kaldırma
Remove-NetFirewallRule -DisplayName "Remote Desktop - User Mode (TCP-In)"
# Servisi yeniden başlatma
Restart-Service -Name "TermService" -Force
Port değişikliğinin ardından bağlantıyı mstsc /v:sunucu_ip:33890 şeklinde yapmanız gerektiğini unutmayın. Ayrıca bu değişikliği tüm ekiple paylaşın, yoksa kendinizi kilitlersiniz.
Windows Firewall ile IP Kısıtlaması
En etkili yöntemlerden biri RDP erişimini sadece belirli IP adresleriyle sınırlamak. Eğer sabit bir ofis IP’niz varsa bu altın değerinde bir güvenlik katmanıdır:
# Belirli IP'lere RDP izni verme, diğerlerini engelleme
New-NetFirewallRule -DisplayName "RDP - Izinli IP 1" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 33890 `
-RemoteAddress "203.0.113.0/24","198.51.100.5" `
-Action Allow
# Genel RDP erişimini engelleme
New-NetFirewallRule -DisplayName "RDP - Genel Engel" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 33890 `
-Action Block
Dinamik IP kullanıyorsanız bu yöntem pratik olmayabilir. Bu durumda VPN zorunluluğu daha mantıklı bir tercih. RDP’yi direkt internete açmak yerine önce VPN’e bağlan, sonra RDP kullan yaklaşımı bugün hala en güvenli yöntem olarak kabul görüyor.
Account Lockout Policy ile Brute Force’u Durdurun
Kaba kuvvet saldırılarının önündeki en önemli engellerden biri hesap kilitleme politikasıdır. Group Policy üzerinden yapılandırılır:
# Account Lockout Policy PowerShell ile ayarlama
# 5 başarısız denemede kilitle, 30 dakika kilitte tut
net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30
# Ayarları doğrulama
net accounts
Group Policy Management Console üzerinden yapmak isteyenler için yol şöyle:
- Computer Configuration > Windows Settings > Security Settings > Account Policies > Account Lockout Policy
- Account lockout threshold: 5 geçersiz giriş denemesi
- Account lockout duration: 30 dakika
- Reset account lockout counter after: 30 dakika
Burada dikkat edilmesi gereken nokta, çok agresif bir kilitleme politikası DoS saldırısına dönüşebilir. Saldırgan bile bile hesapları kilitleyebilir. Bunun için ayrıca Administrator hesabını kilitleme politikasından muaf tutun ama izlemeyi artırın.
NLA (Network Level Authentication) Zorunlu Hale Getirme
NLA, kullanıcının kimliğini masaüstü yüklenmeden önce doğrular. Bu sayede kimliği doğrulanmamış kullanıcılar sunucu kaynaklarını tüketemez ve birçok exploit girişimi ilk aşamada engellenir:
# NLA'yı Registry üzerinden etkinleştirme
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" `
-Name "UserAuthentication" -Value 1
# NLA durumunu kontrol etme
Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" `
-Name "UserAuthentication"
# Group Policy ile de yapılabilir:
# Computer Configuration > Administrative Templates > Windows Components
# > Remote Desktop Services > Remote Desktop Session Host > Security
# "Require use of specific security layer" = SSL
# "Require NLA" = Enabled
NLA’nın yanında TLS 1.2 veya üstü zorunlu hale getirilmeli. Eski TLS versiyonları ciddi güvenlik açıkları barındırıyor:
# TLS 1.0 ve 1.1'i devre dışı bırakma
# TLS 1.0 Disable
New-Item -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server" -Force
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server" -Name "Enabled" -Value 0
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.0Server" -Name "DisabledByDefault" -Value 1
# TLS 1.2 Enable
New-Item -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2Server" -Force
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2Server" -Name "Enabled" -Value 1
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocolsTLS 1.2Server" -Name "DisabledByDefault" -Value 0
RDP Honeypot ile Saldırı Tespiti
Event Log izleme konusuna gelmeden önce basit bir honeypot mantığını anlatayım. 3389 portunu dinlemede bırakın ama gerçek RDP servisi çalışmasın, sadece loglayın. Bu sayede kimin tarama yaptığını görürsünüz. Gerçek RDP trafiğini başka porta taşımış olduğunuz için buraya gelen tüm bağlantı denemeleri otomatik olarak şüpheli sayılabilir.
Daha pratik yaklaşım ise Windows Event Log izlemek:
# Son 1 saatteki başarısız RDP girişlerini listeleme
$StartTime = (Get-Date).AddHours(-1)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $StartTime
} | Select-Object TimeCreated,
@{N='KullaniciAdi';E={$_.Properties[5].Value}},
@{N='KaynakIP';E={$_.Properties[19].Value}},
@{N='HataKodu';E={$_.Properties[7].Value}} |
Format-Table -AutoSize
# Başarılı RDP girişlerini izleme (Event ID 4624, Logon Type 10)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4624
StartTime = $StartTime
} | Where-Object {$_.Properties[8].Value -eq 10} |
Select-Object TimeCreated,
@{N='KullaniciAdi';E={$_.Properties[5].Value}},
@{N='KaynakIP';E={$_.Properties[18].Value}} |
Format-Table -AutoSize
Event ID’leri aklınızda tutmanız gereken önemli numaralar:
- 4625: Başarısız oturum açma girişimi
- 4624: Başarılı oturum açma (Type 10 = RDP)
- 4647: Kullanıcı başlatımlı oturum kapatma
- 4778: Oturum yeniden bağlantısı
- 4779: Oturum bağlantısı kesilmesi
Fail2Ban Muadili: Windows için Otomatik IP Engelleme
Linux dünyasında Fail2Ban bu işi yapar. Windows’ta PowerShell ile benzer bir otomasyon kurabilirsiniz. Belirli eşiği aşan IP’leri otomatik olarak firewall’da engeller:
# Otomatik IP engelleme scripti - Task Scheduler ile çalıştırın
# C:Scriptsblock-rdp-attackers.ps1 olarak kaydedin
$threshold = 10 # 10 başarısız denemede engelle
$timeWindow = 15 # Son 15 dakika
$logFile = "C:Scriptsblocked_ips.log"
$startTime = (Get-Date).AddMinutes(-$timeWindow)
# Başarısız girişleri topla
$failedLogins = Get-WinEvent -FilterHashtable @{
LogName = 'Security'
Id = 4625
StartTime = $startTime
} -ErrorAction SilentlyContinue |
ForEach-Object { $_.Properties[19].Value } |
Where-Object { $_ -ne "-" -and $_ -ne "" } |
Group-Object |
Where-Object { $_.Count -ge $threshold }
foreach ($attacker in $failedLogins) {
$ip = $attacker.Name
# Zaten engellenmiş mi kontrol et
$existingRule = Get-NetFirewallRule -DisplayName "BLOCK-$ip" -ErrorAction SilentlyContinue
if (-not $existingRule) {
# Firewall kuralı ekle
New-NetFirewallRule -DisplayName "BLOCK-$ip" `
-Direction Inbound `
-RemoteAddress $ip `
-Action Block `
-Profile Any
# Log'a kaydet
$logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') | BLOCKED | $ip | $($attacker.Count) attempts"
Add-Content -Path $logFile -Value $logEntry
Write-Host "Engellendi: $ip ($($attacker.Count) deneme)" -ForegroundColor Red
}
}
Bu scripti Task Scheduler’da her 15 dakikada bir çalışacak şekilde ayarlayın. Scheduled Task oluşturmak için:
# Task Scheduler'a script ekleme
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NonInteractive -ExecutionPolicy Bypass -File C:Scriptsblock-rdp-attackers.ps1"
$trigger = New-ScheduledTaskTrigger -RepetitionInterval (New-TimeSpan -Minutes 15) -Once -At (Get-Date)
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 5)
Register-ScheduledTask -TaskName "RDP Saldiri Engelleyici" `
-Action $action `
-Trigger $trigger `
-Settings $settings `
-RunLevel Highest `
-Force
Remote Desktop Gateway ile Güvenli Erişim
Kurumsal ortamlarda RDP’yi direkt internete açmak yerine RD Gateway kullanmak standart yaklaşım olmalı. RD Gateway, HTTPS üzerinden (443 portu) RDP trafiğini tüneller. Bu yaklaşımın avantajları:
- Sadece 443 portu açık, 3389 internete kapalı
- SSL sertifikası ile şifreli tünel
- Merkezi kimlik doğrulama ve yetkilendirme
- Bağlantı logları tek noktada
RD Gateway kurulumu uzun bir konu ama temel PowerShell kurulumu şöyle başlar:
# RD Gateway rol kurulumu
Install-WindowsFeature -Name RDS-Gateway -IncludeManagementTools
# RD Gateway Manager'ı başlatma
mmc.exe
# CAP (Connection Authorization Policy) oluşturma
# RAP (Resource Authorization Policy) oluşturma
# Bu adımlar GUI üzerinden yapılır
# Gateway durumunu kontrol etme
Get-Service -Name TSGateway | Select-Object Name, Status, StartType
# SSL sertifikası atama (Let's Encrypt veya kurumsal CA)
$cert = Get-ChildItem -Path Cert:LocalMachineMy | Where-Object {$_.Subject -like "*rdgateway*"}
Import-Module RemoteDesktopServices
Set-Item -Path RDS:GatewayServerSSLCertificateThumbprint -Value $cert.Thumbprint
Privileged Access Workstation (PAW) ve Just-In-Time Erişim
Büyük ortamlarda RDP erişimini sadece belirli yönetim iş istasyonlarından izin vermek önemli bir güvenlik katmanı ekler. Bu iş istasyonları sıkılaştırılmış, sadece yönetim amaçlı kullanılan makineler olmalı.
Buna ek olarak Just-In-Time (JIT) erişim konsepti giderek daha popüler hale geliyor. Microsoft Defender for Identity veya Privileged Identity Management (PIM) ile RDP erişimini sadece talep üzerine ve belirli süreyle aktifleştirmek mümkün.
Daha basit bir yaklaşım olarak, çalışma saatleri dışında RDP’yi tamamen kapatmak:
# Mesai saatleri dışında RDP'yi kapat
# Sabah 08:00 - Akşam 19:00 arası açık, diğer saatler kapalı
# RDP'yi etkinleştirme scripti (Sabah çalışır)
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal Server" `
-Name "fDenyTSConnections" -Value 0
Enable-NetFirewallRule -DisplayName "Remote Desktop*"
Write-EventLog -LogName Application -Source "RDP-Scheduler" -EventId 1001 -Message "RDP servisi etkinlestirildi"
# RDP'yi devre dışı bırakma scripti (Akşam çalışır)
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal Server" `
-Name "fDenyTSConnections" -Value 1
Disable-NetFirewallRule -DisplayName "Remote Desktop*"
Write-EventLog -LogName Application -Source "RDP-Scheduler" -EventId 1002 -Message "RDP servisi devre disi birakildi"
Önemli Güvenlik Kontrolleri ve Sıkılaştırma
Tüm bu önlemlerin yanında yapılması gereken temel güvenlik ayarları:
Güçlü Parola Politikası
- Minimum 14 karakter
- Büyük/küçük harf, rakam ve özel karakter zorunluluğu
- Parola geçmişi en az 12 (aynı parolayı tekrar kullanamaz)
- Maximum parola yaşı 90 gün
RDP Oturum Sınırlamaları
- Disconnected session limit: 2 saat (maksimum)
- Active session limit: 8-10 saat
- Idle session limit: 30 dakika
Clipboard ve Sürücü Yönlendirmesini Kısıtlama
- Clipboard yönlendirmesini devre dışı bırakın (hassas ortamlarda)
- Yerel sürücü bağlama kısıtlayın
- Yazıcı yönlendirmesini kısıtlayın (gerekmedikçe)
Group Policy yolu: Computer Configuration > Administrative Templates > Windows Components > Remote Desktop Services > Remote Desktop Session Host > Device and Resource Redirection
Windows Defender ve ATP Entegrasyonu
Modern Windows Server ortamlarında Microsoft Defender for Endpoint RDP saldırılarını otomatik tespit edebilir. Defender’ın “Attack Surface Reduction” kuralları RDP güvenliğini önemli ölçüde artırır:
# ASR kurallarını PowerShell ile aktifleştirme
# Credential stealing via LSASS engelleme
Add-MpPreference -AttackSurfaceReductionRules_Ids 9e6c4e1f-7d60-472f-ba1a-a39ef669e4b0 `
-AttackSurfaceReductionRules_Actions Enabled
# Ransomware koruması (Controlled Folder Access)
Set-MpPreference -EnableControlledFolderAccess Enabled
# Real-time protection kontrol
Get-MpComputerStatus | Select-Object RealTimeProtectionEnabled,
AntivirusSignatureLastUpdated,
NISSignatureLastUpdated
Güvenlik Denetimi ve Raporlama
Tüm bu önlemleri aldıktan sonra düzenli denetim şart. Haftalık olarak çalıştırabileceğiniz bir denetim scripti:
# RDP Güvenlik Denetim Raporu
$reportDate = Get-Date -Format "yyyy-MM-dd"
$report = @()
# Son 7 günde kaç başarısız giriş olmuş
$failedAttempts = (Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4625
StartTime=(Get-Date).AddDays(-7)
} -ErrorAction SilentlyContinue).Count
# Engellenen IP sayısı
$blockedIPs = (Get-NetFirewallRule | Where-Object {$_.DisplayName -like "BLOCK-*"}).Count
# Aktif RDP oturumları
$activeSessions = query session 2>&1 | Where-Object {$_ -match "Active"}
$report += "=== RDP Guvenlik Raporu - $reportDate ==="
$report += "Son 7 gun basarisiz giris: $failedAttempts"
$report += "Toplam engellenen IP: $blockedIPs"
$report += "Aktif RDP oturumu: $($activeSessions.Count)"
$report += ""
# NLA durumu
$nla = (Get-ItemProperty "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp").UserAuthentication
$report += "NLA Durumu: $(if($nla -eq 1){'AKTIF'}else{'DEVRE DISI - DIKKAT!'})"
# RDP port numarasi
$rdpPort = (Get-ItemProperty "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp").PortNumber
$report += "RDP Port: $rdpPort"
$report | ForEach-Object { Write-Host $_ }
# Raporu dosyaya kaydet
$report | Out-File -FilePath "C:Reportsrdp-security-$reportDate.txt"
Gerçek Dünya Senaryosu: Saldırı Altındaki Sunucuyu Temizleme
Bir sunucunun aktif saldırı altında olduğunu fark ettiniz. Hızlı aksiyon planı:
1. Adım: Aktif saldırı IP’lerini anında engelle
# Anlık saldırı yapan IP'leri toplu engelle
$attackerIPs = Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4625
StartTime=(Get-Date).AddMinutes(-30)
} | ForEach-Object {$_.Properties[19].Value} |
Where-Object {$_ -ne "-"} |
Group-Object | Sort-Object Count -Descending |
Select-Object -First 20
foreach ($ip in $attackerIPs) {
New-NetFirewallRule -DisplayName "EMERGENCY-BLOCK-$($ip.Name)" `
-Direction Inbound -RemoteAddress $ip.Name -Action Block
Write-Host "Acil engel: $($ip.Name) - $($ip.Count) deneme"
}
2. Adım: RDP’yi geçici olarak kapat, durumu değerlendir, güvenli kanaldan (VPN veya fiziksel erişim) bağlan
3. Adım: Başarılı girişlerin olup olmadığını kontrol et, olmuşsa forensic analiz başlat
4. Adım: Tüm güvenlik önlemlerini uygula, RDP’yi yeniden aç
Sonuç
RDP güvenliği tek bir önlemle sağlanamaz. Savunma derinliği (defense in depth) prensibi burada tam anlamıyla geçerli. Port değişikliği, IP kısıtlaması, NLA zorunluluğu, güçlü parola politikası, otomatik IP engelleme ve düzenli izleme gibi katmanların hepsini bir arada uygulamak gerekiyor.
Production ortamda öncelik sıralaması şöyle olmalı: Önce internete doğrudan açık RDP bağlantısını kapatın ve VPN üzerinden erişime geçin. Bunu yapamıyorsanız en azından NLA’yı aktifleştirin, IP kısıtlaması koyun ve otomatik engelleme scriptinizi çalıştırın. Ardından izleme ve loglama altyapısını kurun. Son olarak düzenli denetimle sistemin güncel ve güvenli kaldığından emin olun.
Unutmayın, saldırganlar otomatize araç kullanıyor ve sürekli tarıyor. Savunma tarafında da otomasyon şart. Manuel kontrol tek başına yetmez. Bu scriptleri kendi ortamınıza göre uyarlayın, test edin ve production’a alın. Bir sonraki sabah binlerce başarısız giriş denemesi gördüğünüzde en azından bunların başarısız kaldığını ve sistemin otomatik olarak tepki verdiğini görmek çok daha huzurlu bir his olacak.