Merhaba
Active Directory ortamınızın güvenlik sertleştirme (hardening) durumunu baştan sona kontrol etmenin pratik bir yolu nedir? Belki bir denetim (audit) öncesi hazırlık yapıyorsunuz, belki bir güvenlik olayının ardından ortamınızın zayıf noktalarını tespit etmek istiyorsunuz ya da düzenli bir kontrol rutini oluşturmak istiyorsunuz. Bu yazıda, Active Directory ortamınızdaki onlarca güvenlik kontrolünü tek bir PowerShell script ile nasıl otomatikleştireceğimizi göreceğiz.
Active Directory, bir organizasyonun kimlik doğrulama ve yetkilendirme altyapısının kalbidir. Bu nedenle ortamın güvenlik durumu, yalnızca birkaç ayarla değil; ayrıcalıklı hesaplardan parola politikalarına, protokol seviyelerinden registry tabanlı sertleştirme ayarlarına kadar çok sayıda katmanla belirlenir. Bu katmanlardan herhangi birindeki bir eksik yapılandırma, tüm ortamı riske atabilir.
Manuel olarak onlarca farklı PowerShell komutunu tek tek çalıştırmak yerine, tüm bu kontrolleri tek bir script ile otomatikleştirmek hem zaman kazandırır hem de insan kaynaklı hataları en aza indirir. Böylece ayrıcalıklı grupları, uygunsuz hesap ayarlarını, parola politikalarını, protokol güvenliğini ve düzinelerce registry tabanlı sertleştirme ayarını tek seferde CSV dosyaları halinde raporlayabilirsiniz.
Bu makalede, ortamınızın güvenlik durumunu tarayan ve her kontrolü ayrı bir CSV dosyasına döken kapsamlı bir güvenlik denetim script’ini inceleyeceğiz. Ayrıca script çalışırken karşılaşacağınız bazı “hata” görünümlü çıktıların aslında birer güvenlik bulgusu olduğunu da açıklayacağız.
Neden Active Directory Güvenlik Denetimi Yapmak İstersiniz
Aşağıdaki durumlarda ortamınızın güvenlik durumunu denetlemek iyi bir fikirdir:
- Bir güvenlik denetimi (audit) veya uyumluluk (compliance) süreci öncesinde
- Bir güvenlik olayı (incident) sonrası kök neden analizinde
- Yeni bir Domain Controller kurulumu öncesinde/sonrasında
- Ayrıcalıklı hesap ve grup hijyeninin düzenli kontrolünde
- Group Policy tabanlı sertleştirme ayarlarının doğrulanmasında
- Periyodik güvenlik gözden geçirmelerinde
Script Ne Kontrol Eder
Bu güvenlik denetim script’i, ortamınızı birçok başlıkta tarar ve her sonucu altında ayrı bir CSV yada HTML dosyasına yazar. Başlıca kontrol kategorileri şunlardır:
- Active Directory’deki tüm nesne, kullanıcı ve bilgisayar sayıları
- Devre dışı, inaktif ve parolası hiç süresi dolmayan kullanıcılar
- AdminCount = 1 olan (ayrıcalıklı) hesaplar
- Parola gerektirmeyen hesaplar ve DES şifreleme etkin kullanıcılar
- Kerberos Pre-Authentication gerektirmeyen hesaplar (AS-REP Roasting riski)
- RID 500 (Administrator) ve RID 501 (Guest) hesap detayları
- Ayrıcalıklı grup üyelikleri (Domain Admins, Enterprise Admins, Schema Admins vb.)
- Protected Users grubu ve ayrıcalıklı hesapların bu gruptaki durumu
- KRBTGT hesap detayları
- SMBv1 durumu ve firewall profilleri
- Varsayılan parola ve hesap kilitleme politikaları
- Denetim (audit) politikası yapılandırması
- Registry tabanlı güvenlik sertleştirme ayarları (WDigest, LM Hash, NTLM, SMB Signing, UAC, RDP, WinRM, PowerShell Logging ve daha fazlası)
Active Directory Security Checklist PowerShell script indirme
Get-ADSecurityCheckList_csv.ps1 ve Get-ADSecurityCheckList_csv.ps1 PowerShell script’lerini indirin ve Domain Controller üzerindeki C:\scripts klasörüne yerleştirin. Eğer bir scripts klasörünüz yoksa, bir tane oluşturun.

Get-ADSecurityCheckList_csv.ps1 ve Get-ADSecurityCheckList_csv.ps1 PowerShell script’lerini çalıştırırken herhangi bir hata oluşmaması için dosyaların unblock edildiğinden emin olun.
Active Directory Security Checklist Report Oluşturma
Bir Active Directory Security Checklist Report oluşturmak için aşağıdaki adımları izleyin:
- Bir Domain Controller üzerinde oturum açın.
- PowerShell 5.1 veya 7.x’i Run as administrator olarak çalıştırın.
- Dizin yolunu
C:\scriptsolarak değiştirin.
cd "C:\scripts"

Aşağıdaki cmdlet’lerden birini çalıştırın.
Active Directory Security Checklist Örnekleri
Bu cmdlet, Active Directory Security Checklist işlemini Forest yapısı içindeki tüm Domain’ler ve Domain Controller’lar üzerinde çalıştırır ve sonuçları C:\Scripts\tarihkklasörü içinde CSV dosyası formatında raporları oluşturur.
.\Get-ADSecurityCheckList_csv.ps1
Bu cmdlet, Active Directory Security Checklist işlemini Forest yapısı içindeki tüm Domain’ler ve Domain Controller’lar üzerinde çalıştırır ve sonuçları C:\Scripts\tarihkklasörü içinde HTML dosyası formatında raporları oluşturur.
.\Get-ADSecurityCheckList_html.ps1
Örneğimizde ilk örneği seçersek görünüm bu şekildedir.
- Bir Domain Controller üzerinde oturum açın.
- PowerShell 5.1 veya 7.x’i Run as administrator olarak çalıştırın.
- Dizin yolunu
C:\scriptsolarak değiştirin.
cd "C:\scripts"

Örnek olarak daha önce paylaşmış olduğumuz herhangi bir cmdlet’lerden birini çalıştırın.
Bu cmdlet, Active Directory Security Checklist işlemini Forest yapısı içindeki tüm Domain’ler ve Domain Controller’lar üzerinde çalıştırır ve sonuçları C:\Scripts\tarihkklasörü içinde CSV dosyası formatında raporları oluşturur.
.\Get-ADSecurityCheckList_csv.ps1



Get-ADSecurityCheckList_csv.ps1 PowerShell scripti, CSV report dosyaları oluşturacaktır. CSV report dosyaları, Get-ADSecurityCheckList_csv.ps1 PowerShell scripti ile aynı dizinde oluşturulur. Bu örnekte, bu klasör C:\Scripts\tarih‘tir.




Active Directory Security Checklist
Active Directory Security Checklist report Çalışırken Görülen “Hatalar” Aslında Bulgudur
Script’i çalıştırdığınızda, özellikle registry kontrolleri sırasında şuna benzer kırmızı satırlar görebilirsiniz:
Get-ItemProperty : Cannot find path
'HKLM:\Software\Policies\Microsoft\Windows\Personalization\' because it does not exist.
Burada dikkat çeken nokta şu: Bu bir hata değil, bir bulgudur.
Windows’ta bir Group Policy ayarı “Not Configured” (Yapılandırılmamış) durumundayken, o ayara karşılık gelen registry anahtarı fiziksel olarak oluşturulmaz. Özellikle dalı altındaki anahtarlar yalnızca ilgili GPO uygulandığında meydana gelir. Dolayısıyla PowerShell o yolu bulamayıp hata verdiğinde, size şunu söylüyordur: “Bu sertleştirme ayarı bu sunucuda hiç uygulanmamış.” Bir güvenlik denetiminde tam olarak öğrenmek istediğiniz şey de budur.
Buna karşılık altındaki anahtarlar (WDigest, LSA, NTDS gibi) genellikle her zaman vardır, çünkü bunlar politika değil işletim sisteminin çekirdek yapılandırmasıdır. “Yol yok” hataları neredeyse tamamen dalından gelir.
Script’i kırmızı hatalar olmadan çalıştırmak isterseniz, aşağıdaki yardımcı fonksiyonu kullanarak her registry okumasını güvenli hale getirebilirsiniz:
function Get-RegValue {
param(
[string]$Path,
[string]$Name
)
if (Test-Path $Path) {
$item = Get-ItemProperty -Path $Path -Name $Name -ErrorAction SilentlyContinue
if ($null -ne $item) { return $item.$Name }
return "Deger Yok (Not Set)"
}
return "Not Configured (Yol Yok)"
}
# Kullanım:
Get-RegValue 'HKLM:\Software\Policies\Microsoft\Windows\Personalization\' 'NoLockScreenCamera'
Bu fonksiyon üç durumu da temiz karşılar: yol yoksa “Not Configured”, yol var ama değer yoksa “Deger Yok”, varsa gerçek değeri döndürür.
Registry Tabanlı Güvenlik Kontrolleri ve Olması Gereken Değerler
Aşağıda script’in denetlediği registry tabanlı sertleştirme ayarlarını tek tek ele alıyoruz. Her kontrol için ne işe yaradığını, olması gereken değeri ve hangi Group Policy yolundan yapılandırılacağını bulacaksınız.
1. Kilit Ekranı Kamerasını Engelleme (NoLockScreenCamera)
Bu ayar, kilit ekranındayken kameranın etkinleştirilmesini engeller ve fiziksel erişim yüzeyini daraltır.
- Registry:
→ - Olması gereken değer:
(kamera devre dışı) - GPO yolu: Computer Configuration → Administrative Templates → Control Panel → Prevent enabling lock screen camera
2. Kilit Ekranı Slayt Gösterisini Engelleme (NoLockScreenSlideshow)
Kilit ekranı slayt gösterisi, ekranda görüntülenen resimler yoluyla bilgi sızıntısına yol açabilir. Sunucularda kapatılması önerilir.
- Registry:
→ - Olması gereken değer:
(slayt gösterisi devre dışı) - GPO yolu: Computer Configuration → Administrative Templates → Control Panel → Prevent enabling lock screen slide show
3. WDigest Kimlik Doğrulama (UseLogonCredential)
WDigest etkinken parolalar LSASS bellekte açık metin olarak saklanabilir; bu da Mimikatz gibi kimlik hırsızlığı araçlarının hedefidir. Değeri yaparak bunu engellersiniz.
- Registry:
→ - Olması gereken değer:
(devre dışı) - GPO yolu: Computer Configuration → Preferences → Registry ile
(REG_DWORD)
4. Güvensiz Guest Oturumları (AllowInsecureGuestAuth)
SMB istemcisinin bir SMB sunucusuna kimliksiz (guest) bağlanmasına izin verir. Bu oturumlar kimliksiz olduğundan SMB Signing ve SMB Encryption devre dışı kalır.
- Registry:
→ - Olması gereken değer:
(devre dışı) - GPO yolu: Computer Configuration → Administrative Templates → Network → Lanman Workstation → Enable insecure guest logons → Disabled
5. Autorun Komutları (NoAutorun)
Autorun komutu içeren bir medya takıldığında sistem programı otomatik çalıştırır. Bu, kötü amaçlı medya ile kod yürütülmesine olanak tanır.
- Registry:
→ - Olması gereken değer:
(autorun komutları çalıştırılmaz) - GPO yolu: Windows Components → AutoPlay Policies → Set the default behavior for AutoRun → Do not execute any autorun commands
6. Tüm Sürücüler İçin Autorun Kapatma (NoDriveTypeAutoRun)
Autoplay davranışının tüm sürücü tipleri için kapatılıp kapatılmadığını denetler.
- Registry:
→ - Olması gereken değer:
(tüm sürücüler) - GPO yolu: Windows Components → AutoPlay Policies → Turn off Autoplay → All drives
7. Sertleştirilmiş UNC Yolları (HardenedPaths)
SYSVOL ve NETLOGON paylaşımlarına güvenli UNC erişimi sağlar; MS15-011 sınıfı GPO ortadaki adam saldırılarına karşı korur.
- Registry:
- Olması gereken değer:
veiçin - GPO yolu: Network → Network Provider → Hardened UNC Paths
8. LDAP Server Signing (LDAPServerIntegrity)
İmzasız LDAP trafiği ortadaki adam saldırılarına açıktır. Dikkat: Bu ayarı zorunlu kıldığınızda LDAP signing desteklemeyen istemciler sorgu yapamaz; önce test edin.
- Registry:
→ - Olması gereken değer:
(imza zorunlu) - GPO yolu: Security Options → Domain controller: LDAP server signing requirements → Require signing
9. LAN Manager Kimlik Doğrulama Seviyesi (LmCompatibilityLevel)
LM ve NTLM kriptografik olarak zayıf protokollerdir. Dikkat: Ortamda hala LM/NTLM trafiği varsa bağlantılar kesilebilir; Event ID 4624 ile kontrol edin.
- Registry:
→ - Olması gereken değer:
(yalnızca NTLMv2; LM ve NTLM reddedilir) - GPO yolu: Security Options → Network security: LAN Manager authentication level → Send NTLMv2 response only. Refuse LM & NTLM
10. Yerleşik Administrator Admin Approval Mode (FilterAdministratorToken)
Yerleşik Administrator hesabının da UAC onay istemine tabi olmasını sağlar.
- Registry:
→ - Olması gereken değer:
(etkin) - GPO yolu: Security Options → User Account Control: Admin Approval Mode for the Built-in Administrator account → Enabled
11. Yöneticiler İçin UAC İstemi (ConsentPromptBehaviorAdmin)
Ayrıcalık yükseltme gerektiğinde yöneticiye güvenli masaüstünde (secure desktop) onay istemi gösterir.
- Registry:
→ - Olması gereken değer:
(güvenli masaüstünde onay iste) - GPO yolu: Security Options → Behavior of the elevation prompt for administrators → Prompt for consent on the secure desktop
12. Standart Kullanıcılar İçin UAC (ConsentPromptBehaviorUser)
Standart kullanıcıların yükseltme isteklerini otomatik reddederek yetki yükseltmesini engeller.
- Registry:
→ - Olması gereken değer:
(yükseltme isteklerini otomatik reddet) - GPO yolu: Security Options → Behavior of the elevation prompt for standard users → Automatically deny elevation requests
13. Makine Hareketsizlik Limiti (InactivityTimeoutSecs)
Kullanıcı 15 dakika hareketsiz kaldığında makineyi otomatik kilitler.
- Registry:
→ - Olması gereken değer:
(15 dakika) - GPO yolu: Security Options → Interactive logon: Machine inactivity limit → 900
14. LM Hash Depolamasını Engelleme (NoLmHash)
LM hash, NT hash’e göre çok daha zayıftır ve saldırıya açıktır. Değeri yaparak saklanmasını engellersiniz.
- Registry:
→ - Olması gereken değer:
(etkin) - GPO yolu: Security Options → Do not store LAN Manager hash value on next password change → Enabled
15. 3. Parti SMB’ye Şifresiz Parola (EnablePlainTextPassword)
SMB redirector’ın Microsoft olmayan SMB sunucularına açık metin parola göndermesini engeller.
- Registry:
→ - Olması gereken değer:
(devre dışı) - GPO yolu: Security Options → Send unencrypted password to third-party SMB servers → Disabled
16. SMB İstemci İmzalama (RequireSecuritySignature — Workstation)
SMB paket imzalama, oturum ele geçirme ve MITM saldırılarına karşı korur. Dikkat: Önce “if server agrees” ile açın, ortam stabilse “always”e geçin.
- Registry:
→ - Olması gereken değer:
(her zaman imzala) - GPO yolu: Security Options → Microsoft network client: Digitally sign communications (always) → Enabled
17. SMB Sunucu İmzalama (RequireSecuritySignature — Server)
Bir önceki ayarın sunucu tarafı karşılığıdır. Varsayılan olarak yalnızca Domain Controller’larda etkindir.
- Registry:
→ - Olması gereken değer:
(her zaman imzala) - GPO yolu: Security Options → Microsoft network server: Digitally sign communications (always) → Enabled
18. Anonim SAM Hesap ve Paylaşım Sayımı (RestrictAnonymous)
Anonim kullanıcıların domain hesap adlarını ve paylaşımları listelemesini engeller.
- Registry:
→ - Olması gereken değer:
(kısıtlı) - GPO yolu: Security Options → Do not allow anonymous enumeration of SAM accounts and shares → Enabled
19. Anonim SAM Hesap Sayımı (RestrictAnonymousSAM)
Özellikle SAM hesaplarının anonim olarak listelenmesini engeller.
- Registry:
→ - Olması gereken değer:
(kısıtlı) - GPO yolu: Security Options → Do not allow anonymous enumeration of SAM accounts → Enabled
20. RDP Güvenli RPC (fEncryptRPCTraffic)
RDS sunucusunun yalnızca kimliği doğrulanmış ve şifreli RPC isteklerini kabul etmesini sağlar.
- Registry:
→ - Olması gereken değer:
(etkin) - GPO yolu: Remote Desktop Session Host → Security → Require secure RPC communication → Enabled
21. RDP Şifreleme Seviyesi (MinEncryptionLevel)
RDP bağlantılarında en güçlü şifreleme seviyesini zorunlu kılar.
- Registry:
→ - Olması gereken değer:
(yüksek seviye) - GPO yolu: RDS → Security → Set client connection encryption level → High Level
22. RDP Bağlantıda Parola İsteme (fPromptForPassword)
Kullanıcı istemcide parolayı girmiş olsa bile bağlantı sırasında yeniden parola isteyerek otomatik oturum açmayı engeller.
- Registry:
→ - Olması gereken değer:
(parola iste) - GPO yolu: RDS → Security → Always prompt for password upon connection → Enabled
23. RDP Parola Kaydetmeyi Engelleme (DisablePasswordSaving)
Remote Desktop Connection üzerinden parola kaydedilmesini engeller.
- Registry:
→ - Olması gereken değer:
(etkin) - GPO yolu: RDS → Security → Do not allow passwords to be saved → Enabled
24. Windows Defender SmartScreen (EnableSmartScreen)
İnternetten indirilen potansiyel kötü amaçlı programları çalıştırmadan önce kullanıcıyı uyarır.
- Registry:
→, - Olması gereken değer:
, - GPO yolu: Windows Components → File Explorer → Configure Windows Defender SmartScreen → Enabled
25. PowerShell Loglama
PowerShell tabanlı saldırıların (fileless, LOLBin) tespiti için kritik denetim izidir.
- Registry:
- Olması gereken değer:
,, - GPO yolu: Windows Components → Windows PowerShell → Turn on Module Logging (Module Names:
), Script Block Logging, Transcription
26. Registry Policy Processing
GPO’lar değişmese bile registry politikalarının yeniden uygulanmasını sağlar; yapılandırma sapmasını (drift) önler.
- Registry:
- Olması gereken değer:
, - GPO yolu: System → Group Policy → Configure registry policy processing → “Process even if the GPOs have not changed” = True
27. WinRM İstemci (WinRM\Client)
Basic/Digest kimlik doğrulama ve şifresiz trafik, kimlik bilgisi ele geçirme riskini artırır.
- Registry:
→,, - Olması gereken değer: Hepsi
- GPO yolu: Windows Remote Management (WinRM) → WinRM Client → Basic/Digest ve şifresiz trafik → Disabled
28. WinRM Servis (WinRM\Service)
Servis tarafında da Basic kimlik doğrulama ve şifresiz trafik kapatılmalı, RunAs kimlik bilgilerinin saklanması engellenmelidir.
- Registry:
→,, - Olması gereken değer:
,, - GPO yolu: WinRM Service → ilgili ayarlar
29. Olay Günlüğü Boyutu (EventLog)
Yetersiz log boyutu, olay kayıtlarının erken üzerine yazılmasına ve olay müdahalesinde kanıt kaybına yol açar.
- Registry:
(Application, Security, System) - Olması gereken değer: Her log için uygun bir
(Security için örn. 196608 KB) - GPO yolu: Windows Components → Event Log Service → Specify the maximum log file size
30. NTLM Oturum Güvenliği (NtlmMinClientSec / NtlmMinServerSec)
NTLMv2 oturum güvenliği ve 128-bit şifrelemeyi zorunlu kılar.
- Registry:
→, - Olması gereken değer:
- GPO yolu: Security Options → Minimum session security for NTLM SSP based clients / servers → NTLMv2 + 128-bit
31. NULL Session Fallback (AllowNullSessionFallback)
NULL session benzersiz oturum anahtarı üretmez; bütünlük ve gizlilik koruması sağlamaz.
- Registry:
→ - Olması gereken değer:
(devre dışı) - GPO yolu: Security Options → Allow LocalSystem NULL session fallback → Disabled
32. Gelişmiş Denetim Politikası Zorlaması (SCENoApplyLegacyAuditPolicy)
Advanced Audit Policy kullanımı için gereklidir; alt kategori denetim ayarlarının eski kategori ayarlarını geçersiz kılmasını sağlar.
- Registry:
→ - Olması gereken değer:
(etkin) - GPO yolu: Security Options → Force audit policy subcategory settings to override audit policy category settings → Enabled
Sonuçları Doğru Yorumlama
Denetim çıktısını okurken üç durumu ayırt etmek gerekir:
- “Cannot find path … does not exist” → İlgili GPO ayarı hiç uygulanmamış (Not Configured). Yukarıdaki GPO yolundan yapılandırın.
- Değer var ama beklenenden farklı → Ayar uygulanmış ama güvenli olmayan değerde. Beklenen değere çekin.
- Değer beklenenle aynı → Kontrol başarılı, aksiyon gerekmez.




Önemli Uyarı
LDAP signing, LM authentication level ve SMB signing gibi ayarları üretim ortamında etkinleştirmeden önce mutlaka test edin. Bu ayarlar eski sistemlerle uyumluluğu bozarak beklenmedik kesintilere yol açabilir. Değişiklikleri önce bir test ortamında veya sınırlı bir OU üzerinde deneyip, olay günlüklerini izleyerek kademeli olarak yaymak en güvenli yaklaşımdır.
Bu kontrollerin hiçbiri tek başına sihirli bir çözüm değildir; hepsi birlikte katmanlı savunma (defense in depth) yaklaşımının parçalarıdır. “Yol yok” hatalarını birer eksiklik raporu olarak okuyup her birini ilgili GPO ile kapatmak, Active Directory ortamınızın saldırı yüzeyini kademeli olarak daraltmanın en pratik yoludur.
Başka bir yazımızda görüşmek dileğiyle…