Dneska mě tu pán upozornil na velmi zajímavou věc - a to, že účet krbtgt si ve skutečnosti nemění heslo - tedy lépe řečeno, že se mu nemění heslo. Posledních cca 12 let žiju v přesvědčení, že se mění každých osm dnů. A mělo by to i svůj bezpečnostní důvod. Ale pomalu.
Krbtgt účet
To je takový ten skrytý (musíte si zobrazit Advanced features, abyste ho viděli) a zakázaný účet. Při instalaci prvního řadiče každé domény se vytvoří a nastaví se mu náhodné heslo. Služba KDC (Kerberos Key Distribution Center) tohle heslo používá pro šifrování TGT tiketů. Heslo, nebo tedy lépe MD4 hash toho hesla, se normálně replikuje mezi všechna DC dané domény. Nooo, ne mezi všechna. Každé RODC má svůj vlastní krbtgt účet, jehož hash je jiná náhodná, a nikam se nereplikuje.
Čisté heslo krbtgt účtu, ze kterého vznikla jeho uložená MD4 hash ani nikde nenajdete (ani WCE ani Cain). Není ani potřeba. Na šifrování TGT tiketů se používá přímo ta hash, takže proč by se někde vůbec pamatovalo to heslo (hash ale dostanete z AD databáze pomocí Cain). Účet je velmi speciální, má koncovku SIDu (RID) 502 a je zakázaný, takže se na něho ani nelze normálně ověřit ani ze sítě.
Jenže každý TGT tiket, který vydá libovolné zapisovatelné DC je zašifrován stejným heslem krbtgt účtu. TGT tikety se vydávají každému uživatelskému účtu i účtům počítačů a mají platnost 10 hodiny ve výchozím stavu. Dále je tímto krbtgt účtem podepsán PAC (privilege attribute certificate), tedy seznam skupin a claimů, které jsou jak v TGT, tak i ve všech TGS servisních tiketech.
Takže masivní použití tohoto speciálního krbtgt hesla.
Zdá se, že se mu heslo skoro nemění
Když se podíváte do replikačních metadat tohoto účtu, například pomocí nástroje REPADMIN: (v reálu si nahraďte DCxx jménem nějakého DCčka a také DC=gopas,DC=virtual svým konkrétním distinguishedName vaší domény)
REPADMIN /showobjmeta DCxx "CN=krbtgt,CN=users,DC=gopas,DC=virtual"
A zjistíte, že atributy jako je unicodePwd a ntPwdHistory mají jen velmi malou verzi a datum poslední změny někdy před pár měsíci, nebo dokonce lety. Dívám se do dvou domén u zákazníků, v jedné se to změnilo cca 11x, ve druhé jenom 3x. WTF? Jen pro pořádek, hodnotám pwdLastSet a událostem v Security logu bych osobně moc nevěřil, tohle je velmi speciální účet. Nevím, jestli vůbec věřím těm unicodePwd a ntPwdHistory.
Co k tomu říká dokumentace?
Nikdy mě nenapadlo to zkoumat, byl jsem zblbnutej dokumentací. V těchto článcích se píše, že heslo krbtgt účtu se samo mění periodicky a automaticky:
http://technet.microsoft.com/en-us/library/cc750037.aspx
When the account is created, a random password is assigned, and that password is changed by the system on a regular basis.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa378170(v=vs.85).aspx
A password is assigned to the account automatically and is changed on a regular schedule, as are the passwords assigned to domain trust accounts.
http://technet.microsoft.com/en-us/library/cc961953.aspx
A password is assigned to the KDC's account automatically; this password, like the passwords assigned to domain trust accounts, is changed on a regular schedule.
Zatímco tutento článek tvrdí něco jiného, tedy že když chcete, musíte si ho měnit sami
http://technet.microsoft.com/cs-cz/library/cc772815(v=ws.10).aspx
Although passwords for domain trusts are changed automatically, passwords for trusts with non-Windows realms and the krbtgt accounts must be changed either manually or through a script.
Jaktože se to čas od času změní?
Mám tu jednu zákazníkovu doménu a v ní se to změnilo dokonce jen 3x. Na čistě nainstalovaném 2012 DC to dokonce má rovnou dvě změny, takže to znamená, že se to zřejmě skoro vůbec nemění. Nevím proč u druhého to je 11x za 9 let od instalace prvního řadiče, ale také je to poměrně málo často.
Rozhodně se heslo změní při přenosu PDC na verzi Windows 2003 a při povýšení DFL (domain functional level) na úroveň Windows 2008 a to z důvodu toho, aby se vygenerovaly správné encryptory pro MD5 a AES respektive. Samozřejmě to heslo můžete změnit také vy sami ručně (například podle návodu zde). V tom je jen zajímavé, že zadáte nějaké konkrétní vaše heslo, ale systém si stejně vymyslí svoje náhodně a na vaše se vykašle :-) To právě dobře.
Počítal bych, že tak citlivému účtu se bude měnit heslo pravidelně. Když se podíváte na účty počítačů, ty mají také náhodná, 120 znaková, hesla. To je stejně neprůstřelné, jako náhodné heslo krbtgt účtu. Ale proč si ho tedy počítače mění každých 30 dnů a přitom krbtgt si ho nemění vůbec?
Nebezpečnost a riziko krbtgt účtu
Krbtgt účet je stejně citlivý jako kterýkoliv jiný účet řadiče domény, nebo člena skupiny Domain Admins. Jestli něco kompromituje jeden z těchto účtů, máte definitivně kompromitovaný celý forest a můžete začít buď s jeho celou reinstalací, nebo obnovou z posledního čistého backupu. Pomocí krbtgt účtu si můžete vytvořit přihlašovací TGT tiket libovolného uživatele a navíc si do něho dát libovolné skupiny. Fakt, že je ten účet zakázaný je vcelku o ničem. Ze sítě ho pro přihlášení nepoužijete, ale TGT si vygenerujete s jeho pomocí pro libovolného uživatele. Peklo.
Jeho heslo je sice náhodné, ale zase produkt jeho šifrování (a mnohdy jen RC4) má v ruce denně každý uživatel i počítač. To není dobré toto.
Můžu měnit heslo krbtgt účtu ručně častěji?
Ano můžete. Krbtgt účet má, bez ohledu na politiku, vždycky historii s jedním starším heslem. Takže pokud mu heslo změníte, i nadále se dají dešifrovat dosud platné TGT tikety a ověřovat PAC u dosud platných TGS tiketů (PAC validation).
Pokud byste heslo změnili dvakrát, vyčistíte mu historii. A stávající tikety už nepůjdou dešifrovat, ani pro ně nepojede PAC validation. To se dokonce používá při kompromitaci forestu a jeho rebuildu ze starší zálohy. Prostě ho dvakrát resetnete, abyste se zbavili dosud platných, potenciálně kompromitovaných, tiketů, co jsou pořád ještě v oběhu. Pokud to ale neuděláte rychle za sebou, můžete měnit heslo tak často, aby to nebylo dvakrát za dobu životnosti TGT a TGS tiketů (výchozí je 10 hodin) a aby se to v průběhu této životnosti stihlo poreplikovat po celé doméně.
Vadilo by replikaci, kdyby na dvou DC byla obě tato hesla (jedno heslo plus jedna historie) úplně jiná (příliš rychlá změna a dlouhá replikační prodleva)? Nevadilo. Tato dvě DC by se i tak mohla normálně replikovat, protože k ověření účtů DC se používají jejich vlastní hesla a ne heslo krbtgt (to potřebuje každý z těch dvou DC jen sám vůči sobě pro vydání svého vlastního TGT).
Závěr
Tak já nevím. Souhlasím, že heslo krbtgt účtu (lépe řečeno jeho hash) je neprůstřelné. Ale to je stejně tak neprůstřelné, jako heslo libovolného počítače v doméně, které se mění každých 30 dnů.
Na druhé straně nevidím důvod, proč heslo krbtgt účtu čas od času nezměnit. Budu se nad tím muset ještě nějakou dobu zamýšlet :-) Tak dobrou.