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:
RunAsPPLile 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.
