Ayrıcalıklı Hesapları Korumak: Protected Users, AdminSDHolder ve krbtgt
Domain Admin hesaplarını Protected Users grubu, AdminSDHolder denetimi ve düzenli krbtgt parola sıfırlama ile koruyoruz. Riskleri, test adımları ve güvenli sıfırlama sırası bu rehberde.
Bir saldırgan domain'inize girdiğinde ilk hedefi neredeyse her zaman aynıdır: bir Domain Admin hesabı. Bu hesaplardan birinin parola hash'i veya Kerberos bileti ele geçirildiğinde tüm firma.local domain'i tehlikeye girer. Bu yazıda ayrıcalıklı hesapların envanterini çıkaracak, onları Protected Users grubuyla sertleştirecek, AdminSDHolder mekanizmasını denetleyecek ve krbtgt hesabının parolasını güvenli şekilde sıfırlayacağız.
Önce Envanter: Kimler Ayrıcalıklı?
Neyi koruduğunuzu bilmeden koruyamazsınız. Kritik grupların üyelerini iç içe gruplar dahil listeleyin:
$gruplar = "Domain Admins", "Enterprise Admins", "Schema Admins", "Administrators",
"Account Operators", "Backup Operators", "Server Operators"
foreach ($g in $gruplar) {
Get-ADGroupMember -Identity $g -Recursive |
Select-Object @{n="Grup";e={$g}}, Name, SamAccountName, objectClass
}
İlk kural basit: yöneticiler günlük işlerini (e-posta, web, doküman) yönetici hesabıyla yapmamalıdır. Her yönetici için adm.ahmet gibi ayrı bir ayrıcalıklı hesap açın ve bu hesabı yalnızca yönetim işlerinde kullanın.
Ayrıca ayrıcalıklı hesapları Kerberos delegation'a kapatın. Bu ayar, hesabın kimlik bilgilerinin başka bir sunucu tarafından kendi adına kullanılmasını engeller:
Set-ADAccountControl -Identity "adm.ahmet" -AccountNotDelegated $true
Get-ADUser -Identity "adm.ahmet" -Properties AccountNotDelegated | Select-Object Name, AccountNotDelegated
Protected Users Grubu
Protected Users, Windows Server 2012 R2 ile gelen ve üyelerine ek korumalar uygulayan özel bir güvenlik grubudur. Bu gruptaki bir kullanıcı için:
- NTLM kapalıdır: Hesap yalnızca Kerberos ile kimlik doğrulayabilir; NTLM hash'i ile pass-the-hash saldırısı işe yaramaz.
- Zayıf şifreleme kapalıdır: Kerberos ön kimlik doğrulamasında DES ve RC4 kullanılmaz, yalnızca AES kullanılır.
- Delegation yoktur: Hesap, constrained veya unconstrained delegation ile kullanılamaz.
- TGT ömrü 4 saattir: Varsayılan 10 saatlik süre yerine bilet 4 saatte sona erer ve yenilenmez.
- Önbellek yoktur: Kimlik bilgileri istemcide çevrimdışı oturum açma için önbelleğe alınmaz; WDigest ve CredSSP düz metin parola saklamaz.
DC tarafındaki korumaların çalışması için domain functional level en az Windows Server 2012 R2 olmalıdır:
Get-ADDomain | Select-Object DomainMode
Gruba önce tek bir test hesabı ekleyin ve bir gün boyunca o hesapla tüm yönetim işlerinizi deneyin:
Add-ADGroupMember -Identity "Protected Users" -Members "adm.ahmet"
Get-ADGroupMember -Identity "Protected Users"
Grup üyeliğinin etkili olması için kullanıcının oturumu kapatıp açması gerekir. Sorunları izlemek için DC'lerde şu günlükleri etkinleştirin:
Applications and Services Logs > Microsoft > Windows > Authentication > ProtectedUserFailures-DomainController
Bu gruba asla eklememeniz gerekenler de var:
- Servis hesapları ve bilgisayar hesapları: Bilet ömrü ve delegation kısıtlaması nedeniyle servisler çalışmaz. Servis hesapları için serinin ilerleyen yazısında ele alacağımız gMSA'yı kullanın.
- Acil durum (break-glass) hesabı: Kerberos'un çalışmadığı bir felakette NTLM ile girebilecek bir hesabınız kalsın; bu hesabı güçlü bir parolayla kasada saklayın.
AdminSDHolder ve SDProp
Domain Admins gibi korumalı grupların üyelerinin izinleri, CN=AdminSDHolder,CN=System,DC=firma,DC=local nesnesinden gelir. PDC Emulator üzerinde 60 dakikada bir çalışan SDProp işlemi:
- korumalı grupların üyelerinde izin kalıtımını kapatır,
- AdminSDHolder'daki ACL'yi bu hesaplara kopyalar,
- hesapların
adminCountözniteliğini1yapar.
Bu, OU üzerinden verilen yetkilerle bir yöneticinin parolasının sıfırlanmasını engeller. Ancak saldırganlar da bunu bilir: AdminSDHolder'a kendi hesaplarına izin eklerlerse, bu izin her saat başı tüm yönetici hesaplarına yeniden yazılır. Bu yüzden AdminSDHolder'ın ACL'sini düzenli kontrol edin:
Import-Module ActiveDirectory
(Get-Acl "AD:\CN=AdminSDHolder,CN=System,DC=firma,DC=local").Access |
Select-Object IdentityReference, ActiveDirectoryRights, AccessControlType |
Sort-Object IdentityReference
Aynı bilgiyi komut satırında da görebilirsiniz:
dsacls "CN=AdminSDHolder,CN=System,DC=firma,DC=local"
Varsayılan listede SYSTEM, Domain Admins, Enterprise Admins ve Administrators'ın yanı sıra Authenticated Users, Everyone ve SELF (parola değiştirme), Pre-Windows 2000 Compatible Access, Cert Publishers, Windows Authorization Access Group ve Terminal Server License Servers girdileri de bulunur. Bunların dışında bir kullanıcı veya grup görürseniz, özellikle yazma veya Full Control yetkisi varsa, bunu bir güvenlik olayı olarak ele alın.
Yetim adminCount Hesapları
Bir kullanıcı korumalı gruptan çıkarıldığında adminCount=1 değeri ve kapalı kalıtım otomatik olarak geri alınmaz. Bu hesaplar OU'ya devrettiğiniz yetkileri almaz ve sorun giderirken kafa karıştırır. Önce listeleyin:
Get-ADUser -Filter 'adminCount -eq 1' -Properties adminCount, MemberOf |
Select-Object Name, SamAccountName
Artık yönetici olmayan bir hesabı temizlemek için adminCount değerini silip kalıtımı yeniden açın:
$dn = (Get-ADUser -Identity "mehmet").DistinguishedName
Set-ADUser -Identity "mehmet" -Clear adminCount
$acl = Get-Acl "AD:\$dn"
$acl.SetAccessRuleProtection($false, $true)
Set-Acl -Path "AD:\$dn" -AclObject $acl
SDProp'u beklemeden tetiklemek isterseniz PDC Emulator üzerinde RunProtectAdminGroupsTask işlemini çağırabilirsiniz:
$rootDSE = [ADSI]"LDAP://DC01/RootDSE"
$rootDSE.Put("RunProtectAdminGroupsTask", 1)
$rootDSE.SetInfo()
krbtgt Parolasını Sıfırlamak
krbtgt hesabı, domain'deki tüm Kerberos biletlerini imzalayan anahtarın sahibidir. Bu hesabın hash'i ele geçirilirse saldırgan istediği kullanıcı adına sınırsız süreli Golden Ticket üretebilir. Pek çok ortamda bu parola, domain kurulduğundan beri hiç değişmemiştir:
Get-ADUser -Identity "krbtgt" -Properties PasswordLastSet, "msDS-KeyVersionNumber" |
Select-Object Name, PasswordLastSet, "msDS-KeyVersionNumber"
krbtgt hesabı mevcut ve bir önceki parolayı birlikte tutar. Bu yüzden sıfırlamanın kuralları şöyledir:
- İki kez sıfırlayın: Tek sıfırlama, eski hash'i "önceki parola" olarak geçerli bırakır. Tam temizlik için ikinci sıfırlama gerekir.
- İki sıfırlama arasında bekleyin: En az maksimum TGT ömrü (varsayılan 10 saat) ve replikasyon süresi kadar bekleyin. Arka arkaya iki sıfırlama, tüm geçerli biletleri bir anda geçersiz kılar ve servis kesintisine yol açar.
- Replikasyonu doğrulayın: Her sıfırlamadan önce ve sonra tüm DC'lerin sağlıklı replikasyon yaptığından emin olun.
Sıfırlama öncesi kontrol:
repadmin /replsummary
dcdiag /test:replications
Sıfırlama için girdiğiniz değerin önemi yoktur; DC parolayı her durumda kendisi rastgele üretir:
Add-Type -AssemblyName System.Web
$parola = [System.Web.Security.Membership]::GeneratePassword(32, 8)
Set-ADAccountPassword -Identity "krbtgt" -Reset `
-NewPassword (ConvertTo-SecureString $parola -AsPlainText -Force)
repadmin /syncall DC01 /AdeP
Bu kod Windows PowerShell 5.1'de çalışır. PowerShell 7 kullanıyorsanız $parola = [guid]::NewGuid().ToString() + 'Aa1!' yeterlidir; DC girilen değeri zaten kullanmaz.
DC02 üzerinde msDS-KeyVersionNumber değerinin bir arttığını doğrulayın, 10-24 saat bekleyin ve aynı işlemi tekrarlayın. Microsoft'un GitHub'da yayınladığı ve artık arşivlenmiş olan New-KrbtgtKeys.ps1 betiği bu süreci simülasyon moduyla birlikte otomatikleştirir; kullanmadan önce sürümünü ve ortamınızla uyumluluğunu kontrol edin.
RODC'lerin her birinin ayrı bir krbtgt_XXXXX hesabı vardır ve bu hesaplar ayrı ayrı sıfırlanır. Domain krbtgt parolasını en az 180 günde bir ve bir güvenlik ihlalinden şüphelendiğiniz her durumda sıfırlamayı alışkanlık haline getirin.
Sık Karşılaşılan Hatalar
- Tüm yöneticileri aynı anda Protected Users'a eklemek: NTLM'e bağımlı eski bir uygulama varsa herkes bir anda dışarıda kalır. Önce tek bir hesapla test edin.
- Servis hesabını Protected Users'a eklemek: 4 saatlik bilet ömrü ve delegation yasağı servisleri durdurur. Servisleri gMSA ile çalıştırın.
- Korumalı grup üyesine OU üzerinden yetki vermeye çalışmak: SDProp her saat izinleri geri alır. Bu beklenen bir davranıştır; ayrıcalıklı hesapları yalnızca Domain Admins yönetmelidir. AdminSDHolder'a izin eklemek tüm yönetici hesaplarına yayılacağı için çok istisnai durumlar dışında bunu yapmayın.
- AdminSDHolder'ı hiç kontrol etmemek: Saldırganların kalıcılık için kullandığı yöntemlerden biridir. ACL'yi düzenli olarak denetleyin.
- krbtgt'yi arka arkaya iki kez sıfırlamak: Tüm Kerberos biletleri geçersiz olur ve kullanıcılar, servisler hata almaya başlar. İki sıfırlama arasında bekleyin.
- Replikasyon sorunluyken krbtgt sıfırlamak: Parolayı almayan DC'ler bilet doğrulayamaz. Önce
repadmin /replsummarytemiz olmalı.
Bir sonraki yazıda, Windows LAPS ile tüm bilgisayarlardaki yerel yönetici parolalarını otomatik ve benzersiz hale getireceğiz.