Rotace hesla účtu krbtgt v Active Directory
Rotace hesla účtu krbtgt v Active Directory
Účet krbtgt chrání klíče používané pro Kerberos Ticket Granting Tickets. Aby se odstranil původní klíč i jeho předchozí verze, heslo se resetuje dvakrát s dostatečnou prodlevou a s ověřením replikace po každém kroku.
📌 Každá doména má vlastní účet krbtgt. Postup opakujeme samostatně pro každou doménu ve forestu. Netýká se účtů krbtgt_<číslo> patřících jednotlivým RODC.
1. Kdy rotaci provést
Rotaci plánujeme:
- pravidelně podle bezpečnostní politiky; Microsoft Defender for Identity označuje heslo starší než 180 dní,
- po podezření na kompromitaci doménových oprávnění nebo krádež hashů,
- po obnově domény podle forest recovery postupu.
⚠️ Při aktivním incidentu nejdříve odstraníme přístup útočníka a opravíme zdroj kompromitace. Jinak může nové klíče získat znovu. Reset krbtgt sám nenahrazuje kompletní obnovu důvěry v doménu.
2. Příprava
Rotaci provedeme v servisním okně z privilegované administrační stanice. Nejdříve ověříme:
repadmin /replsummary
repadmin /showrepl * /errorsonly
dcdiag /e /q
❌ Pokud je zapisovatelný DC dlouhodobě offline, má chyby replikace nebo existují lingering objects, nepokračujeme. Nezreplikovaný DC by po návratu používal zastaralé klíče a mohl by způsobovat chyby vydávání nebo ověřování ticketů; server za hranicí tombstone lifetime nevracíme do domény bez podporovaného postupu.
Zjistíme PDC Emulator a výchozí stav:
Import-Module ActiveDirectory
$Domain = Get-ADDomain
$Pdc = $Domain.PDCEmulator
Get-ADUser -Server $Pdc -Identity krbtgt `
-Properties PasswordLastSet, msDS-KeyVersionNumber |
Select-Object DistinguishedName, PasswordLastSet, msDS-KeyVersionNumber
Hodnotu msDS-KeyVersionNumber a čas si uložíme do záznamu změny.
2.1 Určení čekací doby
V doménové GPO zkontrolujeme:
Computer Configuration > Policies > Windows Settings > Security Settings > Account Policies > Kerberos Policy
Zajímají nás zejména:
- Maximum lifetime for user ticket,
- Maximum lifetime for service ticket.
📌 Mezi resetem číslo 1 a 2 čekáme déle než vyšší z těchto hodnot. Výchozí hodnota je 10 hodin, ale 10 hodin není univerzální konstanta; při vlastní Kerberos politice použijeme její skutečné maximum a přidáme provozní rezervu.
3. První reset
Hodnota hesla zadaná při resetu není pro krbtgt významná: AD DS nezávisle vygeneruje silné heslo. Cmdlet přesto parametr vyžaduje, proto zadáme libovolnou hodnotu splňující místní password filter.
$PlaceholderPassword = Read-Host `
'Zadejte jednorázovou komplexní hodnotu pro první reset' `
-AsSecureString
Set-ADAccountPassword `
-Server $Pdc `
-Identity krbtgt `
-Reset `
-NewPassword $PlaceholderPassword
Remove-Variable PlaceholderPassword
Volitelně urychlíme replikaci a následně ji vždy ověříme:
repadmin /syncall $Pdc /AdeP
repadmin /replsummary
repadmin /showrepl * /errorsonly
Na všech zapisovatelných DC musí být stejná nová hodnota KVNO a PasswordLastSet:
Get-ADDomainController -Filter * |
Where-Object { -not $_.IsReadOnly } |
Sort-Object HostName |
ForEach-Object {
try {
$Krbtgt = Get-ADUser `
-Server $_.HostName `
-Identity krbtgt `
-Properties PasswordLastSet, msDS-KeyVersionNumber
[pscustomobject]@{
DomainController = $_.HostName
PasswordLastSet = $Krbtgt.PasswordLastSet
KeyVersion = $Krbtgt.'msDS-KeyVersionNumber'
}
}
catch {
[pscustomobject]@{
DomainController = $_.HostName
PasswordLastSet = $null
KeyVersion = "CHYBA: $($_.Exception.Message)"
}
}
} | Format-Table -AutoSize
⚠️ Dokud nejsou všechny zapisovatelné DC konzistentní, nezačínáme odpočítávat čekací dobu a druhý reset neprovádíme.
4. Čekání a průběžná kontrola
Vyčkáme dobu určenou v kapitole 2.1. První reset ponechá původní klíč jako předchozí, takže běžné tikety vydané před změnou mohou doběhnout. Příliš rychlý druhý reset by odstranil klíč, kterým jsou ještě podepsané platné uživatelské a servisní tikety, a mohl by vyvolat plošné chyby autentizace.
Během čekání sledujeme zejména Security události 4768, 4769, 4770 a 4771, autentizační chyby služeb a stav replikace.
5. Druhý reset
Po uplynutí čekací doby a nové kontrole replikace provedeme druhý reset na stejném PDC Emulatoru:
$PlaceholderPassword = Read-Host `
'Zadejte jednorázovou komplexní hodnotu pro druhý reset' `
-AsSecureString
Set-ADAccountPassword `
-Server $Pdc `
-Identity krbtgt `
-Reset `
-NewPassword $PlaceholderPassword
Remove-Variable PlaceholderPassword
repadmin /syncall $Pdc /AdeP
repadmin /replsummary
repadmin /showrepl * /errorsonly
✅ Znovu spustíme přehled KVNO z kapitoly 3. Oproti výchozímu stavu se musí hodnota na každém zapisovatelném DC zvýšit o dvě.
6. Ověření provozu
Na testovacích klientech můžeme vyčistit tikety a vynutit nové přihlášení:
klist purge
klist get krbtgt
Ověříme přihlášení, přístup k souborovým službám, aplikace s Kerberos SSO, plánované úlohy a služby používající doménové identity. Pokračujeme ve sledování událostí 4768, 4769 a 4771.
Uživatelé mohou být po druhém resetu vyzváni k novému ověření. Samotná přítomnost několika chyb starého ticketu krátce po změně není důvodem vracet klíč; důležité je, zda klient po novém přihlášení získá platný TGT.
7. Evidence a pravidelný proces
Do evidence uložíme:
- doménu, PDC a časy obou resetů,
- KVNO před změnou, po prvním a po druhém resetu,
- výsledky replikace a provozních testů,
- použitou čekací dobu odvozenou z Kerberos policy.
⚠️ Rotaci automatizujeme pouze skriptem, který před každým krokem kontroluje replikaci a vynucuje bezpečnou prodlevu. Jednoduchá naplánovaná dvojice příkazů bez kontrol není bezpečný proces.
Shrnutí
✅ Heslo krbtgt resetujeme dvakrát pro každou doménu samostatně.
✅ Před každým resetem i po něm kontrolujeme zdraví a replikaci všech zapisovatelných DC.
✅ Mezi resety čekáme déle než skutečné maximum platnosti Kerberos ticketů.
✅ Po druhém resetu musí být KVNO na všech zapisovatelných DC o dvě vyšší.
❌ Dva resety bez bezpečné prodlevy a kontroly replikace nejsou bezpečný postup.