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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir