Windows Defender Application Control Yapılandırması
Kurumsal ortamlarda kötü amaçlı yazılımların önüne geçmek için uygulama beyaz listesi artık bir lüks değil, zorunluluk haline geldi. Windows Defender Application Control (WDAC), Microsoft’un bu ihtiyaca verdiği en kapsamlı yanıt. AppLocker’ın yerini almaya başlayan bu teknoloji, kernel düzeyinde çalışarak çok daha güçlü bir koruma katmanı sunuyor. Bu yazıda WDAC’ı sıfırdan yapılandırmayı, politika oluşturmayı ve kurumsal ortama yaymayı ele alacağız.
WDAC Nedir ve AppLocker’dan Farkı Ne?
WDAC, Windows 10 1709 ve sonrasında gelen bir güvenlik özelliği. Temel amacı, sistemde hangi uygulamaların ve sürücülerin çalışabileceğini kontrol etmek. AppLocker kullanıcı modunda çalışırken, WDAC Hypervisor-Protected Code Integrity (HVCI) ile birlikte kernel modunda devreye giriyor. Bu fark son derece kritik çünkü yeterli yetkiye sahip bir saldırgan AppLocker politikalarını bypass edebilirken, WDAC’ı atlatmak çok daha zor.
Temel farkları özetleyecek olursak:
- AppLocker: Kullanıcı bazlı kural desteği var, Group Policy ile kolay yönetim, ama kernel bypass açığı mevcut
- WDAC: Makine bazlı çalışır, kullanıcı ayrımı yok, kernel seviyesinde koruma, HVCI ile donanım destekli güvenlik
- WDAC + AppLocker: İkisi birlikte kullanıldığında WDAC politikası öncelik alır
- Lisans gereksinimi: WDAC Windows 10/11 Home dahil tüm sürümlerde çalışır, AppLocker Enterprise gerektirir
Ortam Hazırlığı ve Önkoşullar
Başlamadan önce ortamı hazırlamak gerekiyor. Test ortamı olmadan production’a geçmek büyük risk. Ben her zaman şu sırayı takip ediyorum: Audit modu, pilot grup, sonra zorunlu uygulama.
PowerShell modülünün yüklü olup olmadığını kontrol edelim:
# WDAC PowerShell modülünü kontrol et
Get-Module -ListAvailable -Name ConfigCI
# Modül yoksa yükle
Install-Module -Name ConfigCI -Force
# Mevcut CI politikalarını listele
Get-CIPolicy -FilePath "C:WindowsSystem32CodeIntegritySIPolicy.p7b"
Sistemin HVCI desteğini kontrol etmek için:
# HVCI durumunu kontrol et
$hvciStatus = Get-WmiObject -Class Win32_DeviceGuard -Namespace rootMicrosoftWindowsDeviceGuard
$hvciStatus.VirtualizationBasedSecurityStatus
$hvciStatus.CodeIntegrityPolicyEnforcementStatus
# Sistemi hazırlamak için gerekli Windows özelliklerini kontrol et
Get-WindowsOptionalFeature -Online -FeatureName "Windows-Defender-ApplicationGuard"
Temel Politika Oluşturma
WDAC politikası XML formatında yazılır ve sonra binary formata (.p7b) derlenir. Microsoft’un hazır şablonlarından başlamak en mantıklı yol.
Varsayılan Politika Şablonlarını Kullanma
Windows, birkaç hazır politika şablonu sunuyor. Bunları başlangıç noktası olarak kullanabilirsiniz:
# Varsayılan politika şablonlarının bulunduğu dizin
$templatePath = "C:WindowsschemasCodeIntegrityExamplePolicies"
Get-ChildItem $templatePath
# DefaultWindows politikasını kopyala ve düzenle
$policyPath = "C:WDACPolicies"
New-Item -ItemType Directory -Path $policyPath -Force
Copy-Item "$templatePathDefaultWindows_Enforced.xml" "$policyPathMyCorpPolicy.xml"
DefaultWindows şablonu yalnızca Windows bileşenlerini ve Microsoft imzalı uygulamaları çalıştırır. Kurumsal ortam için bu genellikle yeterli değil, özel uygulamalar için kural eklemeniz gerekiyor.
Mevcut Sistemden Politika Oluşturma
Temiz bir referans sisteminden mevcut yüklü uygulamaları tarayarak politika oluşturmak en pratik yöntem:
# Mevcut sistemi tarayarak politika oluştur
$scanPath = "C:Program Files"
$outputPolicy = "C:WDACPoliciesScannedPolicy.xml"
New-CIPolicy -ScanPath $scanPath `
-Level Publisher `
-Fallback Hash `
-FilePath $outputPolicy `
-UserPEs `
-Audit
# Birden fazla dizini tara
New-CIPolicy -ScanPath "C:Program Files", "C:Program Files (x86)" `
-Level Publisher `
-Fallback Hash `
-FilePath "C:WDACPoliciesFullScanPolicy.xml" `
-MultiplePolicyFormat
-Level parametresi oldukça önemli. Hangi seviyede kuralların oluşturulacağını belirliyor:
- Hash: En kısıtlayıcı, her dosyanın hash değeri kontrol edilir, güncelleme sonrası yeniden politika oluşturmak gerekebilir
- FileName: Dosya adına göre kural, kolay bypass edilebilir, tavsiye edilmez
- Publisher: Yayıncı sertifikasına göre, güncelleme dostu, çoğu kurumsal ortam için ideal
- FilePublisher: Yayıncı ve dosya adı kombinasyonu, daha granüler kontrol
- WHQLPublisher: Yalnızca WHQL imzalı sürücüler için
Audit Modunda Test Etme
Politikayı direkt enforcement modunda açmak felakete davet çıkarmak demek. Önce audit modunda çalıştırıp nelerin bloklanacağını görmek şart.
# Politikayı audit moduna al
Set-RuleOption -FilePath "C:WDACPoliciesMyCorpPolicy.xml" -Option 3
# Option 3 = Audit Mode Enabled
# Politikayı binary formata derle
ConvertFrom-CIPolicy -XmlFilePath "C:WDACPoliciesMyCorpPolicy.xml" `
-BinaryFilePath "C:WDACCompiledSIPolicy.p7b"
# Politikayı sisteme uygula
Copy-Item "C:WDACCompiledSIPolicy.p7b" `
"C:WindowsSystem32CodeIntegritySIPolicy.p7b"
# Değişikliğin etkili olması için yeniden başlatma gerekebilir
# Önce test edelim
citool.exe --update-policy "C:WDACCompiledSIPolicy.p7b"
Audit loglarını incelemek için Event Viewer’ı kullanabilirsiniz. Kritik log kanalları:
# WDAC olaylarını PowerShell ile sorgula
Get-WinEvent -LogName "Microsoft-Windows-CodeIntegrity/Operational" |
Where-Object { $_.Id -eq 3076 } |
Select-Object TimeCreated, Message |
Format-List
# Daha detaylı analiz için
Get-WinEvent -LogName "Microsoft-Windows-CodeIntegrity/Operational" |
Where-Object { $_.Id -in @(3076, 3077, 3089) } |
ForEach-Object {
[PSCustomObject]@{
Time = $_.TimeCreated
EventId = $_.Id
Message = $_.Message
}
} | Export-Csv "C:WDACAuditResultswdac_audit.csv" -NoTypeInformation
Event ID’leri şu anlama geliyor:
- 3076: Audit modunda bloklanacak uygulama (enforcement’ta blok olurdu)
- 3077: Enforcement modunda bloklandı
- 3089: İmza bilgisi
- 3099: Politika yüklendi
Politika Kurallarını Özelleştirme
Gerçek dünyada her zaman istisnalar gerekiyor. Kurumsal uygulamalar, in-house yazılımlar, script tabanlı araçlar bunların hepsi için ayrı kurallar yazmanız gerekebilir.
Hash Tabanlı Kural Ekleme
# Belirli bir dosya için hash kuralı ekle
$appPath = "C:CustomAppsInternalTool.exe"
$fileInfo = Get-AppLockerFileInformation -Path $appPath
# Yeni kural oluştur ve mevcut politikaya ekle
New-CIPolicyRule -DriverFilePath $appPath `
-Level Hash |
Add-SignerRule -FilePath "C:WDACPoliciesMyCorpPolicy.xml" `
-User
# Alternatif: Dizin bazlı hash taraması
$rules = New-CIPolicyRule -FilePathRule "C:CustomApps*"
Merge-CIPolicy -PolicyPaths "C:WDACPoliciesMyCorpPolicy.xml" `
-OutputFilePath "C:WDACPoliciesMyCorpPolicy_Updated.xml" `
-Rules $rules
Yayıncı (Publisher) Tabanlı Kural Ekleme
Bir yazılım firmasının tüm uygulamalarına izin vermek için:
# Belirli bir yayıncının tüm uygulamalarına izin ver
$publisherRule = New-CIPolicyRule -DriverFilePath "C:Program FilesVendorAppapp.exe" `
-Level Publisher
# Kuralı mevcut politikaya birleştir
Merge-CIPolicy -PolicyPaths "C:WDACPoliciesBasePolicy.xml" `
-OutputFilePath "C:WDACPoliciesMergedPolicy.xml" `
-Rules $publisherRule
# Politika seçeneklerini ayarla
# Option 0: Enabled:UMCI (User Mode Code Integrity)
# Option 1: Enabled:Boot Menu Protection
# Option 2: Required:WHQL
# Option 6: Enabled:Unsigned System Integrity Policy
Set-RuleOption -FilePath "C:WDACPoliciesMergedPolicy.xml" -Option 0
Set-RuleOption -FilePath "C:WDACPoliciesMergedPolicy.xml" -Option 6
Çoklu Politika Yapısı (Multiple Policy Format)
Windows 10 1903 ve sonrasında birden fazla politika aynı anda aktif olabiliyor. Bu özellik büyük kurumlar için son derece kullanışlı. Örneğin temel bir politika tüm makinalara, departman bazlı ek politikalar ise belirli gruplara uygulanabilir.
# Temel politika oluştur (Base Policy)
$basePolicy = "C:WDACPoliciesBasePolicy.xml"
Copy-Item "C:WindowsschemasCodeIntegrityExamplePoliciesDefaultWindows_Enforced.xml" $basePolicy
# Politika GUID'ini ayarla
Set-CIPolicyIdInfo -FilePath $basePolicy `
-PolicyName "Corp Base Policy" `
-PolicyId "Base-Corp-2024"
# Ek politika oluştur (Supplemental Policy)
$suppPolicy = "C:WDACPoliciesDevTeamPolicy.xml"
New-CIPolicy -ScanPath "C:DevTools" `
-Level Publisher `
-FilePath $suppPolicy `
-MultiplePolicyFormat
# Ek politikayı temel politikaya bağla
Set-CIPolicyIdInfo -FilePath $suppPolicy `
-SupplementsBasePolicyID (Get-CIPolicyIdInfo -FilePath $basePolicy).PolicyId
# Her iki politikayı derle
ConvertFrom-CIPolicy -XmlFilePath $basePolicy `
-BinaryFilePath "C:WDACCompiledBasePolicy.cip"
ConvertFrom-CIPolicy -XmlFilePath $suppPolicy `
-BinaryFilePath "C:WDACCompiledDevTeamPolicy.cip"
Group Policy ile Kurumsal Dağıtım
Tek bir makinede test ettikten sonra kurumsal dağıtım için Group Policy en pratik yol. Intune kullanıyorsanız CSP üzerinden de dağıtabilirsiniz.
# GPO ile dağıtım için politika dosyasını network share'e koy
$networkShare = "\dc01SYSVOLcorp.localWDAC"
New-Item -ItemType Directory -Path $networkShare -Force
Copy-Item "C:WDACCompiledBasePolicy.cip" $networkShare
Copy-Item "C:WDACCompiledDevTeamPolicy.cip" $networkShare
# Hedef makinelerde politikayı uygulayacak script
$deployScript = @'
$policySource = "\dc01SYSVOLcorp.localWDAC"
$policyDest = "C:WindowsSystem32CodeIntegrityCiPoliciesActive"
New-Item -ItemType Directory -Path $policyDest -Force
Get-ChildItem $policySource -Filter "*.cip" | ForEach-Object {
Copy-Item $_.FullName $policyDest
}
# Politikayı yenile
Invoke-CimMethod -Namespace rootMicrosoftWindowsCI `
-ClassName PS_UpdateAndCompareCIPolicy `
-MethodName Update `
-Arguments @{FilePath = "$policyDestBasePolicy.cip"}
'@
$deployScript | Out-File "C:WDACScriptsDeploy-WDACPolicy.ps1"
GPO’da Computer Configuration > Windows Settings > Security Settings > Application Control Policies altında WDAC politikalarını da yönetebilirsiniz. Ancak birden fazla politika formatı için script tabanlı dağıtım daha esneklik sunuyor.
Gerçek Dünya Senaryosu: Muhasebe Departmanı
Muhasebe departmanında yalnızca belirli uygulamaların çalışmasına izin vermek istediğinizi düşünelim. Temel Windows araçları, Office ve şirketin ERP yazılımı dışında hiçbir şey çalışmamalı.
# Muhasebe departmanı için özel politika
$accountingPolicy = "C:WDACPoliciesAccountingDept.xml"
# Önce varsayılan Windows politikasıyla başla
Copy-Item "C:WindowsschemasCodeIntegrityExamplePoliciesDefaultWindows_Enforced.xml" `
$accountingPolicy
# Office'i yayıncı kuralıyla ekle
$officeRules = New-CIPolicyRule `
-DriverFilePath "C:Program FilesMicrosoft OfficerootOffice16WINWORD.EXE" `
-Level Publisher
# ERP yazılımını hash ile ekle (imzasız uygulama)
$erpRules = New-CIPolicyRule `
-DriverFilePath "C:ERPSystemerp_client.exe" `
-Level Hash
# Kuralları birleştir
Merge-CIPolicy -PolicyPaths $accountingPolicy `
-OutputFilePath "C:WDACPoliciesAccountingFinal.xml" `
-Rules ($officeRules + $erpRules)
# Audit modunda 2 hafta test et, sonra enforcement'a geç
Set-RuleOption -FilePath "C:WDACPoliciesAccountingFinal.xml" -Option 3
# Test bittikten sonra audit modunu kaldır:
# Set-RuleOption -FilePath "..." -Option 3 -Delete
ConvertFrom-CIPolicy -XmlFilePath "C:WDACPoliciesAccountingFinal.xml" `
-BinaryFilePath "C:WDACCompiledAccountingPolicy.cip"
Bu yaklaşımın kritik noktası şu: ERP yazılımı güncellendiğinde hash değişeceği için politikayı yeniden oluşturmanız gerekecek. Bu durumda ERP firmasından imzalı paket talep etmek uzun vadede daha az iş çıkarır.
Politika Güncelleme ve Bakım
WDAC politikaları canlı ortamda yaşayan belgeler. Yazılım güncellemeleri, yeni uygulamalar, değişen iş süreçleri sürekli güncelleme gerektirebilir.
# Mevcut politikayı güncelle
$existingPolicy = "C:WDACPoliciesMyCorpPolicy.xml"
$newScanResults = "C:WDACPoliciesNewApps_Scan.xml"
# Yeni uygulamaları tara
New-CIPolicy -ScanPath "C:NewApplications" `
-Level Publisher `
-Fallback Hash `
-FilePath $newScanResults
# Eski politikayla birleştir
Merge-CIPolicy -PolicyPaths $existingPolicy, $newScanResults `
-OutputFilePath "C:WDACPoliciesMyCorpPolicy_v2.xml"
# Versiyon numarasını güncelle
$policyInfo = Get-CIPolicyIdInfo -FilePath "C:WDACPoliciesMyCorpPolicy_v2.xml"
Set-CIPolicyVersion -FilePath "C:WDACPoliciesMyCorpPolicy_v2.xml" `
-Version "2.0.0.0"
# Yeni politikayı derle ve dağıt
ConvertFrom-CIPolicy -XmlFilePath "C:WDACPoliciesMyCorpPolicy_v2.xml" `
-BinaryFilePath "C:WDACCompiledSIPolicy_v2.p7b"
Sorun Giderme
WDAC devreye aldıktan sonra en sık karşılaşılan sorun beklenmedik bloklamalardır. Kullanıcılar “uygulama açılmıyor” diye geldiğinde ilk bakılacak yer event log.
# Son 24 saatteki tüm bloklamaları görüntüle
$yesterday = (Get-Date).AddDays(-1)
Get-WinEvent -LogName "Microsoft-Windows-CodeIntegrity/Operational" |
Where-Object { $_.Id -eq 3077 -and $_.TimeCreated -gt $yesterday } |
ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
Time = $_.TimeCreated
FileName = $xml.Event.EventData.Data |
Where-Object { $_.Name -eq "FileName" } |
Select-Object -ExpandProperty "#text"
PolicyName = $xml.Event.EventData.Data |
Where-Object { $_.Name -eq "PolicyName" } |
Select-Object -ExpandProperty "#text"
}
} | Format-Table -AutoSize
# Belirli bir uygulama için kural analizi
Get-SystemDriver -ScanPath "C:ProblemAppapp.exe" -UserPEs |
Format-List
Kritik hatalardan biri politikayı yanlış binary path’e kopyalamak. Eski tek politika formatı için path C:WindowsSystem32CodeIntegritySIPolicy.p7b iken, yeni çoklu politika formatı için C:WindowsSystem32CodeIntegrityCiPoliciesActive altına GUID ismiyle .cip uzantılı dosya gitmeli.
Managed Installer Özelliği
Kurumsal ortamlarda SCCM veya Intune gibi araçlarla kurulan uygulamaları otomatik olarak güvenilir listeye almak mümkün. Managed Installer özelliği bu işi otomatikleştiriyor.
# SCCM'yi Managed Installer olarak tanımla
$managedInstallerPolicy = "C:WDACPoliciesManagedInstaller.xml"
# Managed installer kuralı oluştur
$ccmExecRule = New-CIPolicyRule `
-DriverFilePath "C:WindowsCCMCcmExec.exe" `
-Level Publisher `
-Fallback Hash
# AppLocker Managed Installer kuralıyla birleştir
# Bu özellik AppLocker + WDAC kombinasyonu gerektirir
Set-RuleOption -FilePath $managedInstallerPolicy -Option 13
# Option 13 = Enabled:Managed Installer
# Politikayı güncelle
ConvertFrom-CIPolicy -XmlFilePath $managedInstallerPolicy `
-BinaryFilePath "C:WDACCompiledManagedInstaller.cip"
Sonuç
WDAC, doğru yapılandırıldığında kurumsal ortamlarda fidye yazılımları ve yetkisiz uygulamalara karşı son derece etkili bir savunma hattı oluşturuyor. Ancak başarının sırrı acele etmemekte. Audit modu ile başlayın, logları sabırla analiz edin, pilot grupla test edin ve ancak sonra enforcement’a geçin.
Dikkat edilmesi gereken birkaç kritik nokta var. İmzasız uygulamalar hash tabanlı kurallara bağlı olduğu için yazılım güncellemelerini operasyonel süreçlere dahil etmek şart. Managed Installer özelliği bu yükü önemli ölçüde azaltıyor. Bunun yanında WDAC politikalarını versiyon kontrolüne almak, Git benzeri bir sistemi ile yönetmek uzun vadede bakımı kolaylaştırıyor.
HVCI ile birleştirilmiş WDAC, Microsoft’un önerdiği en güçlü uygulama kontrolü katmanını oluşturuyor. Zero Trust yaklaşımının temel bileşenlerinden biri olan bu teknolojiye yatırım yapmak, özellikle kritik verileri işleyen departmanlar için kaçınılmaz hale geldi. Başlangıçta karmaşık görünse de sistematik bir yaklaşımla kurumunuza uygun politikaları oluşturmak son derece mümkün.
