Site icon Baki ÇUBUK

PowerShell Script ile Active Directory Security Checklist

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:

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:

  1. Active Directory’deki tüm nesne, kullanıcı ve bilgisayar sayıları
  2. Devre dışı, inaktif ve parolası hiç süresi dolmayan kullanıcılar
  3. AdminCount = 1 olan (ayrıcalıklı) hesaplar
  4. Parola gerektirmeyen hesaplar ve DES şifreleme etkin kullanıcılar
  5. Kerberos Pre-Authentication gerektirmeyen hesaplar (AS-REP Roasting riski)
  6. RID 500 (Administrator) ve RID 501 (Guest) hesap detayları
  7. Ayrıcalıklı grup üyelikleri (Domain Admins, Enterprise Admins, Schema Admins vb.)
  8. Protected Users grubu ve ayrıcalıklı hesapların bu gruptaki durumu
  9. KRBTGT hesap detayları
  10. SMBv1 durumu ve firewall profilleri
  11. Varsayılan parola ve hesap kilitleme politikaları
  12. Denetim (audit) politikası yapılandırması
  13. 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:

  1. Bir Domain Controller üzerinde oturum açın.
  2. PowerShell 5.1 veya 7.x’i Run as administrator olarak çalıştırın.
  3. Dizin yolunu C:\scripts olarak 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.

  1. Bir Domain Controller üzerinde oturum açın.
  2. PowerShell 5.1 veya 7.x’i Run as administrator olarak çalıştırın.
  3. Dizin yolunu C:\scripts olarak 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.

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.

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.

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.

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.

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.

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.

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.

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.

10. Yerleşik Administrator Admin Approval Mode (FilterAdministratorToken)

Yerleşik Administrator hesabının da UAC onay istemine tabi olmasını sağlar.

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.

12. Standart Kullanıcılar İçin UAC (ConsentPromptBehaviorUser)

Standart kullanıcıların yükseltme isteklerini otomatik reddederek yetki yükseltmesini engeller.

13. Makine Hareketsizlik Limiti (InactivityTimeoutSecs)

Kullanıcı 15 dakika hareketsiz kaldığında makineyi otomatik kilitler.

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.

15. 3. Parti SMB’ye Şifresiz Parola (EnablePlainTextPassword)

SMB redirector’ın Microsoft olmayan SMB sunucularına açık metin parola göndermesini engeller.

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.

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.

18. Anonim SAM Hesap ve Paylaşım Sayımı (RestrictAnonymous)

Anonim kullanıcıların domain hesap adlarını ve paylaşımları listelemesini engeller.

19. Anonim SAM Hesap Sayımı (RestrictAnonymousSAM)

Özellikle SAM hesaplarının anonim olarak listelenmesini engeller.

20. RDP Güvenli RPC (fEncryptRPCTraffic)

RDS sunucusunun yalnızca kimliği doğrulanmış ve şifreli RPC isteklerini kabul etmesini sağlar.

21. RDP Şifreleme Seviyesi (MinEncryptionLevel)

RDP bağlantılarında en güçlü şifreleme seviyesini zorunlu kılar.

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.

23. RDP Parola Kaydetmeyi Engelleme (DisablePasswordSaving)

Remote Desktop Connection üzerinden parola kaydedilmesini engeller.

24. Windows Defender SmartScreen (EnableSmartScreen)

İnternetten indirilen potansiyel kötü amaçlı programları çalıştırmadan önce kullanıcıyı uyarır.

25. PowerShell Loglama

PowerShell tabanlı saldırıların (fileless, LOLBin) tespiti için kritik denetim izidir.

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.

27. WinRM İstemci (WinRM\Client)

Basic/Digest kimlik doğrulama ve şifresiz trafik, kimlik bilgisi ele geçirme riskini artırır.

28. WinRM Servis (WinRM\Service)

Servis tarafında da Basic kimlik doğrulama ve şifresiz trafik kapatılmalı, RunAs kimlik bilgilerinin saklanması engellenmelidir.

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.

30. NTLM Oturum Güvenliği (NtlmMinClientSec / NtlmMinServerSec)

NTLMv2 oturum güvenliği ve 128-bit şifrelemeyi zorunlu kılar.

31. NULL Session Fallback (AllowNullSessionFallback)

NULL session benzersiz oturum anahtarı üretmez; bütünlük ve gizlilik koruması sağlamaz.

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.

Sonuçları Doğru Yorumlama

Denetim çıktısını okurken üç durumu ayırt etmek gerekir:

Ö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…

Exit mobile version