Windows Server Güvenlik Katılaştırma Rehberi
Üretim ortamında bir Windows Server’ı internete açtığınız anda, saldırganların otomatik tarayıcıları dakikalar içinde sisteminizi keşfediyor. RDP bruteforce denemeleri, SMB exploitleri, varsayılan servis açıkları… Bunların hepsi gerçek ve sürekli devam eden tehditler. Bu rehberde sıfırdan bir Windows Server’ı nasıl sertleştireceğinizi, hangi servisleri kapatmanız gerektiğini ve kurumsal ortamda uyguladığım gerçek konfigürasyonları paylaşacağım.
Temel Güvenlik Felsefesi: En Az Ayrıcalık Prensibi
Windows Server güvenliğinde en önemli kural şu: Gerekmiyorsa kapat, gerekmiyorsa verme. Bu basit ama çoğu zaman görmezden gelinen bir prensip. Bir sunucuya RDP açık mı bırakırsın? Sadece yönetim için mi kullanıyorsun, o zaman neden 0.0.0.0:3389 dinliyor?
Gerçek dünya senaryosu olarak şunu paylaşayım: Bir müşteri ortamında IIS web sunucusu kurulu bir Windows Server 2019 makinesine baktım. Sunucu sadece web servis sunuyordu ama üzerinde Telnet Client, TFTP Client, Remote Registry servisi ve hatta Fax servisi çalışıyordu. Bunların hiçbiri gerekmiyordu. Her gereksiz servis potansiyel bir saldırı yüzeyi demek.
Windows Firewall Konfigürasyonu
İlk adım her zaman firewall. Windows Defender Firewall’u doğru yapılandırmak, dışarıdan gelen saldırıların büyük çoğunluğunu engeller. PowerShell ile firewall kurallarını yönetmek GUI’den çok daha hızlı ve tekrarlanabilir.
# Mevcut firewall profillerini kontrol et
Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction
# Tüm profillerde firewall'u etkinleştir
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
# Varsayılan gelen trafiği engelle
Set-NetFirewallProfile -Profile Domain,Public,Private -DefaultInboundAction Block
# Sadece belirli IP'den RDP erişimine izin ver
New-NetFirewallRule -DisplayName "RDP-Yonetim" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 3389 `
-RemoteAddress "10.0.0.0/8","192.168.1.100" `
-Action Allow `
-Profile Domain,Private
Dikkat edilmesi gereken bir nokta: Public profilinde RDP kuralını asla açık bırakmayın. Domain veya Private profiliyle sınırlı tutun. Eğer sunucu bir VPN arkasında değilse, RDP’yi doğrudan internete asla açmayın.
# Gereksiz gelen kuralları devre dışı bırak
Disable-NetFirewallRule -DisplayName "File and Printer Sharing*"
Disable-NetFirewallRule -DisplayName "Network Discovery*"
# Mevcut açık portları listele
Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, OwningProcess | Sort-Object LocalPort
Gereksiz Servisleri Kapatmak
Windows Server kurulumlarında onlarca servis varsayılan olarak çalışır. Bunların büyük kısmı özellikle sunucu rollerine göre gereksizdir.
# Kapatılması önerilen servis listesi
$gereksizServisler = @(
"Spooler", # Print Spooler - PrintNightmare açığı
"RemoteRegistry", # Uzak kayıt defteri erişimi
"Fax", # Faks servisi
"TapiSrv", # Telefon API
"WMPNetworkSvc", # Windows Media Player ağ paylaşımı
"XblAuthManager", # Xbox Live
"XblGameSave", # Xbox oyun kaydetme
"XboxNetApiSvc" # Xbox ağ servisi
)
foreach ($servis in $gereksizServisler) {
$s = Get-Service -Name $servis -ErrorAction SilentlyContinue
if ($s) {
Stop-Service -Name $servis -Force -ErrorAction SilentlyContinue
Set-Service -Name $servis -StartupType Disabled
Write-Host "$servis durduruldu ve devre disi birakildi" -ForegroundColor Green
}
}
Print Spooler servisi özellikle dikkat ister. PrintNightmare (CVE-2021-34527) açığı bu servisi hedef alıyordu ve aktif olarak exploit edildi. Eğer sunucunuz yazıcı paylaşımı yapmıyorsa bu servisi kapatın.
SMB Güvenliği
SMB protokolü, EternalBlue gibi yıkıcı saldırıların temel hedefi oldu. WannaCry ve NotPetya ransomware’leri SMBv1 üzerinden yayıldı. Bu yüzden SMB konfigürasyonu kritik önem taşıyor.
# SMBv1'i devre dışı bırak (KESİNLİKLE yapılmalı)
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
# SMBv2 ve SMBv3 durumunu kontrol et
Get-SmbServerConfiguration | Select-Object EnableSMB1Protocol, EnableSMB2Protocol
# SMB imzalamayı zorunlu kıl
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force
Set-SmbServerConfiguration -EnableSecuritySignature $true -Force
# SMB paylaşımlarını listele ve gereksizleri kaldır
Get-SmbShare | Where-Object {$_.Name -notlike "*$"} | Select-Object Name, Path, Description
SMB imzalama (signing) özelliği etkinleştirilmediğinde NTLM relay saldırıları mümkün oluyor. Bu saldırı tipinde saldırgan, ağ trafiğini araya girerek kimlik doğrulamasını başka bir sunucuya yönlendirebiliyor. Özellikle Active Directory ortamlarında bu çok kritik.
Kullanıcı Hesapları ve Ayrıcalık Yönetimi
Varsayılan Administrator hesabı her Windows sisteminde bilinen bir hedef. İlk yapılacak şey bu hesabı yeniden adlandırmak ve devre dışı bırakmak.
# Administrator hesabını yeniden adlandır
Rename-LocalUser -Name "Administrator" -NewName "SysAdmin_Ops"
# Varsayılan Guest hesabını devre dışı bırak
Disable-LocalUser -Name "Guest"
# Tüm yerel kullanıcıları listele
Get-LocalUser | Select-Object Name, Enabled, LastLogon, PasswordExpires
# Yönetici grubundaki kullanıcıları kontrol et (beklenmedik hesap var mı?)
Get-LocalGroupMember -Group "Administrators" | Select-Object Name, ObjectClass, PrincipalSource
Gerçek dünya senaryosu: Bir güvenlik denetiminde “test” adında bir kullanıcının Administrators grubunda olduğunu keşfettim. Şifresi de “Test123!” idi. Bu hesap bir geliştirici tarafından “geçici” olarak oluşturulmuş, sonra unutulmuştu. Bu tür hesaplar saldırganlar için açık kapı.
# Parola politikasını sertleştir
net accounts /minpwlen:14 /maxpwage:90 /minpwage:1 /uniquepw:10 /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30
# Parola politikasını doğrula
net accounts
Audit Politikaları ve Loglama
Bir sisteme ne zaman saldırı yapıldığını bilemezsiniz ama ne zaman saldırı yapıldığını sonradan anlayabilirsiniz. Bunun için kapsamlı loglama şart.
# Gelişmiş denetim politikalarını yapılandır
# Başarılı ve başarısız oturum açma denemelerini logla
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
auditpol /set /subcategory:"Account Lockout" /success:enable /failure:enable
# Ayrıcalık kullanımını logla
auditpol /set /subcategory:"Sensitive Privilege Use" /success:enable /failure:enable
# Nesne erişimini logla
auditpol /set /subcategory:"File System" /success:enable /failure:enable
auditpol /set /subcategory:"Registry" /failure:enable
# Politika değişikliklerini logla
auditpol /set /subcategory:"Audit Policy Change" /success:enable /failure:enable
# Süreç oluşturmayı logla (önemli!)
auditpol /set /subcategory:"Process Creation" /success:enable
# Mevcut audit politikalarını görüntüle
auditpol /get /category:*
Event log boyutlarını artırmak da önemli. Varsayılan log boyutları çok küçük ve kritik olaylar üzerine yazılabiliyor.
# Security log boyutunu 1 GB'a çıkar
wevtutil sl Security /ms:1073741824
# Application ve System loglarını da büyüt
wevtutil sl Application /ms:524288000
wevtutil sl System /ms:524288000
# Son başarısız oturum açma denemelerini sorgula
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} -MaxEvents 50 |
Select-Object TimeCreated, @{N='User';E={$_.Properties[5].Value}},
@{N='IP';E={$_.Properties[19].Value}} |
Sort-Object TimeCreated -Descending
Windows Defender ve Antivirüs Politikası
Windows Defender, doğru yapılandırıldığında oldukça etkili bir koruma sağlar. Özellikle AMSI (Antimalware Scan Interface) ve tamper protection özellikleri kritik.
# Windows Defender durumunu kontrol et
Get-MpComputerStatus | Select-Object AMServiceEnabled, AntispywareEnabled, AntivirusEnabled, RealTimeProtectionEnabled, TamperProtectionSource
# Gerçek zamanlı korumayı etkinleştir
Set-MpPreference -DisableRealtimeMonitoring $false
# Bulut tabanlı korumayı aktifleştir
Set-MpPreference -MAPSReporting Advanced
Set-MpPreference -SubmitSamplesConsent SendAllSamples
# Attack Surface Reduction kurallarını etkinleştir
# Office makrolarının çocuk süreç oluşturmasını engelle
Add-MpPreference -AttackSurfaceReductionRules_Ids D4F940AB-401B-4EFC-AADC-AD5F3C50688A -AttackSurfaceReductionRules_Actions Enabled
# PSExec ve WMI komutlarından gelen süreç oluşturmayı engelle
Add-MpPreference -AttackSurfaceReductionRules_Ids D1E49AAC-8F56-4280-B9BA-993A6D77406C -AttackSurfaceReductionRules_Actions Enabled
RDP Güvenliği
RDP, sysadminlerin en çok kullandığı uzak yönetim protokolü. Ama aynı zamanda en çok saldırıya uğrayan servis. Brute force saldırıları, credential stuffing ve BlueKeep gibi açıklar RDP üzerinden geliyor.
# RDP için NLA (Network Level Authentication) zorunlu kıl
# Registry üzerinden
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" `
-Name "UserAuthentication" -Value 1
# RDP portunu değiştir (güvenlik yoluyla belirsizlik, tek başına yeterli değil ama bota karşı etkili)
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" `
-Name "PortNumber" -Value 33890
# RDP encryption level'ı en yüksek seviyeye çıkar
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" `
-Name "MinEncryptionLevel" -Value 3
# Firewall'da yeni RDP portunu aç, eskisini kapat
New-NetFirewallRule -DisplayName "RDP-Custom" -Direction Inbound -Protocol TCP -LocalPort 33890 -Action Allow
Disable-NetFirewallRule -DisplayName "Remote Desktop*"
RDP için ideal senaryo şu: Sunucuya doğrudan internetten RDP erişimi kapalı olmalı. Yönetim için ya VPN kullanın ya da bir jump server (sıçrama sunucusu) kurun. Jump server, yalnızca yönetim ağından erişilebilen, sıkı şekilde izlenen ve loglanan bir ara makine.
LSASS Koruması
LSASS (Local Security Authority Subsystem Service) süreci, Mimikatz gibi araçlarla hedef alınan en kritik Windows sürecidir. Bu süreçten kimlik bilgileri çalınabilir.
# LSASS'ı Protected Process Light olarak yapılandır
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlLsa" `
-Name "RunAsPPL" -Value 1
# Credential Guard'ı etkinleştir (Windows 10/Server 2016+)
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlDeviceGuard" `
-Name "EnableVirtualizationBasedSecurity" -Value 1
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlDeviceGuard" `
-Name "RequirePlatformSecurityFeatures" -Value 1
# WDigest kimlik doğrulamasını devre dışı bırak
# Bu ayar etkinken plaintext şifreler bellekte tutulabilir
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersWDigest" `
-Name "UseLogonCredential" -Value 0
# Değişiklikler için yeniden başlatma gerekli
Write-Host "LSASS korumasi icin sistem yeniden baslatilmali!" -ForegroundColor Yellow
PowerShell Güvenliği
PowerShell, saldırganların en çok kullandığı “living off the land” araçlarından biri. Yani sisteme yeni bir araç kurmadan, sistemin kendi araçlarını kullanarak saldırı yapıyorlar.
# PowerShell Execution Policy'yi kısıtla
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine
# PowerShell Script Block Logging'i etkinleştir
$logPath = "HKLM:SOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging"
New-Item -Path $logPath -Force
Set-ItemProperty -Path $logPath -Name "EnableScriptBlockLogging" -Value 1
Set-ItemProperty -Path $logPath -Name "EnableScriptBlockInvocationLogging" -Value 1
# Module Logging'i etkinleştir
$modulePath = "HKLM:SOFTWAREPoliciesMicrosoftWindowsPowerShellModuleLogging"
New-Item -Path $modulePath -Force
Set-ItemProperty -Path $modulePath -Name "EnableModuleLogging" -Value 1
# Transcription logging
$transcriptPath = "HKLM:SOFTWAREPoliciesMicrosoftWindowsPowerShellTranscription"
New-Item -Path $transcriptPath -Force
Set-ItemProperty -Path $transcriptPath -Name "EnableTranscripting" -Value 1
Set-ItemProperty -Path $transcriptPath -Name "OutputDirectory" -Value "C:PSLogs"
PowerShell v2’yi de devre dışı bırakın. Saldırganlar script block logging’i atlatmak için PowerShell v2’ye downgrade yapabiliyor.
# PowerShell v2'yi devre dışı bırak
Disable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Root -NoRestart
Yama Yönetimi ve Otomatik Güncellemeler
Tüm bu sertleştirme adımları, güncel olmayan bir sistem üzerinde yetersiz kalır. Patch yönetimi, güvenlik stratejisinin temel taşı.
# Windows Update servisinin çalıştığını doğrula
Get-Service -Name wuauserv | Select-Object Name, Status, StartType
# Bekleyen güncellemeleri listele (PSWindowsUpdate modülü gerekli)
Install-Module PSWindowsUpdate -Force
Get-WindowsUpdate
# Kritik ve güvenlik güncellemelerini otomatik yükle
Install-WindowsUpdate -Category "Security Updates","Critical Updates" -AutoReboot -AcceptAll
# Son yüklenen güncellemeleri kontrol et
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 20
Güvenlik Denetim Betiği
Tüm bu kontrolleri tek seferde yapan bir denetim betiği hazırlamak işleri kolaylaştırır. Haftada bir çalıştırabilirsiniz.
# Hizli guvenlik denetim scripti
function Invoke-SecurityAudit {
Write-Host "=== Windows Server Guvenlik Denetimi ===" -ForegroundColor Cyan
# SMBv1 kontrolu
$smb1 = Get-SmbServerConfiguration | Select-Object -ExpandProperty EnableSMB1Protocol
if ($smb1) {
Write-Host "[UYARI] SMBv1 AKTIF - Devre disi birakin!" -ForegroundColor Red
} else {
Write-Host "[OK] SMBv1 devre disi" -ForegroundColor Green
}
# Guest hesabi kontrolu
$guest = Get-LocalUser -Name "Guest" | Select-Object -ExpandProperty Enabled
if ($guest) {
Write-Host "[UYARI] Guest hesabi aktif!" -ForegroundColor Red
} else {
Write-Host "[OK] Guest hesabi devre disi" -ForegroundColor Green
}
# Firewall durumu
$fw = Get-NetFirewallProfile | Where-Object {$_.Enabled -eq $false}
if ($fw) {
Write-Host "[UYARI] Bazi firewall profilleri kapali: $($fw.Name -join ', ')" -ForegroundColor Red
} else {
Write-Host "[OK] Tum firewall profilleri aktif" -ForegroundColor Green
}
# WDigest kontrolu
$wdigest = Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlSecurityProvidersWDigest" -Name "UseLogonCredential" -ErrorAction SilentlyContinue
if ($wdigest.UseLogonCredential -eq 1) {
Write-Host "[UYARI] WDigest aktif - Kimlik bilgileri acikta!" -ForegroundColor Red
} else {
Write-Host "[OK] WDigest devre disi" -ForegroundColor Green
}
# Son 24 saatteki basarisiz giris denemelerini say
$failedLogins = (Get-WinEvent -FilterHashtable @{
LogName='Security'; Id=4625;
StartTime=(Get-Date).AddHours(-24)
} -ErrorAction SilentlyContinue).Count
Write-Host "[BİLGİ] Son 24 saatte $failedLogins basarisiz giris denemesi" -ForegroundColor Yellow
# Administrators grubundaki kullanici sayisi
$admins = (Get-LocalGroupMember -Group "Administrators").Count
Write-Host "[BİLGİ] Administrators grubunda $admins hesap var" -ForegroundColor Yellow
}
Invoke-SecurityAudit
Uygulama Kontrolü ile AppLocker
Yetkisiz uygulamaların çalışmasını engellemek, ransomware ve malware saldırılarına karşı güçlü bir katman ekler.
# AppLocker servisini etkinleştir
Set-Service -Name AppIDSvc -StartupType Automatic
Start-Service -Name AppIDSvc
# Varsayılan AppLocker kurallarını oluştur
# Bu kurallar Windows dizininden ve Program Files'tan çalıştırmaya izin verir
$policy = Get-AppLockerPolicy -Effective
# Kuralları XML olarak dışa aktar ve incele
Get-AppLockerPolicy -Effective -Xml | Out-File C:AppLockerPolicy.xml
Sonuç
Windows Server güvenlik sertleştirmesi tek seferlik bir iş değil, sürekli devam eden bir süreç. Bugün kapattığınız bir açık, yarın yüklenen bir güncellemeyle tekrar açılabilir. Bu yüzden birkaç temel alışkanlık edinmek çok önemli.
Düzenli yapmanız gerekenler:
- Her ay yamalarınızı uygulayın, kritik yamaları 48 saat içinde uygulayın
- Haftada bir güvenlik log’larını gözden geçirin, özellikle Event ID 4625, 4648, 4720, 4732 olaylarına dikkat edin
- Üç ayda bir yetkili hesap listesini gözden geçirin, gereksiz hesapları kaldırın
- Güvenlik denetim betiğini zamanlanmış görev olarak çalıştırın ve sonuçlarını e-postayla alın
- Firewall kurallarınızı periyodik olarak gözden geçirin, “geçici” açılan portlara dikkat edin
Bu rehberde anlattıklarım, CIS Benchmark ve DISA STIG standartlarıyla büyük ölçüde örtüşüyor. Kurumsal ortamlarda bu standartları referans alarak daha kapsamlı bir güvenlik politikası oluşturabilirsiniz.
Son olarak şunu söyleyeyim: En iyi güvenlik aracı, sisteminizi bilen ve değişiklikleri takip eden bir sistem yöneticisidir. Araçlar ve betikler yardımcı olur ama asıl fark yaratan insan gözü ve deneyimidir. Log okumayı, anormal davranışları tanımayı öğrenin ve güvenliği bir alışkanlık haline getirin.
