Güvenlik uyumluluğu deyince çoğu sysadmin’in aklına önce audit raporları, sonra saatler süren manuel kontroller geliyor. Oysa CIS Benchmark, bu süreci hem sistematik hem de tekrarlanabilir hale getiren en güvenilir referans kaynaklarından biri. Center for Internet Security tarafından yayınlanan bu kılavuzlar, gerçek dünya saldırı vektörlerine karşı kanıtlanmış güvenlik kontrollerini içeriyor. Windows Server ortamlarında CIS Benchmark uyumluluğunu sağlamak, hem iç denetimler hem de ISO 27001, PCI-DSS gibi dış uyumluluk gereksinimleri için ciddi bir temel oluşturuyor.
CIS Benchmark Nedir ve Neden Önemlidir
CIS Benchmark, dünya genelinde güvenlik uzmanları tarafından konsensüs yöntemiyle hazırlanan, işletim sistemi ve uygulama bazında güvenlik yapılandırma rehberleridir. Windows Server için Level 1 ve Level 2 olmak üzere iki profil bulunur.
Level 1: Üretim ortamlarında makul performans etkisiyle uygulanabilen temel güvenlik kontrolleri. Servis kesintisi riski minimum.
Level 2: Yüksek güvenlik gereksinimleri olan ortamlar için tasarlanmış, daha agresif kontroller. Bazı servislerin işlevselliğini etkileyebilir.
Gerçek dünya senaryosunda bir müşterimizin finans sektörü altyapısını değerlendirirken CIS Benchmark Level 1 uyumluluğunun yüzde 34’te olduğunu tespit ettik. Yani üç sunucudan ikisi temel güvenlik kontrollerini bile geçemiyordu. Bu tablo aslında sektörde oldukça yaygın.
Ortam Hazırlığı ve Araçlar
Değerlendirmeye başlamadan önce doğru araçları hazırlamanız gerekiyor. Microsoft’un kendi araçları ile üçüncü parti çözümleri birlikte kullanmak en kapsamlı sonucu veriyor.
CIS-CAT Pro ile Otomatik Değerlendirme
CIS üyeliği gerektiren CIS-CAT Pro, en kapsamlı değerlendirme aracı. Ücretsiz lite sürümüyle başlayabilirsiniz:
# CIS-CAT Lite ile temel tarama (PowerShell ile çalıştırma)
# Önce execution policy kontrol edin
Get-ExecutionPolicy -List
# Gerekirse değiştirin
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# CIS-CAT Lite çalıştırma
.CIS-CAT.bat -b benchmarksCIS_Microsoft_Windows_Server_2022_Benchmark_v2.0.0-xccdf.xml -p "Level 1 - Member Server"
Microsoft Security Compliance Toolkit
Microsoft’un kendi güvenlik araç seti, ücretsiz ve oldukça güçlü. LGPO.exe ve Policy Analyzer bu paketin içinde geliyor:
# Policy Analyzer ile mevcut politikayı CIS baseline ile karşılaştırma
# PolicyAnalyzer.exe GUI uygulaması, ancak export için komut satırı kullanabilirsiniz
.LGPO.exe /parse /m .{GUID}Machineregistry.pol > current_machine_policy.txt
# Baseline import etme
.LGPO.exe /g .CIS_Windows_Server_2022_Level1_MS
PowerShell ile Manuel Kontrol Script’i
Hızlı bir baseline değerlendirmesi için kendi script’inizi yazabilirsiniz:
# Temel güvenlik ayarlarını kontrol eden PowerShell script'i
$results = @()
# Password Policy kontrolü
$passwordPolicy = net accounts
$results += [PSCustomObject]@{
Control = "Minimum Password Length"
Expected = "14 veya üzeri"
Current = ($passwordPolicy | Select-String "Minimum password length").ToString().Trim()
Status = if (($passwordPolicy | Select-String "Minimum password length") -match "1[4-9]|[2-9]d") { "PASS" } else { "FAIL" }
}
# Account Lockout Policy kontrolü
$lockoutThreshold = (Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesRemoteAccessParametersAccountLockout" -ErrorAction SilentlyContinue)
$results += [PSCustomObject]@{
Control = "Account Lockout Threshold"
Expected = "5 veya daha az"
Status = "Manuel kontrol gerekli - secpol.msc"
}
# SMBv1 kontrolü
$smb1 = Get-WindowsFeature FS-SMB1 -ErrorAction SilentlyContinue
$results += [PSCustomObject]@{
Control = "SMBv1 Disabled"
Expected = "Disabled"
Current = if ($smb1.InstallState -eq "Installed") { "Enabled - KRITIK!" } else { "Disabled" }
Status = if ($smb1.InstallState -ne "Installed") { "PASS" } else { "FAIL" }
}
$results | Format-Table -AutoSize
$results | Export-Csv -Path "C:CIS_Quick_Check_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation
Kritik CIS Kontrol Kategorileri
1. Account Policies (Hesap Politikaları)
CIS Benchmark’ın en temel kategorisi. Bu kontroller olmadan diğer her şey anlamsız kalır.
# Account Policy ayarlarını GPO üzerinden yapılandırma
# secedit.exe ile mevcut yapılandırmayı export etme
secedit /export /cfg C:SecurityAuditcurrent_security_policy.cfg /log C:SecurityAuditsecedit_export.log
# Export edilen dosyayı inceleme
Get-Content C:SecurityAuditcurrent_security_policy.cfg | Select-String -Pattern "Password|Lockout|Audit"
CIS Level 1 için minimum password policy gereksinimleri:
- Minimum Password Length: 14 karakter (eski standart olan 8’i çoktan geçtik)
- Password Complexity: Enabled olmalı
- Maximum Password Age: 365 gün (bazı güvenlik uzmanları artık expire kullanmama öneriyor, ancak CIS hala öneriyor)
- Account Lockout Threshold: 5 geçersiz giriş denemesi
- Account Lockout Duration: 15 dakika
- Reset Account Lockout Counter: 15 dakika
2. Audit Policy Yapılandırması
Güvenlik olaylarını kayıt altına almadan hiçbir şeyi ispat edemezsiniz. CIS, Advanced Audit Policy Configuration kullanılmasını şiddetle öneriyor:
# Advanced Audit Policy durumunu kontrol etme
auditpol /get /category:*
# CIS uyumlu audit policy yapılandırması
# Account Logon Events
auditpol /set /subcategory:"Credential Validation" /success:enable /failure:enable
auditpol /set /subcategory:"Kerberos Authentication Service" /success:enable /failure:enable
# Account Management
auditpol /set /subcategory:"Computer Account Management" /success:enable /failure:enable
auditpol /set /subcategory:"Security Group Management" /success:enable /failure:enable
auditpol /set /subcategory:"User Account Management" /success:enable /failure:enable
# Logon/Logoff
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
auditpol /set /subcategory:"Logoff" /success:enable
auditpol /set /subcategory:"Special Logon" /success:enable
# Object Access - Dikkatli kullanın, log hacmini artırır
auditpol /set /subcategory:"File System" /success:enable /failure:enable
# Policy Change
auditpol /set /subcategory:"Audit Policy Change" /success:enable /failure:enable
auditpol /set /subcategory:"Authentication Policy Change" /success:enable
# Mevcut yapılandırmayı doğrulama
auditpol /get /category:* | Out-File C:SecurityAuditaudit_policy_current.txt
3. Windows Firewall Yapılandırması
Firewall’un açık olması yetmez; doğru profile’larda doğru şekilde yapılandırılmış olması gerekiyor:
# Tüm firewall profillerinin durumunu kontrol etme
Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction, LogFileName, LogMaxSizeKilobytes
# CIS uyumlu firewall yapılandırması
# Domain Profile
Set-NetFirewallProfile -Profile Domain -Enabled True -DefaultInboundAction Block -DefaultOutboundAction Allow -LogFileName "%SystemRoot%System32logfilesfirewalldomainfw.log" -LogMaxSizeKilobytes 16384 -LogAllowed True -LogBlocked True
# Private Profile
Set-NetFirewallProfile -Profile Private -Enabled True -DefaultInboundAction Block -DefaultOutboundAction Allow -LogFileName "%SystemRoot%System32logfilesfirewallprivatefw.log" -LogMaxSizeKilobytes 16384 -LogAllowed True -LogBlocked True
# Public Profile
Set-NetFirewallProfile -Profile Public -Enabled True -DefaultInboundAction Block -DefaultOutboundAction Allow -LogFileName "%SystemRoot%System32logfilesfirewallpublicfw.log" -LogMaxSizeKilobytes 16384 -LogAllowed True -LogBlocked True
4. Servis Hardening
Gereksiz servislerin kapatılması saldırı yüzeyini önemli ölçüde azaltır:
# CIS tarafından devre dışı bırakılması önerilen servislerin kontrolü
$servicesToDisable = @(
"Browser", # Computer Browser
"IISADMIN", # IIS Admin (IIS kullanmıyorsanız)
"irmon", # Infrared Monitor
"SharedAccess", # Internet Connection Sharing
"MessageQueue", # Message Queuing
"NNTPSvc", # Network News Transfer Protocol
"RasAuto", # Remote Access Auto Connection Manager (gerekmedikce)
"RDSessMgr", # Remote Desktop Services Session Manager (RDS kullanmıyorsanız)
"RemoteRegistry", # Remote Registry - KESİNLİKLE KAPATILMALI
"RpcLocator", # Remote Procedure Call Locator
"simptcp", # Simple TCP/IP Services
"SNMP", # SNMP Service (v3 kullanmıyorsanız)
"SSDPSRV", # SSDP Discovery
"TlntSvr", # Telnet
"upnphost", # UPnP Device Host
"WMSvc" # Web Management Service
)
foreach ($service in $servicesToDisable) {
$svc = Get-Service -Name $service -ErrorAction SilentlyContinue
if ($svc) {
Write-Host "Servis bulundu: $($svc.Name) - Status: $($svc.Status)" -ForegroundColor Yellow
# Üretim ortamında önce test edin!
# Stop-Service -Name $service -Force -ErrorAction SilentlyContinue
# Set-Service -Name $service -StartupType Disabled
}
}
Önemli not: Remote Registry servisini kapatmadan önce monitoring araçlarınızın buna bağımlı olup olmadığını kontrol edin. Bir müşterimizde bu servisi kapattıktan sonra eski Nagios agent’ları çalışmayı durdurmuştu.
Registry Tabanlı Güvenlik Kontrolleri
CIS Benchmark kontrollerinin büyük bir kısmı registry ayarlarına dayanıyor. Bunları Group Policy üzerinden yönetmek en iyi pratik, ancak registry üzerinden de uygulayabilirsiniz:
# SMBv1'i devre dışı bırakma (WannaCry ve benzeri saldırılara karşı kritik)
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesLanmanServerParameters" -Name "SMB1" -Value 0 -Type DWord
# NTLMv1 devre dışı bırakma
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlLsa" -Name "LmCompatibilityLevel" -Value 5 -Type DWord
# Anonymous enumeration engelleme
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlLsa" -Name "RestrictAnonymous" -Value 1 -Type DWord
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlLsa" -Name "RestrictAnonymousSAM" -Value 1 -Type DWord
# AutoRun/AutoPlay devre dışı bırakma
Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer" -Name "NoDriveTypeAutoRun" -Value 255 -Type DWord
# RDP için NLA (Network Level Authentication) zorunlu kılma
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" -Name "UserAuthentication" -Value 1 -Type DWord
# Windows Script Host devre dışı bırakma (gerekmedikce)
New-Item -Path "HKLM:SOFTWAREMicrosoftWindows Script HostSettings" -Force | Out-Null
Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindows Script HostSettings" -Name "Enabled" -Value 0 -Type DWord
Write-Host "Registry güvenlik ayarları uygulandı. Bazı değişiklikler için yeniden başlatma gerekebilir." -ForegroundColor Green
Group Policy ile Merkezi Yönetim
Birden fazla sunucu yönetiyorsanız, tüm bu kontrolleri tek tek yapmak hem zaman kaybı hem de hata riski. GPO ile merkezi yönetim şart:
# PowerShell ile GPO oluşturma ve CIS ayarlarını uygulama
Import-Module GroupPolicy
# Yeni GPO oluşturma
$gpoName = "CIS_Windows_Server_2022_Level1"
New-GPO -Name $gpoName -Comment "CIS Benchmark Level 1 - Windows Server 2022"
# GPO'yu OU'ya bağlama
$targetOU = "OU=Servers,DC=company,DC=local"
New-GPLink -Name $gpoName -Target $targetOU -LinkEnabled Yes
# LGPO.exe ile CIS baseline'ı import etme (Microsoft SCT paketinden)
# Bu adımı CIS-CAT veya SCT araçlarıyla GUI üzerinden yapmak daha güvenli
.LGPO.exe /g .CIS_WS2022_Level1_Baseline
# GPO backup alma - düzenli yapılması önerilen rutin
$backupPath = "C:GPO_Backups$(Get-Date -Format 'yyyyMMdd')"
New-Item -ItemType Directory -Path $backupPath -Force
Backup-GPO -Name $gpoName -Path $backupPath
Write-Host "GPO backup alındı: $backupPath" -ForegroundColor Green
Uyumluluk Raporlama
Audit için sadece düzeltme yapmak yetmez; kanıtlamanız da gerekiyor. Düzenli raporlama workflow’u kurmanız şart:
# Kapsamlı uyumluluk raporu oluşturan script
$reportDate = Get-Date -Format "yyyy-MM-dd"
$reportPath = "C:ComplianceReportsCIS_Report_$reportDate.html"
# HTML rapor başlığı
$htmlHeader = @"
<!DOCTYPE html>
<html>
<head>
<title>CIS Benchmark Uyumluluk Raporu - $reportDate</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.pass { color: green; font-weight: bold; }
.fail { color: red; font-weight: bold; }
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #4472C4; color: white; }
</style>
</head>
<body>
<h1>CIS Benchmark Windows Server Uyumluluk Raporu</h1>
<p>Sunucu: $env:COMPUTERNAME | Tarih: $reportDate</p>
"@
# Kontrolleri çalıştırma ve sonuçları toplama
$controls = @()
# SMBv1 kontrolü
$smb1Status = (Get-SmbServerConfiguration).EnableSMB1Protocol
$controls += [PSCustomObject]@{
ID = "CIS 2.3.7.1"
Control = "SMBv1 Protocol Disabled"
Expected = "False"
Current = $smb1Status.ToString()
Status = if (-not $smb1Status) { "PASS" } else { "FAIL" }
}
# Windows Firewall kontrolü
$fwDomain = (Get-NetFirewallProfile -Profile Domain).Enabled
$controls += [PSCustomObject]@{
ID = "CIS 9.1.1"
Control = "Windows Firewall Domain Profile Enabled"
Expected = "True"
Current = $fwDomain.ToString()
Status = if ($fwDomain) { "PASS" } else { "FAIL" }
}
# RDP NLA kontrolü
$nlaReg = Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp" -Name "UserAuthentication" -ErrorAction SilentlyContinue
$controls += [PSCustomObject]@{
ID = "CIS 18.9.65.3.9"
Control = "RDP Network Level Authentication"
Expected = "1"
Current = $nlaReg.UserAuthentication.ToString()
Status = if ($nlaReg.UserAuthentication -eq 1) { "PASS" } else { "FAIL" }
}
# Remote Registry servisi kontrolü
$remRegSvc = Get-Service -Name "RemoteRegistry" -ErrorAction SilentlyContinue
$controls += [PSCustomObject]@{
ID = "CIS 5.28"
Control = "Remote Registry Service Disabled"
Expected = "Stopped/Disabled"
Current = "$($remRegSvc.Status)/$($remRegSvc.StartType)"
Status = if ($remRegSvc.StartType -eq "Disabled") { "PASS" } else { "FAIL" }
}
$passCount = ($controls | Where-Object { $_.Status -eq "PASS" }).Count
$failCount = ($controls | Where-Object { $_.Status -eq "FAIL" }).Count
$totalCount = $controls.Count
$compliancePercent = [math]::Round(($passCount / $totalCount) * 100, 2)
$controls | Export-Csv -Path "C:ComplianceReportsCIS_Report_$reportDate.csv" -NoTypeInformation
Write-Host "Uyumluluk Orani: %$compliancePercent ($passCount/$totalCount kontrol gecti)" -ForegroundColor $(if ($compliancePercent -ge 80) { "Green" } else { "Red" })
Yaygın Tuzaklar ve Dikkat Edilmesi Gerekenler
Yıllarca CIS hardening projelerinde çalışırken karşılaştığım en sık sorunları paylaşmak istiyorum:
UAC ayarları konusunda dikkatli olun: CIS Level 2, UAC’yi en yüksek seviyeye çekmeni öneriyor. Bu, bazı eski uygulamaların çalışmasını engelleyebilir. Üretim ortamına uygulamadan önce mutlaka test ortamında deneyin.
NTLMv1 kapatmadan önce inventory yapın: Bazı eski yazıcılar, tarayıcılar ve üçüncü parti uygulamalar hala NTLMv1 kullanıyor. Kapatmadan önce ağınızda NTLMv1 kullanan cihazları tespit edin.
Event log boyutları: CIS, event log boyutlarını artırmanızı öneriyor. Security log için en az 196 MB önerilen değer. Disk kapasitesini buna göre planlayın.
Screensaver kilidi: Kulağa basit geliyor, ancak CIS kontrollerinde sıkça fail gören bir alan. 15 dakika timeout ve parola gereksinimi şart.
Windows Defender yapılandırması: CIS, Windows Defender için onlarca ayrı kontrol içeriyor. Real-time protection, cloud-based protection ve automatic sample submission ayarlarına dikkat edin.
Düzenli Bakım ve Sürdürülebilirlik
CIS uyumluluğu bir kerelik yapılan bir işlem değil, sürekli bakım gerektiren bir süreç. Benim önerdiğim rutin:
- Haftalık: Otomatik CIS-CAT taraması, sonuçların SIEM’e gönderilmesi
- Aylık: Yeni CIS Benchmark versiyonlarının takibi, değişen kontrollerin değerlendirilmesi
- Üç aylık: Kapsamlı uyumluluk raporu, yönetim özeti hazırlanması
- Yıllık: Tam hardening gözden geçirmesi, yeni tehdit vektörlerine göre kontrollerin güncellenmesi
Ayrıca Windows Update sürecinizin CIS hardening ayarlarını bozmadığından emin olun. Büyük Windows güncellemeleri bazen güvenlik ayarlarını sıfırlayabiliyor.
Sonuç
CIS Benchmark uyumluluğu, Windows Server güvenliğinin temel taşı. Sıfırdan başlayanlara tavsiyem: önce mevcut durumu ölçün, sonra kritik fail’lere odaklanın. Her şeyi bir anda yapmaya çalışmak hem riskli hem de sürdürülemez.
Level 1 kontrollerinden başlayıp sistematik bir şekilde ilerlediğinizde, çoğu ortamda üç ila altı ay içinde yüzde seksenin üzerinde uyumluluk oranına ulaşmak mümkün. Bu noktadan sonra Level 2 kontrolleri ve ortama özgü ek hardening adımlarına geçebilirsiniz.
Unutmayın: güvenlik uyumluluğu bir hedef değil, süreç. CIS Benchmark sizi doğru yöne işaret ediyor; ama yolculuk asla bitmiyor. Yeni vulnerabilityler, yeni saldırı teknikleri ve değişen iş gereksinimleri her zaman gözden geçirme yapmanızı zorunlu kılacak. Bu yüzden otomasyon ve düzenli raporlama altyapısını kurmak, uzun vadede en değerli yatırımlarınızdan biri olacak.