AppLocker ile Uygulama Çalıştırma Kısıtlaması

Kurumsal ortamlarda en sık karşılaşılan güvenlik sorunlarından biri, kullanıcıların yetkisiz yazılımlar çalıştırmasıdır. Bir çalışan USB’den getirdiği portable uygulamayı açıyor, bir diğeri internetten indirdiği crack’li yazılımı yüklüyor, bir başkası ise PowerShell script’leriyle sistemi kurcalıyor. Bu kaosun önüne geçmek için Microsoft’un Windows’a yerleştirdiği AppLocker mekanizması tam olarak bu işe yarıyor. Bugün AppLocker’ı sıfırdan kurumsal ortama nasıl deploy edeceğimizi, gerçek hayat senaryolarıyla birlikte detaylıca ele alacağız.

AppLocker Nedir ve Neden Önemlidir

AppLocker, Windows 7 ile hayatımıza giren ve Windows 10/11 Enterprise ile Education sürümlerinde tam özellikli çalışan bir uygulama beyaz/kara listesi mekanizmasıdır. Software Restriction Policies’in (SRP) yerini almak üzere tasarlanmıştır ve SRP’ye kıyasla çok daha granüler kurallar yazmanıza olanak tanır.

Temel mantık şudur: Varsayılan olarak her şeye izin ver, sen sadece yasak listesini yaz. Ya da tam tersi, varsayılan olarak her şeyi engelle, sadece izin verdiklerini çalıştır. İkinci yaklaşım, yani whitelist modeli, güvenlik açısından çok daha sağlam bir duruş sergiler. Bir fidye yazılımı sisteminize girdiğinde, bilinen bir executable path veya publisher imzası olmadığı için AppLocker onu durduracaktır.

AppLocker’ın kural yazabileceği dosya türleri şunlardır:

  • Executable kuralları: .exe ve .com dosyaları
  • Windows Installer kuralları: .msi, .msp ve .mst dosyaları
  • Script kuralları: .ps1, .bat, .cmd, .vbs ve .js dosyaları
  • Packaged app kuralları: Windows Store uygulamaları (.appx)
  • DLL kuralları: .dll ve .ocx dosyaları (dikkatli kullanılmalı, performans etkisi var)

Sistem Gereksinimleri ve Lisanslama

AppLocker için birkaç kritik gereksinim var, bunları baştan netleştirelim:

İstemci tarafında gerekli Windows sürümleri:

  • Windows 10/11 Enterprise
  • Windows 10/11 Education
  • Windows Server 2008 R2 ve üzeri (tüm sürümlerde)

Servis gereksinimi: AppLocker kurallarının çalışması için Application Identity servisinin çalışır durumda olması şart. Bu servisi unutursanız kurallar işlememez, saatlerinizi harcarsınız.

# Application Identity servisini başlat ve otomatik başlatmayı ayarla
Set-Service -Name AppIDSvc -StartupType Automatic
Start-Service -Name AppIDSvc

# Servis durumunu kontrol et
Get-Service -Name AppIDSvc | Select-Object Name, Status, StartType

Group Policy bağımlılığı: AppLocker kuralları genellikle Group Policy üzerinden dağıtılır. Standalone bir makinede Local Group Policy Editor (gpedit.msc) ile de yapılandırabilirsiniz ama kurumsal ortamda Domain GPO’su kullanmak zorundasınız.

İlk Yapılandırma: Audit Mode ile Başlamak

AppLocker’ı direkt Enforce modunda açmak, deneyimsiz ellerde felakete yol açar. Kullanıcılar çalışmakta oldukları uygulamaları açamaz hale gelir, helpdesk’e çağrılar yağar, yöneticiler panikler. Her zaman Audit modundan başlayın.

Audit modunda AppLocker kuralları uygulanmaz, sadece ne engelleneceğini Event Log’a yazar. Bu sayede mevcut ortamı analiz edip gerçekçi kurallar yazabilirsiniz.

# PowerShell ile AppLocker policy'yi audit modda yapılandır
# Önce mevcut policy'yi görüntüle
Get-AppLockerPolicy -Effective | Format-List

# Varsayılan kuralları oluştur (audit modda)
# Bu komut exe, script, installer için temel whitelist kuralları oluşturur
$policy = New-Object -TypeName Microsoft.Security.ApplicationId.PolicyManagement.PolicyModel.AppLockerPolicy

# Audit modda XML policy oluştur
Set-AppLockerPolicy -XMLPolicy C:AppLockerAuditPolicy.xml

Audit loglarını analiz etmek için şu PowerShell bloğunu kullanabilirsiniz:

# AppLocker audit eventlerini çek (Event ID 8003 ve 8006 audit olaylarıdır)
Get-WinEvent -LogName "Microsoft-Windows-AppLocker/EXE and DLL" | 
    Where-Object { $_.Id -eq 8003 -or $_.Id -eq 8006 } |
    Select-Object TimeCreated, Id, Message |
    Export-Csv -Path C:AppLockerAuditResults.csv -NoTypeInformation

# Son 7 günde engellenen/audit edilen uygulamaları listele
$StartDate = (Get-Date).AddDays(-7)
Get-WinEvent -LogName "Microsoft-Windows-AppLocker/EXE and DLL" |
    Where-Object { $_.TimeCreated -gt $StartDate } |
    Select-Object @{N='Zaman';E={$_.TimeCreated}},
                  @{N='EventID';E={$_.Id}},
                  @{N='Mesaj';E={$_.Message}} |
    Format-Table -AutoSize

Event ID’lerine hızlıca bakalım:

  • 8003: Exe/DLL izin verildi (audit modda)
  • 8004: Exe/DLL engellendi
  • 8005: Script izin verildi (audit modda)
  • 8006: Script engellendi
  • 8007: MSI izin verildi (audit modda)
  • 8008: MSI engellendi

Kural Türleri: Publisher, Path ve Hash

AppLocker’da üç farklı kural tipi vardır ve hangisini kullanacağınız duruma göre değişir.

Publisher Kuralları (Önerilen)

Dijital imzalı uygulamalar için kullanılır. Yazılımın sertifikasını temel alır. Uygulama güncellendiğinde kural hala geçerli olduğu için bakımı en kolay yöntemdir.

# Belirli bir publisher için kural oluştur
# Örnek: Adobe Systems'ın tüm imzalı uygulamalarına izin ver
New-AppLockerPolicy -FileInformation (
    Get-AppLockerFileInformation -Path "C:Program FilesAdobeAcrobat DCAcrobatAcrobat.exe"
) -RuleType Publisher -User Everyone -RuleNamePrefix "Adobe_" |
Set-AppLockerPolicy -Merge

# Mozilla Firefox için publisher kuralı
Get-AppLockerFileInformation -Path "C:Program FilesMozilla Firefoxfirefox.exe" |
    New-AppLockerPolicy -RuleType Publisher -User Everyone -RuleNamePrefix "Mozilla_" |
    Set-AppLockerPolicy -Merge

Path Kuralları

Belirli bir dizindeki tüm uygulamalara izin verir veya engeller. Yönetimi kolaydır ama güvenlik açığı oluşturabilir. Kullanıcı o dizine yazabiliyorsa kural bypass edilebilir.

# Program Files dizinine izin ver
# Bu kurala dikkat edin: Kullanıcıların yazma yetkisi olmamalı
$PathRule = @"
<AppLockerPolicy Version="1">
  <RuleCollection Type="Exe" EnforcementMode="Enabled">
    <FilePathRule Id="$(New-Guid)" Name="Program Files İzni" 
                 Description="Program Files altındaki tüm exe'lere izin ver" 
                 UserOrGroupSid="S-1-1-0" Action="Allow">
      <Conditions>
        <FilePathCondition Path="%PROGRAMFILES%*"/>
      </Conditions>
    </FilePathRule>
  </RuleCollection>
</AppLockerPolicy>
"@

$PathRule | Out-File -FilePath C:AppLockerPathRule.xml -Encoding UTF8
Set-AppLockerPolicy -XMLPolicy C:AppLockerPathRule.xml -Merge

Hash Kuralları

İmzasız uygulamalar için son çaredir. Dosyanın hash’ini temel alır, uygulama güncellendiğinde yeni hash gerektirir. Bakımı en zor olandır.

# İmzasız bir uygulama için hash kuralı oluştur
Get-AppLockerFileInformation -Path "C:ToolsUnsignedTool.exe" |
    New-AppLockerPolicy -RuleType Hash -User Everyone -RuleNamePrefix "UnsignedTool_" |
    Set-AppLockerPolicy -Merge

# Birden fazla dosya için hash kuralı
$Files = Get-ChildItem -Path "C:LegacyApps" -Filter "*.exe" -Recurse
Get-AppLockerFileInformation -FileInformation ($Files | Get-AppLockerFileInformation) |
    New-AppLockerPolicy -RuleType Hash -User "DOMAINLegacyAppUsers" -RuleNamePrefix "Legacy_" |
    Set-AppLockerPolicy -Merge

Gerçek Dünya Senaryosu 1: Finans Departmanı Lockdown

Bir finans departmanında çalışanların yalnızca onaylı uygulamaları kullanması gerekiyor. SAP, Microsoft Office, Chrome ve PDF okuyucu dışında hiçbir şey çalışmamalı. Bu senaryo için şu yaklaşımı izleyebilirsiniz:

# Finans OU'su için AppLocker GPO hazırlama scripti
# Önce audit loglarından hangi uygulamaların kullanıldığını öğren
$FinansApps = @(
    "C:Program FilesSAPSAPguiSAPgui.exe",
    "C:Program FilesMicrosoft OfficerootOffice16WINWORD.EXE",
    "C:Program FilesMicrosoft OfficerootOffice16EXCEL.EXE",
    "C:Program FilesGoogleChromeApplicationchrome.exe",
    "C:Program FilesAdobeAcrobat DCAcrobatAcrobat.exe"
)

# Her uygulama için publisher bilgisi çek
foreach ($App in $FinansApps) {
    if (Test-Path $App) {
        $Info = Get-AppLockerFileInformation -Path $App
        Write-Host "Uygulama: $App"
        Write-Host "Publisher: $($Info.Publisher)"
        Write-Host "---"
    }
}

# Varsayılan engelleme kuralı oluştur
# Önce Windows işletim sistemi dosyalarına izin ver
$DefaultRules = @"
<AppLockerPolicy Version="1">
  <RuleCollection Type="Exe" EnforcementMode="Enabled">
    <FilePathRule Id="$(New-Guid)" Name="Windows Sistem Dosyaları" 
                 Description="Windows klasörüne izin ver" 
                 UserOrGroupSid="S-1-1-0" Action="Allow">
      <Conditions>
        <FilePathCondition Path="%WINDIR%*"/>
      </Conditions>
    </FilePathRule>
    <FilePathRule Id="$(New-Guid)" Name="Program Files" 
                 Description="Program Files izni" 
                 UserOrGroupSid="S-1-1-0" Action="Allow">
      <Conditions>
        <FilePathCondition Path="%PROGRAMFILES%*"/>
      </Conditions>
    </FilePathRule>
  </RuleCollection>
</AppLockerPolicy>
"@

Gerçek Dünya Senaryosu 2: PowerShell Script Kısıtlaması

Saldırganların en sevdiği araç PowerShell’dir. “Living off the land” saldırılarında PowerShell merkezi bir rol oynar. AppLocker ile PowerShell scriptlerini kısıtlayabilirsiniz:

# PowerShell script kurallarını yapılandır
# Sadece imzalı script'lere izin ver, imzasız olanları engelle

$ScriptPolicy = @"
<AppLockerPolicy Version="1">
  <RuleCollection Type="Script" EnforcementMode="Enabled">
    <FilePublisherRule Id="$(New-Guid)" Name="Microsoft İmzalı Scriptler" 
                      Description="Microsoft tarafından imzalanmış PS scriptleri" 
                      UserOrGroupSid="S-1-1-0" Action="Allow">
      <Conditions>
        <FilePublisherCondition PublisherName="O=MICROSOFT CORPORATION, L=REDMOND, S=WASHINGTON, C=US" 
                               ProductName="*" BinaryName="*" >
          <BinaryVersionRange LowSection="*" HighSection="*"/>
        </FilePublisherCondition>
      </Conditions>
    </FilePublisherRule>
    <FilePathRule Id="$(New-Guid)" Name="Sistem Scriptleri" 
                 Description="Windows sistem scriptleri" 
                 UserOrGroupSid="S-1-1-0" Action="Allow">
      <Conditions>
        <FilePathCondition Path="%WINDIR%*.ps1"/>
      </Conditions>
    </FilePathRule>
  </RuleCollection>
</AppLockerPolicy>
"@

$ScriptPolicy | Out-File -FilePath C:AppLockerScriptPolicy.xml -Encoding UTF8
Set-AppLockerPolicy -XMLPolicy C:AppLockerScriptPolicy.xml -Merge

Mevcut Policy’yi Yedekleme ve Geri Yükleme

Canlı ortamda değişiklik yapmadan önce mevcut policy’yi mutlaka yedekleyin:

# Mevcut AppLocker policy'yi XML olarak yedekle
$BackupPath = "C:AppLockerBackupPolicy_$(Get-Date -Format 'yyyyMMdd_HHmmss').xml"
New-Item -ItemType Directory -Path (Split-Path $BackupPath) -Force | Out-Null
Get-AppLockerPolicy -Effective -XML | Out-File -FilePath $BackupPath -Encoding UTF8
Write-Host "Policy yedeklendi: $BackupPath" -ForegroundColor Green

# Yedeği geri yükle
# Set-AppLockerPolicy -XMLPolicy $BackupPath

# Local policy'yi temizle (acil durum için)
# Set-AppLockerPolicy -XMLPolicy C:AppLockerEmptyPolicy.xml

Group Policy ile Kurumsal Dağıtım

Tek makinede yapılandırma test amaçlıdır. Gerçek ortamda GPO kullanmak zorundasınız:

# Remote bir makinenin AppLocker policy durumunu kontrol et
$Computers = @("PC001", "PC002", "PC003")

foreach ($Computer in $Computers) {
    try {
        $Policy = Invoke-Command -ComputerName $Computer -ScriptBlock {
            Get-AppLockerPolicy -Effective | 
                Select-Object -ExpandProperty RuleCollections |
                ForEach-Object {
                    [PSCustomObject]@{
                        Tip = $_.RuleCollectionType
                        Mod = $_.EnforcementMode
                        KuralSayisi = $_.Count
                    }
                }
        }
        Write-Host "`n[$Computer] AppLocker Durumu:" -ForegroundColor Cyan
        $Policy | Format-Table -AutoSize
    }
    catch {
        Write-Host "[$Computer] Bağlantı hatası: $($_.Exception.Message)" -ForegroundColor Red
    }
}

GPO tarafında şu yolu izlemeniz gerekir:

  • Computer Configuration > Policies > Windows Settings > Security Settings > Application Control Policies > AppLocker

Buradan her kural koleksiyonu için ayrı ayrı enforcement mode ayarlayabilirsiniz. Enforcement mode seçenekleri şunlardır:

  • Not Configured: AppLocker kuralları bu koleksiyon için işlemez
  • Audit Only: Kurallar loglanır ama uygulanmaz
  • Enforce Rules: Kurallar aktif olarak uygulanır

Sık Karşılaşılan Sorunlar ve Çözümler

Application Identity servisi çalışmıyor: En sık karşılaşılan sorundur. Servis durmazsa kurallar hiç işlemez. GPO ile servisin otomatik başlamasını zorunlu kılın.

Varsayılan kurallar olmadan enforce moduna geçmek: Eğer Windows sistem dosyalarına izin veren varsayılan kuralları oluşturmadan enforce moduna geçerseniz, kimse hiçbir şeyi açamaz. Create Default Rules seçeneğini kullanın.

Kullanıcılar AppData dizininden uygulama çalıştırıyor: Birçok uygulama AppData dizinine kuruluyor. Bu dizin genellikle kullanıcı yazma yetkisine sahip olduğundan kötü amaçlı yazılımlar buraya yerleşiyor. AppData’yı path kuralıyla engellemeyi düşünün ama önce hangi meşru uygulamaların buradan çalıştığını audit loglarından inceleyin.

DLL kuralları performansı çok etkiliyor: DLL kurallarını etkinleştirmek genellikle önerilmez. Her DLL yüklemesinde kontrol yapıldığından sistem yavaşlar. Sadece kritik güvenlik ihtiyaçlarında kullanın.

# AppLocker ile ilgili tüm eventleri özetle raporla
function Get-AppLockerReport {
    param(
        [int]$DaysBack = 30,
        [string]$OutputPath = "C:AppLockerReport.csv"
    )
    
    $StartDate = (Get-Date).AddDays(-$DaysBack)
    $Logs = @(
        "Microsoft-Windows-AppLocker/EXE and DLL",
        "Microsoft-Windows-AppLocker/MSI and Script",
        "Microsoft-Windows-AppLocker/Packaged app-Execution"
    )
    
    $Results = foreach ($Log in $Logs) {
        try {
            Get-WinEvent -LogName $Log -ErrorAction Stop |
                Where-Object { $_.TimeCreated -gt $StartDate } |
                Select-Object @{N='Log';E={$Log}},
                              @{N='Zaman';E={$_.TimeCreated}},
                              @{N='EventID';E={$_.Id}},
                              @{N='Durum';E={ if($_.Id -in @(8004,8006,8008)){'Engellendi'}else{'İzin Verildi'} }},
                              @{N='Detay';E={$_.Message}}
        }
        catch {
            Write-Warning "$Log logu okunamadı"
        }
    }
    
    $Results | Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8
    Write-Host "Rapor oluşturuldu: $OutputPath" -ForegroundColor Green
    return $Results
}

# Kullanım
Get-AppLockerReport -DaysBack 7 -OutputPath "C:AppLockerHaftalikRapor.csv"

AppLocker ve WDAC Karşılaştırması

Son olarak sıkça sorulan bir konuya değinelim. Microsoft, AppLocker’ın yanına Windows Defender Application Control (WDAC) adında yeni bir mekanizma ekledi. WDAC, kernel seviyesinde çalışır ve AppLocker’a kıyasla çok daha güçlüdür. Ancak yapılandırması da çok daha karmaşıktır.

  • AppLocker, kullanıcı bazlı kural yazabilir, WDAC yazamaz
  • WDAC, Pro sürümünde de çalışır, AppLocker gerektirmez
  • AppLocker, Group Policy ile kolay yönetilir
  • WDAC, kernel seviyesinde çalıştığı için bypass edilmesi çok zordur

Küçük ve orta ölçekli kurumlarda AppLocker hala geçerli ve yeterli bir çözümdür. Büyük kurumlar için ikisini birlikte kullanmak en iyi güvenlik duruşunu sağlar.

Sonuç

AppLocker, doğru yapılandırıldığında kurumsal ortamlarda uygulama kontrolünü ciddi ölçüde güçlendiren bir mekanizmadır. Ancak aceleyle yapılan bir deployment, üretim ortamını felç edebilir. Her zaman şu sırayı takip edin: Audit modu ile başla, logları analiz et, kuralları yaz, test ortamında dene, küçük bir pilot gruba uygula ve ardından tüm ortama aç.

Application Identity servisini otomatik başlatmayı, varsayılan kuralları oluşturmayı ve düzenli log analizini yapmayı ihmal etmeyin. Yedekleme alışkanlığı kritiktir; bir policy değişikliği bazen beklenmediği yerlerde şeyler kırabilir. AppLocker tek başına yeterli bir güvenlik katmanı değildir ama derinlemesine savunma stratejisinin önemli bir halkasıdır. Uç nokta güvenliği, network segmentasyonu ve kullanıcı farkındalığıyla birleştiğinde gerçekten etkili bir savunma hattı oluşturur.

Similar Posts

Bir yanıt yazın

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