Active Directory Güvenlik Açıklarını Kapatma Rehberi

Kurumsal ağlarda Active Directory, neredeyse her şeyin döndüğü merkezi sistemdir. Kullanıcı hesapları, grup politikaları, kimlik doğrulama, yetkilendirme… Hepsi AD üzerinden yönetilir. Bu yüzden saldırganlar için de birincil hedef haline gelir. Bir AD ortamını ele geçiren saldırgan, pratik olarak tüm domain’i ele geçirmiş demektir. Bu yazıda gerçek dünya senaryolarından yola çıkarak AD güvenlik açıklarını nasıl kapatacağımızı, hangi araçları kullanacağımızı ve hangi politikaları uygulamamız gerektiğini ele alacağım.

Active Directory Saldırı Yüzeyi Neden Bu Kadar Geniş?

AD’nin tarihi 1999’a dayanıyor. Yani onlarca yıllık bir teknolojiyle çalışıyoruz. Bu süreçte eklenen geriye dönük uyumluluk özellikleri, eski protokoller ve yanlış yapılandırmalar ciddi bir saldırı yüzeyi oluşturuyor. Kerberoasting, Pass-the-Hash, DCSync, Golden Ticket gibi saldırı teknikleri artık çok iyi belgelenmiş durumda ve saldırganlar bunları rutin olarak kullanıyor.

Bir pentest projesi sırasında bizzat şahit oldum: Domain’e katılmış herhangi bir kullanıcı hesabıyla, sadece birkaç PowerShell komutuyla service account hash’lerini dump edip offline kırabiliyorduk. Sonra bu hesaplardan birinin domain admin grubunda olduğu ortaya çıktı. Birkaç dakika içinde tüm domain ele geçirildi.

Temel Güvenlik Açıkları ve Tespit Yöntemleri

Kerberoasting Açığı

Kerberoasting, SPN (Service Principal Name) kayıtlı hesapların Kerberos servis biletlerini şifreli olarak alıp offline kırmaya dayanan bir tekniktir. Saldırgan için domain kullanıcısı olmak yeterlidir.

Önce ortamınızda hangi hesapların SPN’e sahip olduğunu kontrol edin:

# PowerShell ile SPN'li hesapları listeleme
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName | 
Select-Object SamAccountName, ServicePrincipalName | 
Format-List

Bu komutun çıktısında Domain Admin veya yüksek yetkili hesaplar görüyorsanız, acil aksiyon gerekiyor. Service account’ları normal kullanıcı hesaplarından ayırın, Group Managed Service Accounts (gMSA) kullanın ve şifrelerini otomatik yönetin:

# gMSA oluşturma
New-ADServiceAccount -Name "svc-webapp" `
    -DNSHostName "webapp.domain.local" `
    -PrincipalsAllowedToRetrieveManagedPassword "WebAppServers" `
    -KerberosEncryptionType AES256

# gMSA'yı bir sunucuya atama
Add-ADComputerServiceAccount -Identity "WEBSERVER01" -ServiceAccount "svc-webapp"

AS-REP Roasting

Kerberos ön kimlik doğrulaması devre dışı bırakılmış hesaplar, hash’lerini ağa gönderiyor ve bu hash’ler offline olarak kırılabiliyor. Bunu kontrol etmek için:

# Kerberos pre-auth devre dışı olan hesapları bul
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} -Properties DoesNotRequirePreAuth |
Select-Object SamAccountName, DoesNotRequirePreAuth

# Tüm hesaplarda pre-auth'u zorla
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} | 
Set-ADAccountControl -DoesNotRequirePreAuth $false

Pass-the-Hash ve Credential Dumping

LSASS process’inden hash dump edilmesi, Windows ortamlarındaki en yaygın saldırı vektörlerinden biri. Mimikatz ve benzeri araçlarla dakikalar içinde gerçekleştirilebiliyor.

Bunu engellemek için önce Credential Guard‘ı aktif edin:

# Credential Guard'ı Group Policy ile etkinleştirme
# Computer Configuration > Administrative Templates > System > Device Guard
# "Turn On Virtualization Based Security" -> Enabled

# Registry üzerinden kontrol
reg query HKLMSYSTEMCurrentControlSetControlDeviceGuard /v EnableVirtualizationBasedSecurity

# PowerShell ile doğrulama
Get-ComputerInfo -Property DeviceGuard*

Ayrıca Protected Users güvenlik grubunu kullanın. Bu gruba eklenen hesaplar için NTLM kimlik doğrulama devre dışı kalıyor, credential caching yapılmıyor ve DES/RC4 Kerberos şifrelemesi engelleniyor:

# Kritik hesapları Protected Users grubuna ekleme
Add-ADGroupMember -Identity "Protected Users" -Members "Domain Admins"

# Grup üyelerini listeleme
Get-ADGroupMember -Identity "Protected Users" | Select-Object Name, SamAccountName

Privileged Access Management

Tier Model Uygulaması

Microsoft’un önerdiği Tier 0 / Tier 1 / Tier 2 modelini uygulamak, lateral movement saldırılarını ciddi ölçüde zorlaştırır.

  • Tier 0: Domain Controllers, AD yönetim sistemleri, PKI altyapısı
  • Tier 1: Sunucular, uygulama servisleri, bulut yönetimi
  • Tier 2: İş istasyonları, son kullanıcı cihazları

Bu modelde bir tier’daki admin hesabı, başka bir tier’a giriş yapamamalıdır. Bunu Group Policy ile zorlayabilirsiniz:

# Tier 0 hesaplarının sadece DC'lere login olabilmesini sağlama
# GPO: "Deny log on locally" ve "Deny log on through Remote Desktop Services"
# Tier 0 dışındaki tüm OU'lara uygulanır

# Logon restriction kontrolü
Get-GPO -All | Where-Object {$_.DisplayName -like "*Tier*"} | 
Select-Object DisplayName, GpoStatus, CreationTime

Admin Hesaplarının Denetimi

Gereksiz domain admin hesapları en büyük risklerden biri. Bir müşteri projesinde 47 kişinin domain admin olduğunu gördüm. Bu hesapların büyük çoğunluğu eski çalışanlara veya “gerekli olabilir” diye oluşturulmuş test hesaplarına aitti.

# Domain Admins grubundaki tüm hesapları listele
Get-ADGroupMember -Identity "Domain Admins" -Recursive | 
Get-ADUser -Properties LastLogonDate, PasswordLastSet, Enabled |
Select-Object Name, SamAccountName, LastLogonDate, PasswordLastSet, Enabled |
Sort-Object LastLogonDate

# 90 gün boyunca giriş yapmamış admin hesaplarını bul
$90DaysAgo = (Get-Date).AddDays(-90)
Get-ADGroupMember -Identity "Domain Admins" -Recursive |
Get-ADUser -Properties LastLogonDate |
Where-Object {$_.LastLogonDate -lt $90DaysAgo -or $_.LastLogonDate -eq $null} |
Select-Object Name, SamAccountName, LastLogonDate

DCSync Saldırılarına Karşı Önlemler

DCSync, bir hesabın DC’den tüm hash’leri replikasyon yoluyla çekebilmesi anlamına gelir. Bu saldırı için hesabın DS-Replication-Get-Changes ve DS-Replication-Get-Changes-All yetkilerine sahip olması gerekir.

Bu yetkilere kimin sahip olduğunu kontrol edin:

# DCSync yetkisi olan hesapları tespit etme
Import-Module ActiveDirectory
$rootDSE = Get-ADRootDSE
$domainDN = $rootDSE.defaultNamingContext

# ACL üzerinde replikasyon yetkilerini kontrol et
$acl = Get-Acl "AD:$domainDN"
$acl.Access | Where-Object {
    $_.ObjectType -eq "1131f6aa-9c07-11d1-f79f-00c04fc2dcd2" -or
    $_.ObjectType -eq "1131f6ab-9c07-11d1-f79f-00c04fc2dcd2"
} | Select-Object IdentityReference, ActiveDirectoryRights, ObjectType

Bu yetkiler sadece Domain Admins, Enterprise Admins ve Domain Controllers grubunda olmalıdır. Başka hesaplar görüyorsanız hemen kaldırın.

LDAP ve SMB Güvenliği

LDAP Signing ve Channel Binding

LDAP signing olmadan ortadaki adam (MITM) saldırıları çok kolaylaşır. 2020’den itibaren Microsoft bu ayarı varsayılan olarak zorunlu kıldı ama eski ortamlarda hala sorun olabiliyor:

# LDAP Signing politikasını kontrol et
reg query "HKLMSYSTEMCurrentControlSetServicesNTDSParameters" /v "LDAPServerIntegrity"
# 0 = None, 1 = Require Signing, 2 = Require Signing

# Group Policy ile zorunlu kılma:
# Computer Configuration > Windows Settings > Security Settings > 
# Local Policies > Security Options
# "Domain controller: LDAP server signing requirements" -> Require signing

# Registry ile uygulama
reg add "HKLMSYSTEMCurrentControlSetServicesNTDSParameters" /v "LDAPServerIntegrity" /t REG_DWORD /d 2 /f

SMB Signing

SMB relay saldırıları hala çok yaygın. Tüm sunucularda SMB signing zorunlu olmalıdır:

# SMB signing durumunu kontrol et
Get-SmbServerConfiguration | Select-Object RequireSecuritySignature, EnableSecuritySignature

# SMB signing'i zorunlu kıl
Set-SmbServerConfiguration -RequireSecuritySignature $true -EnableSecuritySignature $true -Force

# Client tarafında da zorunlu kıl
Set-SmbClientConfiguration -RequireSecuritySignature $true -Force

NTLM’i Kısıtlama

NTLM, onlarca yıllık güvenlik açıklarına sahip eski bir protokol. Mümkün olan her yerde Kerberos kullanılmalı. Önce audit ederek başlayın:

# NTLM trafiğini audit modunda izle
# Group Policy: Computer Configuration > Windows Settings > Security Settings >
# Local Policies > Security Options
# "Network security: Restrict NTLM: Audit NTLM authentication in this domain" -> Enable all

# PowerShell ile NTLM audit loglarını incele
Get-WinEvent -LogName "Microsoft-Windows-NTLM/Operational" | 
Where-Object {$_.Id -eq 8004} |
Select-Object TimeCreated, Message |
Select-Object -First 50

Password Politikaları ve Fine-Grained Password Policy

Tek bir domain genelinde uygulanan şifre politikası artık yeterli değil. Fine-Grained Password Policy (FGPP) ile farklı hesap gruplarına farklı politikalar uygulayabilirsiniz:

# Admin hesapları için daha güçlü şifre politikası oluşturma
New-ADFineGrainedPasswordPolicy -Name "AdminPasswordPolicy" `
    -Precedence 10 `
    -MinPasswordLength 16 `
    -PasswordHistoryCount 24 `
    -MaxPasswordAge "60.00:00:00" `
    -MinPasswordAge "1.00:00:00" `
    -LockoutThreshold 3 `
    -LockoutDuration "00:30:00" `
    -LockoutObservationWindow "00:30:00" `
    -ComplexityEnabled $true `
    -ReversibleEncryptionEnabled $false

# Politikayı Domain Admins grubuna uygula
Add-ADFineGrainedPasswordPolicySubject -Identity "AdminPasswordPolicy" -Subjects "Domain Admins"

# Mevcut politikaları listele
Get-ADFineGrainedPasswordPolicy -Filter * | Select-Object Name, Precedence, MinPasswordLength, MaxPasswordAge

Güvenlik Açığı Tarama ve Monitoring

BloodHound ile Saldırı Yollarının Analizi

BloodHound, AD ortamındaki saldırı yollarını görselleştirmek için vazgeçilmez bir araç. Savunma amaçlı kullanabilirsiniz:

# SharpHound ile veri toplama (sadece yetkili test ortamlarında)
# SharpHound.exe --CollectionMethods All --OutputDirectory C:TempBH

# PowerShell versiyonu
Import-Module .SharpHound.ps1
Invoke-BloodHound -CollectionMethod All -OutputDirectory "C:TempBH" -OutputPrefix "audit"

BloodHound analizinde şunlara odaklanın:

  • Hangi hesaplar kısa yoldan Domain Admin olabilir?
  • Unconstrained Delegation hangi bilgisayarlarda aktif?
  • Hangi kullanıcılar GenericAll veya WriteDACL gibi tehlikeli yetkilere sahip?

Unconstrained ve Constrained Delegation Denetimi

Delegation yanlış yapılandırıldığında saldırganlar başka hesap adına kimlik doğrulama yapabiliyor:

# Unconstrained delegation aktif bilgisayarları bul
Get-ADComputer -Filter {TrustedForDelegation -eq $true} -Properties TrustedForDelegation |
Select-Object Name, DNSHostName, TrustedForDelegation |
Where-Object {$_.Name -notlike "*DC*"}

# Unconstrained delegation aktif kullanıcı hesaplarını bul
Get-ADUser -Filter {TrustedForDelegation -eq $true} -Properties TrustedForDelegation |
Select-Object SamAccountName, TrustedForDelegation

# Constrained delegation yapılandırmalarını incele
Get-ADUser -Filter {msDS-AllowedToDelegateTo -ne "$null"} -Properties msDS-AllowedToDelegateTo |
Select-Object SamAccountName, msDS-AllowedToDelegateTo

# DC olmayan makinelerde unconstrained delegation'ı kaldır
# Set-ADComputer -Identity "WEBSERVER01" -TrustedForDelegation $false

Event Log Monitoring ve SIEM Entegrasyonu

Sadece güvenlik açıklarını kapatmak yetmez, aktif monitoring da şart. AD’de izlenmesi gereken kritik event ID’leri:

  • 4625: Başarısız login denemesi
  • 4648: Explicit credentials ile login
  • 4720: Yeni kullanıcı hesabı oluşturuldu
  • 4728 / 4732 / 4756: Güvenlik grubuna üye eklendi
  • 4768 / 4769: Kerberos ticket istekleri
  • 4776: NTLM kimlik doğrulama
  • 7045: Yeni servis kuruldu
# Başarısız login denemelerini izle (brute force tespiti)
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4625
    StartTime = (Get-Date).AddHours(-24)
} | Group-Object {$_.Properties[5].Value} | 
Sort-Object Count -Descending |
Select-Object Name, Count |
Where-Object {$_.Count -gt 10}

# Domain admin grubuna yapılan eklemeleri izle
Get-WinEvent -FilterHashtable @{
    LogName = 'Security'
    Id = 4728
} | Where-Object {
    $_.Message -like "*Domain Admins*"
} | Select-Object TimeCreated, Message | Select-Object -First 20

Group Policy Güçlendirme Kontrol Listesi

Uygulamanız gereken temel GPO ayarları:

  • SMB v1’i devre dışı bırakın: WannaCry ve benzeri ransomware’ler SMBv1 kullanır
  • PowerShell Script Block Logging: Tüm PS aktivitelerini logla
  • AppLocker veya WDAC: Yetkisiz uygulama çalıştırmayı engelle
  • LSASS Protection: RunAsPPL ile LSASS’ı koruma altına al
  • Remote Registry servisini devre dışı bırak: Gereksiz saldırı yüzeyini kapat
  • Print Spooler servisini DC’lerde devre dışı bırak: PrintNightmare açığını kapat
  • WDigest authentication’ı devre dışı bırak: Clear-text şifre caching’ini engelle
# WDigest'i devre dışı bırakma
reg add "HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest" /v UseLogonCredential /t REG_DWORD /d 0 /f

# LSASS'ı Protected Process Light olarak çalıştırma
reg add "HKLMSYSTEMCurrentControlSetControlLsa" /v RunAsPPL /t REG_DWORD /d 1 /f

# SMBv1'i devre dışı bırakma
Set-SmbServerConfiguration -EnableSMB1Protocol $false -Force
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart

# PowerShell Script Block Logging
reg add "HKLMSOFTWAREPoliciesMicrosoftWindowsPowerShellScriptBlockLogging" /v EnableScriptBlockLogging /t REG_DWORD /d 1 /f

Düzenli Güvenlik Değerlendirmesi

Microsoft’un yayınladığı Microsoft Defender for Identity veya ücretsiz araç olan PingCastle ile düzenli AD sağlık kontrolleri yapın. PingCastle özellikle bütçesi kısıtlı ortamlar için mükemmel bir seçenek:

# PingCastle ile AD güvenlik taraması
# PingCastle.exe --healthcheck --server domain.local

# Sonuçları belirli bir formatta dışa aktar
# PingCastle.exe --healthcheck --server domain.local --level Full --no-enum-limit

# Interaktif mod
# PingCastle.exe (ve ardından menüden seçim)

PingCastle, ortamınızı risk puanına göre değerlendirir ve bulduğu sorunları öncelik sırasına göre listeler. Bu raporu aylık olarak çıkarıp trend analizi yapmanızı öneririm.

Sonuç

Active Directory güvenliği tek seferlik bir proje değil, sürekli devam eden bir süreçtir. Bugün kapattığınız açık, yarın yeni bir saldırı vektörüyle geri gelebilir. Bu yüzden periyodik denetimler, otomatik monitoring ve personel farkındalığı bir arada yürütülmelidir.

Öncelik sıralaması yapacak olursam: Önce privileged hesapları temizleyin ve Tier modelini uygulayın. Sonra NTLM’i kısıtlayın ve Kerberos şifrelemesini güçlendirin. Arkasından delegation yapılandırmalarını inceleyin. Son olarak monitoring altyapısını kurun ve düzenli raporlar alın.

Bir AD ortamını %100 güvenli yapmak mümkün değil, ama saldırganın işini çok zorlaştırmak kesinlikle mümkün. Amaç “ihlal olmayacak” değil, “ihlal olsa bile hızlı tespit edip hasarı minimuma indirmek” olmalıdır. Bu yaklaşım, yani assume breach mentalitesi, modern AD güvenliğinin temel taşıdır.

Bir yanıt yazın

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