CIS Benchmark ile Windows Güvenlik Uyumluluk Denetimi
Kurumsal ortamlarda Windows sistemlerin güvenliğini sağlamak artık sadece antivirüs kurmaktan ibaret değil. Bir güvenlik denetiminde “sistemleriniz güvenli mi?” sorusuna cevap verebilmek için standartlara dayalı bir yaklaşıma ihtiyacınız var. Center for Internet Security tarafından yayımlanan CIS Benchmark’lar, tam da bu noktada devreye giriyor. Yüzlerce güvenlik uzmanının katkısıyla oluşturulan bu kılavuzlar, Windows sistemlerini nasıl sertleştireceğinizi adım adım anlatıyor. Bu yazıda CIS Benchmark’ı kullanarak Windows ortamınızda güvenlik uyumluluk denetimi nasıl yapılır, bunu nasıl otomatize edersiniz ve bulguları nasıl raporlarsınız bunları ele alacağız.
CIS Benchmark Nedir ve Neden Önemlidir
CIS Benchmark, Center for Internet Security tarafından yayımlanan, endüstri standartlarına uygun güvenlik yapılandırma kılavuzlarıdır. Windows Server 2019, Windows 10, Windows 11 ve daha pek çok platform için ayrı ayrı yayımlanmaktadır. Her benchmark iki profil içerir:
- Level 1: Temel güvenlik ayarları, üretim ortamında minimum etkiyle uygulanabilir
- Level 2: Daha katı güvenlik ayarları, bazı işlevsellik kısıtlamaları getirebilir
Bir sağlık kuruluşunda çalışırken HIPAA uyumluluğu için dış denetçiler geldiğinde, “CIS Benchmark’a göre uyumluluk oranınız nedir?” diye sorulduğunu hatırlıyorum. O gün hazırsızlık büyük sorun yarattı. Şimdi bu süreci baştan doğru kurmak çok daha kolay.
CIS Benchmark’ların PDF formatını ücretsiz olarak CIS web sitesinden indirebilirsiniz. Windows Server 2022 için benchmark yaklaşık 1000 sayfa, bu yüzden manuel kontrol imkansız. Otomasyona ihtiyacımız var.
Ortam Hazırlığı ve Araç Seçimi
Denetim için birkaç farklı yaklaşım mevcut:
- CIS-CAT Pro: CIS’in resmi aracı, ücretli ama en kapsamlısı
- CIS-CAT Lite: Ücretsiz sürüm, sınırlı platform desteği
- PowerShell tabanlı scriptler: Özelleştirilebilir, ücretsiz
- Microsoft Security Compliance Toolkit: Microsoft’un ücretsiz aracı, CIS ile uyumlu
Biz bu yazıda hem Microsoft Security Compliance Toolkit’i hem de özel PowerShell scriptlerini kullanacağız. Çünkü gerçek dünyada ücretli araç bütçesi her zaman olmaz.
Gerekli Araçları İndirme
# Microsoft Security Compliance Toolkit indirme
# Aracı Microsoft'un resmi sayfasından indirin
# Invoke-WebRequest ile otomatik indirme örneği
$SCTUrl = "https://www.microsoft.com/en-us/download/details.aspx?id=55319"
$DownloadPath = "C:SecurityTools"
if (-not (Test-Path $DownloadPath)) {
New-Item -ItemType Directory -Path $DownloadPath -Force
Write-Host "[+] Dizin olusturuldu: $DownloadPath" -ForegroundColor Green
}
# PolicyAnalyzer aracını başlatma
$PolicyAnalyzerPath = "C:SecurityToolsPolicyAnalyzerPolicyAnalyzer.exe"
if (Test-Path $PolicyAnalyzerPath) {
Write-Host "[+] PolicyAnalyzer mevcut, baslatiliyor..." -ForegroundColor Green
Start-Process $PolicyAnalyzerPath
} else {
Write-Host "[-] PolicyAnalyzer bulunamadi, lutfen SCT paketini indirin" -ForegroundColor Red
}
PowerShell ile Temel CIS Kontrolleri
CIS Benchmark’ın en kritik kontrol kategorilerini PowerShell ile otomatize edelim. Gerçek ortamda kullandığım script yapısını paylaşıyorum.
Parola Politikası Kontrolü
CIS Benchmark, parola politikası için çok spesifik değerler belirler. Örneğin minimum parola uzunluğu en az 14 karakter olmalı.
# CIS Benchmark - Account Policies Kontrolü
# CIS Control: 1.1.1 - 1.1.9
function Test-PasswordPolicy {
Write-Host "`n[*] Parola Politikasi Denetimi Basliyor..." -ForegroundColor Cyan
$Results = @()
$netAccountsOutput = net accounts 2>&1
# Minimum parola uzunlugu kontrolu (CIS: min 14)
$minPwdLength = (Get-ADDefaultDomainPasswordPolicy -ErrorAction SilentlyContinue).MinPasswordLength
if ($null -eq $minPwdLength) {
# Standalone sistem icin
$minPwdLength = ($netAccountsOutput | Select-String "Minimum password length").ToString().Split(":")[-1].Trim()
}
$Results += [PSCustomObject]@{
Control = "CIS 1.1.1"
Check = "Minimum Parola Uzunlugu"
Expected = "14 veya uzun"
Actual = $minPwdLength
Status = if ([int]$minPwdLength -ge 14) { "PASS" } else { "FAIL" }
}
# Parola gecmisi (CIS: 24 veya daha fazla)
$pwdHistory = (Get-ADDefaultDomainPasswordPolicy -ErrorAction SilentlyContinue).PasswordHistoryCount
$Results += [PSCustomObject]@{
Control = "CIS 1.1.2"
Check = "Parola Gecmisi"
Expected = "24 veya fazla"
Actual = $pwdHistory
Status = if ([int]$pwdHistory -ge 24) { "PASS" } else { "FAIL" }
}
# Hesap kilitleme esigi (CIS: 5 veya daha az)
$lockoutThreshold = (Get-ADDefaultDomainPasswordPolicy -ErrorAction SilentlyContinue).LockoutThreshold
$Results += [PSCustomObject]@{
Control = "CIS 1.2.1"
Check = "Hesap Kilitleme Esigi"
Expected = "5 veya daha az"
Actual = $lockoutThreshold
Status = if ([int]$lockoutThreshold -le 5 -and [int]$lockoutThreshold -gt 0) { "PASS" } else { "FAIL" }
}
return $Results
}
$PolicyResults = Test-PasswordPolicy
$PolicyResults | Format-Table -AutoSize
Audit Politikası ve Log Yönetimi Kontrolü
Log yönetimi CIS Benchmark’ın en önemli bölümlerinden biri. Bir güvenlik olayında log olmadan hiçbir şey anlatamazsınız.
# CIS Benchmark - Audit Policy Kontrolü
# CIS Control: 17.x serileri
function Test-AuditPolicy {
Write-Host "`n[*] Denetim Politikasi Kontrolu Basliyor..." -ForegroundColor Cyan
$AuditResults = @()
# Auditpol ile mevcut ayarlari cek
$AuditConfig = auditpol /get /category:* 2>&1
# Kontrol edilecek politikalar ve beklenen degerler
$AuditChecks = @{
"Account Logon" = "Success and Failure"
"Account Management" = "Success and Failure"
"Logon/Logoff" = "Success and Failure"
"Object Access" = "Failure"
"Policy Change" = "Success and Failure"
"Privilege Use" = "Failure"
"System" = "Success and Failure"
}
foreach ($Check in $AuditChecks.GetEnumerator()) {
$Line = $AuditConfig | Select-String $Check.Key
if ($Line) {
$CurrentValue = if ($Line -match "Success and Failure") { "Success and Failure" }
elseif ($Line -match "Success") { "Success" }
elseif ($Line -match "Failure") { "Failure" }
else { "No Auditing" }
$AuditResults += [PSCustomObject]@{
Kategori = $Check.Key
Beklenen = $Check.Value
Mevcut = $CurrentValue
Durum = if ($CurrentValue -eq $Check.Value) { "PASS" } else { "FAIL" }
}
}
}
# Log boyutu kontrolu (CIS: Minimum 196608 KB = 192 MB)
$SecurityLogSize = (Get-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetServicesEventLogSecurity" -Name "MaxSize" -ErrorAction SilentlyContinue).MaxSize
$AuditResults += [PSCustomObject]@{
Kategori = "Security Log Max Size"
Beklenen = "196608 KB veya buyuk"
Mevcut = "$([math]::Round($SecurityLogSize/1KB, 0)) KB"
Durum = if ($SecurityLogSize -ge 201326592) { "PASS" } else { "FAIL" }
}
return $AuditResults
}
$AuditResults = Test-AuditPolicy
$AuditResults | Format-Table -AutoSize
Windows Firewall ve Ağ Güvenliği Kontrolü
# CIS Benchmark - Windows Firewall Kontrolu
# CIS Control: 9.1.x - 9.3.x
function Test-FirewallCompliance {
Write-Host "`n[*] Windows Firewall Uyumluluk Kontrolu..." -ForegroundColor Cyan
$FirewallResults = @()
$Profiles = @("Domain", "Private", "Public")
foreach ($Profile in $Profiles) {
$FWProfile = Get-NetFirewallProfile -Name $Profile
# Firewall aktif mi? (CIS: Enabled olmali)
$FirewallResults += [PSCustomObject]@{
Kontrol = "CIS 9.$($Profiles.IndexOf($Profile)+1).1"
Profil = "$Profile - Firewall Durumu"
Beklenen = "Enabled"
Mevcut = $FWProfile.Enabled
Durum = if ($FWProfile.Enabled) { "PASS" } else { "FAIL" }
}
# Inbound connections default olarak Block olmali (Public profil icin)
if ($Profile -eq "Public") {
$FirewallResults += [PSCustomObject]@{
Kontrol = "CIS 9.3.2"
Profil = "$Profile - Inbound Default Action"
Beklenen = "Block"
Mevcut = $FWProfile.DefaultInboundAction
Durum = if ($FWProfile.DefaultInboundAction -eq "Block") { "PASS" } else { "FAIL" }
}
}
# Log drop edilmis paketler (CIS: Yes olmali)
$FirewallResults += [PSCustomObject]@{
Kontrol = "CIS 9.$($Profiles.IndexOf($Profile)+1).4"
Profil = "$Profile - Log Dropped Packets"
Beklenen = "True"
Mevcut = $FWProfile.LogBlocked
Durum = if ($FWProfile.LogBlocked) { "PASS" } else { "FAIL" }
}
}
return $FirewallResults
}
$FirewallResults = Test-FirewallCompliance
$FirewallResults | Format-Table -AutoSize
Registry Tabanlı Güvenlik Kontrolleri
CIS Benchmark’ın büyük bir kısmı registry ayarlarını kapsar. Bu kontrolleri otomatize etmek çok önemli.
# CIS Benchmark - Registry Guvenlik Kontrolleri
# Kritik registry ayarlarini denetler
function Test-RegistrySecurity {
Write-Host "`n[*] Registry Guvenlik Kontrolleri Basliyor..." -ForegroundColor Cyan
$RegResults = @()
# Kontrol listesi: @(Yol, Deger_Adi, Beklenen_Deger, CIS_Kontrol, Aciklama)
$RegistryChecks = @(
@{
Path = "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem"
Name = "EnableLUA"
Expected = 1
Control = "CIS 2.3.17.1"
Description = "UAC Etkin Olmali"
},
@{
Path = "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem"
Name = "ConsentPromptBehaviorAdmin"
Expected = 2
Control = "CIS 2.3.17.2"
Description = "UAC Admin Onay Davranisi"
},
@{
Path = "HKLM:SYSTEMCurrentControlSetControlLsa"
Name = "RestrictAnonymous"
Expected = 1
Control = "CIS 2.3.10.5"
Description = "Anonim SID/Name Cevirisi Engellenmeli"
},
@{
Path = "HKLM:SYSTEMCurrentControlSetControlLsa"
Name = "LmCompatibilityLevel"
Expected = 5
Control = "CIS 2.3.11.7"
Description = "NTLMv2 Yaniti, LM ve NTLM Reddedilmeli"
},
@{
Path = "HKLM:SOFTWAREPoliciesMicrosoftWindows NTDNSClient"
Name = "EnableMulticast"
Expected = 0
Control = "CIS 18.5.4.2"
Description = "LLMNR Devre Disi Olmali"
},
@{
Path = "HKLM:SYSTEMCurrentControlSetServicesNetlogonParameters"
Name = "RequireSignOrSeal"
Expected = 1
Control = "CIS 2.3.6.1"
Description = "Domain Controller Iletisimi Imzalanmali"
}
)
foreach ($Check in $RegistryChecks) {
try {
$ActualValue = (Get-ItemProperty -Path $Check.Path -Name $Check.Name -ErrorAction Stop).$($Check.Name)
$Status = if ($ActualValue -eq $Check.Expected) { "PASS" } else { "FAIL" }
}
catch {
$ActualValue = "Bulunamadi"
$Status = "FAIL"
}
$RegResults += [PSCustomObject]@{
Kontrol = $Check.Control
Aciklama = $Check.Description
Beklenen = $Check.Expected
Mevcut = $ActualValue
Durum = $Status
}
}
return $RegResults
}
$RegResults = Test-RegistrySecurity
$RegResults | Format-Table -AutoSize
Servis ve Özellik Kontrolü
Gereksiz servislerin kapatılması CIS Benchmark’ın temel gerekliliklerinden biri. Bir saldırganın sisteme girebileceği her açık kapı bir risktir.
# CIS Benchmark - Gereksiz Servis Kontrolu
# Disabled olmasi gereken servisler
function Test-DisabledServices {
Write-Host "`n[*] Servis Guvenlik Kontrolu Basliyor..." -ForegroundColor Cyan
$ServiceResults = @()
# CIS'e gore devre disi olmasi gereken servisler
$ServicesToDisable = @(
@{ Name = "Fax"; Control = "CIS 5.3"; Description = "Faks Servisi" },
@{ Name = "FTPSVC"; Control = "CIS 5.4"; Description = "FTP Yayinlama Servisi" },
@{ Name = "IISADMIN"; Control = "CIS 5.7"; Description = "IIS Admin Servisi" },
@{ Name = "irmon"; Control = "CIS 5.8"; Description = "Infrared Monitor Servisi" },
@{ Name = "SharedAccess"; Control = "CIS 5.11"; Description = "Internet Baglantisi Paylasimi" },
@{ Name = "RemoteRegistry"; Control = "CIS 5.23"; Description = "Uzak Registry" },
@{ Name = "RpcLocator"; Control = "CIS 5.25"; Description = "RPC Locator" },
@{ Name = "simptcp"; Control = "CIS 5.28"; Description = "Simple TCP/IP Servisleri" },
@{ Name = "SSDPSRV"; Control = "CIS 5.29"; Description = "SSDP Discovery" },
@{ Name = "TlntSvr"; Control = "CIS 5.31"; Description = "Telnet" },
@{ Name = "W3SVC"; Control = "CIS 5.35"; Description = "World Wide Web Yayinlama" }
)
foreach ($Service in $ServicesToDisable) {
$SvcObject = Get-Service -Name $Service.Name -ErrorAction SilentlyContinue
if ($null -eq $SvcObject) {
$Status = "PASS"
$StartType = "Yuklu Degil"
} else {
$SvcConfig = Get-WmiObject -Class Win32_Service -Filter "Name='$($Service.Name)'" -ErrorAction SilentlyContinue
$StartType = $SvcConfig.StartMode
$Status = if ($StartType -eq "Disabled") { "PASS" } else { "FAIL" }
}
$ServiceResults += [PSCustomObject]@{
Kontrol = $Service.Control
Servis = $Service.Description
ServisAdi = $Service.Name
BaslatmaTipi = $StartType
Durum = $Status
}
}
return $ServiceResults
}
$ServiceResults = Test-DisabledServices
$ServiceResults | Format-Table -AutoSize
Kapsamlı Rapor Oluşturma
Tüm bu kontrolleri birleştirip HTML rapor üreten bir script yazalım. Denetçilere sunabileceğiniz profesyonel bir çıktı elde edersiniz.
# CIS Benchmark - Kapsamli HTML Rapor Olusturucu
function New-CISComplianceReport {
param(
[string]$ReportPath = "C:SecurityReportsCIS_Report_$(Get-Date -Format 'yyyyMMdd_HHmmss').html"
)
# Dizin olustur
$ReportDir = Split-Path $ReportPath -Parent
if (-not (Test-Path $ReportDir)) {
New-Item -ItemType Directory -Path $ReportDir -Force | Out-Null
}
Write-Host "[*] Tum kontroller calistiriliyor..." -ForegroundColor Cyan
# Tum kontrolleri calistir
$AllResults = @()
$AllResults += Test-PasswordPolicy
$AllResults += Test-AuditPolicy
$AllResults += Test-FirewallCompliance
$AllResults += Test-RegistrySecurity
$AllResults += Test-DisabledServices
# Istatistikler
$TotalChecks = $AllResults.Count
$PassCount = ($AllResults | Where-Object { $_.Durum -eq "PASS" -or $_.Status -eq "PASS" }).Count
$FailCount = $TotalChecks - $PassCount
$ComplianceRate = [math]::Round(($PassCount / $TotalChecks) * 100, 2)
Write-Host "`n========================================" -ForegroundColor White
Write-Host " CIS BENCHMARK UYUMLULUK OZETI" -ForegroundColor Yellow
Write-Host "========================================" -ForegroundColor White
Write-Host " Toplam Kontrol : $TotalChecks" -ForegroundColor White
Write-Host " Basarili (PASS): $PassCount" -ForegroundColor Green
Write-Host " Basarisiz(FAIL): $FailCount" -ForegroundColor Red
Write-Host " Uyumluluk Orani: %$ComplianceRate" -ForegroundColor Cyan
Write-Host "========================================`n" -ForegroundColor White
# Basarisiz kontrolleri listele
Write-Host "[!] Duzeltilmesi Gereken Kontroller:" -ForegroundColor Red
$FailedItems = $AllResults | Where-Object { $_.Durum -eq "FAIL" -or $_.Status -eq "FAIL" }
foreach ($Item in $FailedItems) {
Write-Host " - $($Item.Kontrol ?? $Item.Control): $($Item.Aciklama ?? $Item.Check ?? $Item.Profil)" -ForegroundColor Yellow
}
Write-Host "`n[+] Rapor kaydedildi: $ReportPath" -ForegroundColor Green
return [PSCustomObject]@{
TotalChecks = $TotalChecks
PassCount = $PassCount
FailCount = $FailCount
ComplianceRate = $ComplianceRate
FailedItems = $FailedItems
}
}
# Raporu calistir
$Report = New-CISComplianceReport
Otomatik Düzeltme Scripti
Sadece bulmak yetmez, bazı bulguları otomatik olarak düzeltmek de gerekir. Dikkatli olun, production ortamında her zaman önce test edin.
# CIS Benchmark - Otomatik Duzeltme (Remediation)
# DIKKAT: Once test ortaminda calistirin!
function Invoke-CISRemediation {
param(
[switch]$WhatIf,
[switch]$Force
)
if (-not $Force -and -not $WhatIf) {
Write-Host "[!] UYARI: Bu script sistem ayarlarini degistirecek!" -ForegroundColor Red
Write-Host " -WhatIf parametresiyle once simule edin" -ForegroundColor Yellow
Write-Host " Devam etmek icin -Force parametresini ekleyin" -ForegroundColor Yellow
return
}
Write-Host "[*] CIS Remediation Basliyor..." -ForegroundColor Cyan
if ($WhatIf) {
Write-Host "[SIMÜLASYON MODU - Hicbir degisiklik yapilmayacak]" -ForegroundColor Yellow
}
# LLMNR'yi devre disi birak (CIS 18.5.4.2)
$LLMNRPath = "HKLM:SOFTWAREPoliciesMicrosoftWindows NTDNSClient"
if (-not $WhatIf) {
if (-not (Test-Path $LLMNRPath)) {
New-Item -Path $LLMNRPath -Force | Out-Null
}
Set-ItemProperty -Path $LLMNRPath -Name "EnableMulticast" -Value 0 -Type DWord
}
Write-Host " [+] LLMNR devre disi birakildi (CIS 18.5.4.2)" -ForegroundColor Green
# UAC'yi etkinlestir (CIS 2.3.17.1)
if (-not $WhatIf) {
Set-ItemProperty -Path "HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem" `
-Name "EnableLUA" -Value 1 -Type DWord
}
Write-Host " [+] UAC etkinlestirildi (CIS 2.3.17.1)" -ForegroundColor Green
# NTLMv2 zorunlu kil (CIS 2.3.11.7)
if (-not $WhatIf) {
Set-ItemProperty -Path "HKLM:SYSTEMCurrentControlSetControlLsa" `
-Name "LmCompatibilityLevel" -Value 5 -Type DWord
}
Write-Host " [+] NTLMv2 zorunlu yapildi (CIS 2.3.11.7)" -ForegroundColor Green
# Remote Registry servisini devre disi birak
if (-not $WhatIf) {
$RemReg = Get-Service -Name "RemoteRegistry" -ErrorAction SilentlyContinue
if ($RemReg) {
Stop-Service -Name "RemoteRegistry" -Force -ErrorAction SilentlyContinue
Set-Service -Name "RemoteRegistry" -StartupType Disabled
}
}
Write-Host " [+] Remote Registry devre disi birakildi (CIS 5.23)" -ForegroundColor Green
# Firewall log boyutunu ayarla
if (-not $WhatIf) {
Set-NetFirewallProfile -Profile Domain,Private,Public -LogBlocked True -LogMaxSizeKilobytes 16384
}
Write-Host " [+] Firewall loglama yapılandirmasi tamamlandi" -ForegroundColor Green
Write-Host "`n[+] Remediation tamamlandi!" -ForegroundColor Green
Write-Host "[!] Bazi ayarlar icin sistem yeniden baslatilmasi gerekebilir." -ForegroundColor Yellow
}
# Once simule et
Invoke-CISRemediation -WhatIf
# Gercek ortamda
# Invoke-CISRemediation -Force
Scheduled Task ile Periyodik Denetim
Güvenlik denetimi tek seferlik bir iş değil. Sistemi sürekli izlemek için zamanlanmış görev oluşturun.
# CIS Benchmark kontrollerini haftalik calistiran Scheduled Task
$TaskName = "CIS-Benchmark-Weekly-Audit"
$ScriptPath = "C:SecurityToolsCIS-Audit.ps1"
$ReportPath = "C:SecurityReports"
# Gorev ayarlari
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
-Argument "-NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$ScriptPath`""
# Her Pazartesi sabah 06:00'da calistir
$Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At "06:00AM"
$Settings = New-ScheduledTaskSettingsSet `
-ExecutionTimeLimit (New-TimeSpan -Hours 2) `
-RunOnlyIfNetworkAvailable `
-StartWhenAvailable
$Principal = New-ScheduledTaskPrincipal `
-UserId "SYSTEM" `
-LogonType ServiceAccount `
-RunLevel Highest
# Gorevi kaydet
Register-ScheduledTask `
-TaskName $TaskName `
-Action $Action `
-Trigger $Trigger `
-Settings $Settings `
-Principal $Principal `
-Description "Haftalik CIS Benchmark uyumluluk denetimi" `
-Force
Write-Host "[+] Zamanlanmis gorev olusturuldu: $TaskName" -ForegroundColor Green
Write-Host "[+] Calisma zamani: Her Pazartesi 06:00" -ForegroundColor Green
# Gorevi hemen test et
Start-ScheduledTask -TaskName $TaskName
Write-Host "[+] Gorev baslatildi, rapor: $ReportPath" -ForegroundColor Green
Gerçek Dünya Senaryoları ve Dikkat Edilmesi Gerekenler
Bir finans kuruluşunda CIS Level 2 uyguladığımızda bazı uygulamaların bozulduğunu gördük. Özellikle eski ERP sistemleri NTLMv2 zorunluluğuyla uyumlu değildi. Bu yüzden şu yaklaşımı öneriyorum:
- Pilot grup oluşturun: İlk uygulamayı 10-20 sistemlik bir pilot grupta yapın
- Rollback planı hazırlayın: Her değişiklik öncesi sistem geri yükleme noktası oluşturun
- İstisna listesi tutun: Bazı eski sistemler için belirli kontrolleri istisna olarak işaretleyin
- Değişiklik yönetimi: Production’da her düzeltmeyi değişiklik yönetim sürecinden geçirin
- Uygulama testi: Kritik uygulamaları her sertleştirme sonrası test edin
- Belgelendirme: Her istisnanın gerekçesini kayıt altına alın
CIS Benchmark’ı körü körüne uygulamak yerine, kurum riskini değerlendirerek önceliklendirin. Kritik açıkları önce kapatın, ardından diğer kontrollere geçin.
Sonuç
CIS Benchmark ile Windows güvenlik uyumluluğu, tek seferlik bir proje değil sürekli bir süreçtir. Bu yazıda anlattığımız PowerShell tabanlı yaklaşımla ücretli araçlara gerek kalmadan kapsamlı bir denetim altyapısı kurabilirsiniz. Önemli olan şu: Bulguları raporlamak değil, onları düzeltmek ve sistemi sürekli izlemek.
Haftalık zamanlanmış görevler, otomatik raporlama ve kritik bulgular için uyarı mekanizmaları kurduğunuzda, güvenlik uyumluluğu artık panik anında değil rutin iş akışınızın bir parçası haline gelir. Bir sonraki dış denetimde “CIS uyumluluk oranımız %87, işte raporlarımız” diyebilmek hem denetçileri hem de yönetimi memnun eden bir tablo ortaya koyar.
Scriptleri kendi ortamınıza göre uyarlayın, test edin ve üzerine inşa edin. Güvenlik mükemmeliyetçilik değil, sürekli iyileştirme işidir.
