Výzvy týkajúce sa veľkosti a rastu lístkov Kerberos

Inokedy som narazil na dosť zaujímavý problém pre niektorých používateľov, a to nemožnosť autentifikácie pomocou viacerých doménových služieb z dôvodu prekročenia maximálnej veľkosti lístka Kerberos (token). V tomto článku sa pokúsime zvážiť vlastnosti tvorby tokenu Kerberos, metodiku na určenie jeho veľkosti pre konkrétneho používateľa a zvýšenie vyrovnávacej pamäte na jeho uloženie..

V našom prípade sa problém prejavil nasledovne. Niektorí používatelia nemali prístup k množstvu nasadených služieb. Konkrétne sa vyskytol problém pri pokuse o pripojenie k farme RDS (chyba „Prístup bol odmietnutý“)

V protokoloch servera Remote Desktop bola zaznamenaná chyba ID udalosti 6:

Balík kerberos SSPI vygeneroval výstupný token s veľkosťou 22041 bajtov, ktorý bol príliš veľký na to, aby sa zmestil do vyrovnávacej pamäte tokenov s veľkosťou 12000 bajtov, poskytované procesom id 4.
Výstupný token SSPI, ktorý je príliš veľký, je pravdepodobne výsledkom toho, že užívateľ user @ doména je členom veľkého počtu skupín.
Odporúča sa minimalizovať počet skupín, do ktorých používateľ patrí. Ak problém nie je možné napraviť znížením členstva v skupine tohto používateľa, kontaktujte správcu systému a požiadajte ho o zvýšenie maximálnej veľkosti tokenu, ktorý je v termíne nakonfigurovaný pre celý stroj pomocou nasledujúcej hodnoty databázy Registry: HKLM \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Parameters \ MaxTokenSize.

Pri pokuse o pripojenie k serveru SQL sa vyskytla táto chyba:

Neznáma chyba databázy.

Stav SQL: HY000, kód chyby SQL: 0

Nie je možné vygenerovať kontext SSPI. Obráťte sa na správcu systému.

V denníku bola zaznamenaná chyba Id udalosti -40960

Bezpečnostný systém zistil chybu autentifikácie pre server XXXXXX. Kód chyby z autentifikačného protokolu Kerberos bol „Buffer Too Small
Vyrovnávacia pamäť je príliš malá na to, aby obsahovala túto položku. Do vyrovnávacej pamäte neboli zaznamenané žiadne informácie. (0xc0000023).

Kontrola prístupových práv k zdrojom neodhalila problém. Ďalšie vyšetrovanie incidentu odhalilo závislosť - všetci „problémoví“ používatelia boli vo veľkom počte skupín zabezpečenia služby Active Directory (berúc do úvahy vnorené skupiny viac ako 200). Postupne sme teda dospeli k záveru, že problém presahuje maximálnu dĺžku lístka Kerberos, ktorý sa používa na autorizáciu používateľov.

obsah:

  • Veľkosť lístka Kerberos
  • Ako zistiť aktuálnu veľkosť lístka používateľa Kerberos
  • Zmenšenie veľkosti tokenu Kerberos pre používateľa
  • Ako zväčšiť veľkosť tokenu Kerberos

Veľkosť lístka Kerberos

Veľkosť lístka Kerberos závisí od nasledujúcich faktorov:

  • Počet bezpečnostných skupín Active Directory (vrátane vnorených), ktorých je užívateľ členom (skupiny distribučných typov nie sú zahrnuté v tokene)
  • Použitie databázy SIDHistory.poznámka. Problém s prekročením maximálnej veľkosti lístka je obzvlášť bežný pri migrácii používateľov medzi doménami Active Directory a udržiavaní prístupu k zdrojom starej domény prostredníctvom mechanizmu SIDHistory.
  • Použitý mechanizmus overovania (bežné heslo alebo viacfaktorové napríklad inteligentné karty)
  • Či je účet delegovaný na delegovanie alebo nie

Kerberos používa vyrovnávaciu pamäť na ukladanie autorizačných informácií a prenáša svoju veľkosť do aplikácií pomocou Kerberos. Systémový parameter MaxTokenSize - určuje veľkosť vyrovnávacej pamäte. Na veľkosti vyrovnávacej pamäte záleží, pretože niektoré protokoly, ako napríklad RPC a HTTP, ich používajú pri prideľovaní bloku pamäte na autentifikáciu. Ak autentifikačné údaje používateľa, ktorý sa pokúša autentifikovať, presahujú veľkosť MaxTokenSize, pokus o autentizáciu sa považuje za neúspešný. To môže vysvetľovať chyby autentifikácie pri prístupe k IIS, zatiaľ čo prístup k súborom k sieťovým prostriedkom je zachovaný..

V predvolenom nastavení je veľkosť vyrovnávacej pamäte Kerberos (MaxTokenSize)

  • V systéme Windows 7 a Windows Server 2008R2 - 12 Kb.
  • V systémoch Windows 8 a Windows Server 2012 sa veľkosť zvýši na 48kb.

Ak je teda používateľ vo veľkom počte skupín, všetky popisy skupín sa jednoducho nehodia na 12 kB a pri prístupe k niektorým prostriedkom zlyhá autentifikácia..

rada. Počet skupín, do ktorých môže používateľ patriť, je prísne obmedzený. Limit je 1015 skupín. Ak je počet skupín prekročený, užívateľ sa prihlási do systému. „Systém vás nemôže prihlásiť z dôvodu nasledujúcej chyby: Počas pokusu o prihlásenie sa v kontexte zabezpečenia používateľa nahromadilo príliš veľa bezpečnostných ID. Skúste to znova alebo sa obráťte na správcu systému.“

Ako zistiť aktuálnu veľkosť lístka používateľa Kerberos

V systéme Windows chýbajú vhodné vstavané nástroje na zistenie veľkosti tokenu Kerberos pre konkrétneho používateľa.

Na získanie aktuálnej veľkosti lístka používame skript Powershell tretej strany CheckMaxTokenSize.ps1 (od Tim Springston - Microsoft). Skript vám umožňuje získať aktuálnu veľkosť tokenu zadaného používateľa, počet bezpečnostných skupín, v ktorých je zahrnutý, počet SID uložených v SIDHistórii používateľa a tiež to, či je účet na delegovanie dôveryhodný alebo nie.

Ak chcete použiť skript, stiahnite ho z vyššie uvedeného odkazu a uložte ho pod názvom CheckMaxTokenSize.ps1

Zakázať overenie skriptu:

Set-ExecutionPolicy RemoteSigned
Prejdite do adresára pomocou skriptu

Cd c: \ install \ ps
A zistite veľkosť lístka Kerberos pre užívateľské meno:

.\ CheckMaxTokenSize.ps1 -Principals 'user_name' -OSEmulation $ true - Detaily $ true

Skript vás požiada, aby ste určili, pre ktoré prostredie sa má vypočítať veľkosť lístka používateľa. Existujú dve možnosti.

1 - V systéme Windows 7 / Windows Server 2008 R2 a staršom (veľkosť tokenu 12 kB)

4 - V systéme Windows 8 / Windows Server 2012 a nasledujúcich OS (veľkosť tokenu 48 kB)

Stlačte kláves 1 a Enter. Po chvíli (3-4 minúty) skript vráti nasledujúce informácie:

Podrobnosti tokenu pre používateľské meno user_name
**********************************
Doménou používateľa je CORP.
Celková odhadovaná veľkosť tokenu je 22648.
Pre prístup k DC a delegovateľným zdrojom je celková odhadovaná veľkosť delegovania tokenov 45296.
Skutočná hodnota MaxTokenSize je: 12000
Zistený problém. Token bol príliš veľký na konzistentnú autorizáciu. Zmeňte maximálnu veľkosť na KB http://support.microsoft.com/kb/327825 a zvážte zníženie priameho a prechodného členstva v skupine..
* Token Details for user_name *
V tokene je 957 skupín.
V používateľoch SIDHistory sú identifikátory SID.
V skupinách používateľov je 248 SID atribútov SIDHistory.
Existuje 248 celkových histórií SID pre používateľa a skupiny, ktorých je členom.
1188 sú globálne bezpečnostné skupiny domén.
37 sú miestne bezpečnostné skupiny v doméne.
68 sú univerzálne skupiny zabezpečenia vnútri domény používateľov.
0 sú univerzálne skupiny zabezpečenia mimo domény používateľov.
Podrobnosti o skupine zahrnuté vo výstupnom súbore na adrese C: \ Windows \ temp \ TokenSizeDetails.txt
Podrobnosti histórie SID obsiahnuté vo výstupnom súbore na C: \ Windows \ temp \ TokenSizeDetails.txt

Zistili sme teda, že meno_užívateľa je členom 957 skupín domén bezpečnosti a veľkosť jeho lístka Kerberos - 22648, ktorý je takmer dvakrát väčší ako štandardná veľkosť protokolu Kerberos v systéme Windows 7 / Windows Server 2008 R.

Preto, aby ste vyriešili problém s autentifikáciou, musíte buď zmenšiť veľkosť tokenu užívateľa, alebo zväčšiť veľkosť vyrovnávacej pamäte na všetkých serverových systémoch, na ktorých je dodržaná autorizácia Kerberos.

Zmenšenie veľkosti tokenu Kerberos pre používateľa

Ak je to možné, skúste znížiť vstupenku používateľa Kerberos o:

  • Zníženie počtu skupín používateľov.rada. To možno uľahčiť zavedením nového mechanizmu na riadenie prístupu k súborovým zdrojom, ktorý sa objavil v systéme Windows Server 2012 - Dynamic Access Control
  • Vyčistenie histórie SID
  • Odmietnutie dôvery v delegovanie účtov (výrazne znižuje veľkosť tokenu)

Ako zväčšiť veľkosť tokenu Kerberos

V prípade, že nie je možné znížiť veľkosť lístka Kerberos pre používateľov, môžete zväčšiť veľkosť vyrovnávacej pamäte. Register má preto špeciálny parameter MaxTokenSize.

Spoločnosť Microsoft neodporúča nastaviť veľkosť MaxTokenSize na viac ako 64 kB, vo všeobecnosti sa odporúča najprv zvýšiť limit na 48 kB (limit pre Windows 8/2012). Ak chcete zväčšiť veľkosť vyrovnávacej pamäte:

  1. Otvorte editor databázy Registry a prejdite do časti HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Parameters.
  2. Vytvorte nový parameter typu Hodnota DWORD (32-bitová) s menom MaxTokenSize
  3. Zadajte požadovanú hodnotu pre maximálnu veľkosť vyrovnávacej pamäte (zadali sme 48000, pretože veľkosť tokenu používateľa nepresahuje túto hodnotu)
  4. Reštartujte systém

Táto operácia sa musí vykonať na všetkých serverových systémoch, ktoré majú problémy s autentifikáciou..

Ak sa na serveroch IIS vyskytnú problémy s overením, budete musieť zväčšiť veľkosť hlavičky HTTP na 64 kB (0000ffff). V predvolenom nastavení je maximálna veľkosť hlavičky 16 KB. Na serveroch IIS sa musia vykonať nasledujúce zmeny v registri (bude potrebné vykonať aj reštart):

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ HTTP \ Parameters \ MaxFieldLength
DWORD: 0000ffff

HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ HTTP \ Parameters \ MaxRequestBytes
DWORD: 0000ffff

Windows 8 a Windows Server 2012 majú novú politiku, ktorá vám umožňuje nastaviť maximálnu veľkosť MaxTokenSize - sada maximum Kerberos SSPI kontext žetón nárazník veľkosť. Nachádza sa v časti Konfigurácia počítača -> Zásady -> Šablóny pre správu -> Systém -> Kerberos.

Okrem toho existuje ďalšia zaujímavá politika. Upozornenie na veľké lístky na server Kerberos , čo vám umožní nakonfigurovať výstup v systémovom protokole upozornení na prekročenie lístkov.

Po povolení politiky, keď sa prekročí prahová veľkosť lístka, sa udalosti zaznamenajú do denníka Udalosť 31 s textom:

Pre účet „AccountName“ @ „DomainName“ sa vydáva lístok na službu ldap / „DC Name“ / „DomainName“. Veľkosť šifrovanej časti tohto lístka je 17421 bajtov, čo je blízko alebo je väčšia ako nakonfigurovaná prahová hodnota veľkosti lístka (12000 bajtov). Tento lístok alebo akékoľvek ďalšie lístky vydané z tohto lístka by mohli mať za následok zlyhanie autentifikácie, ak klient alebo serverová aplikácia pridelí vyrovnávacie pamäte tokenov SSPI ohraničené hodnotou, ktorá je blízko prahovej hodnoty..

.