Výzvy velikosti a růstu lístků Kerberos

Druhý den jsem narazil na docela zajímavý problém pro některé uživatele, jmenovitě neschopnost autentizace pomocí řady doménových služeb kvůli překročení maximální velikosti lístku Kerberos (token). V tomto článku se pokusíme zvážit vlastnosti tvorby tokenu Kerberos, metodologii pro stanovení jeho velikosti pro konkrétního uživatele a zvýšení vyrovnávací paměti pro jeho uložení.

V našem případě se problém projevil následovně. Někteří uživatelé nemohli získat přístup k řadě nasazených služeb. Zejména se vyskytl problém při pokusu o připojení k farmě RDS (chyba „Přístup byl odepřen“)

V protokolech serveru vzdálené plochy byla zaznamenána chyba ID události 6:

Balíček kerberos SSPI vygeneroval výstupní token o velikosti 22041 bajtů, který byl příliš velký na to, aby se vešel do vyrovnávací paměti tokenů o velikosti 12000 bajtů, poskytované procesem id 4.
Výstupní token SSPI, který je příliš velký, je pravděpodobně výsledkem toho, že uživatel user @ doména je členem velkého počtu skupin.
Doporučuje se minimalizovat počet skupin, do kterých uživatel patří. Pokud problém nelze napravit snížením členství ve skupině tohoto uživatele, obraťte se na správce systému a zvyšte maximální velikost tokenu, který je v termínech nakonfigurován v rámci celého počítače pomocí následující hodnoty registru: HKLM \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Parameters \ MaxTokenSize.

Při pokusu o připojení k serveru SQL byla zaznamenána následující chyba:

Neznámá chyba databáze.

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

Nelze generovat kontext SSPI. Obraťte se na správce systému.

V protokolu byla zaznamenána chyba Id události -40960

Bezpečnostní systém zjistil chybu ověření serveru XXXXXX. Kód chyby z ověřovacího protokolu Kerberos byl „Buffer Too Small
Vyrovnávací paměť je příliš malá na to, aby obsahovala položku. Do vyrovnávací paměti nebyly zapsány žádné informace. (0xc0000023).

Kontrola přístupových práv ke zdrojům neodhalila problém. Další vyšetřování incidentu odhalilo závislost - všichni „problematičtí“ uživatelé byli ve velkém počtu skupin zabezpečení služby Active Directory (s více než 200 vnořenými skupinami). Postupně jsme tedy dospěli k závěru, že problém překračuje maximální délku lístku Kerberos použitého k autorizaci uživatelů.

Obsah:

  • Velikost lístku Kerberos
  • Jak zjistit aktuální velikost vstupenky Kerberos uživatele
  • Zmenšení velikosti tokenu Kerberos pro uživatele
  • Jak zvětšit velikost tokenu Kerberos

Velikost lístku Kerberos

Velikost lístku Kerberos závisí na následujících faktorech:

  • Počet skupin zabezpečení služby Active Directory (včetně vnořených), kterých je uživatel členem (skupiny typu distribuce nejsou zahrnuty do tokenu)
  • Použití SIDHistory.Poznámka:. Problém s překročením maximální velikosti lístku je obzvláště běžný při migraci uživatelů mezi doménami služby Active Directory a udržování přístupu ke zdrojům staré domény pomocí mechanismu SIDHistory
  • Použitý mechanismus ověřování (běžné heslo nebo více faktorů, například čipové karty)
  • Zda je účet delegován pro delegování nebo ne

Kerberos používá vyrovnávací paměť k ukládání informací o autorizaci a přenáší její velikost do aplikací pomocí protokolu Kerberos. Systémový parametr MaxTokenSize - určuje velikost vyrovnávací paměti. Na velikosti vyrovnávací paměti záleží, protože některé protokoly, jako je RPC a HTTP, jej používají při přidělování bloku paměti pro autentizaci. Pokud autentizační data uživatele, který se pokouší autentizovat, přesáhne velikost MaxTokenSize, pokusí se autentizace neúspěšná. To může vysvětlit chyby ověřování při přístupu k IIS, zatímco přístup k souborům k síťovým prostředkům je zachován..

Ve výchozím nastavení velikost vyrovnávací paměti Kerberos (MaxTokenSize)

  • V systému Windows 7 a Windows Server 2008R2 - 12 Kb.
  • V systémech Windows 8 a Windows Server 2012 se velikost zvětší na 48 kB.

Pokud je tedy uživatel ve velkém počtu skupin, všechny popisy skupin se jednoduše nevejdou na 12 KB a při přístupu k některým prostředkům se nezdaří ověření.

Tip. Počet skupin, do kterých může uživatel patřit, je pevně omezen. Limit je 1015 skupin. Při překročení počtu skupin se uživatel přihlásí do systému. „Systém vás nemůže přihlásit z důvodu následující chyby: Během pokusu o přihlášení se v kontextu zabezpečení uživatele nashromáždilo příliš mnoho ID zabezpečení. Zkuste to prosím znovu nebo se obraťte na správce systému.“

Jak zjistit aktuální velikost vstupenky Kerberos uživatele

Windows postrádá praktické vestavěné nástroje pro zjištění velikosti tokenu Kerberos pro konkrétního uživatele.

Chcete-li získat aktuální velikost lístku, používáme skript Powershell třetí strany CheckMaxTokenSize.ps1 (od Tim Springston - Microsoft). Skript umožňuje získat aktuální velikost tokenu určeného uživatele, počet skupin zabezpečení, ve kterých je zahrnut, počet SID uložených v SIDHistorie uživatele a také to, zda je účet pro delegování důvěryhodný nebo ne

Chcete-li použít skript, stáhněte jej z výše uvedeného odkazu a uložte jej pod názvem CheckMaxTokenSize.ps1

Zakázat ověření skriptu:

Set-ExecutionPolicy RemoteSigned
Přejděte do adresáře se skriptem

Cd c: \ install \ ps
A zjistěte velikost lístků Kerberos pro uživatelské jméno:

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

Skript vás požádá, abyste určili, pro které prostředí se má vypočítat velikost uživatelských vstupenek. Existují dvě možnosti.

1 - V systémech Windows 7 / Windows Server 2008 R2 a starších (velikost tokenu 12 kB)

4 - V systému Windows 8 / Windows Server 2012 a následném operačním systému (velikost tokenu 48 kB)

Stiskněte 1 a Enter. Po chvíli (3-4 minuty) skript vrátí následující informace:

Podrobnosti tokenu pro uživatele user_name
***************************************
Doménou uživatele je CORP.
Celková odhadovaná velikost tokenu je 22648.
Pro přístup k DC a delegovatelným prostředkům je celková odhadovaná velikost delegace tokenů 45296.
Efektivní hodnota MaxTokenSize je: 12000
Byl zjištěn problém. Token byl příliš velký na konzistentní autorizaci. Změňte maximální velikost na KB http://support.microsoft.com/kb/327825 a zvažte snížení přímého a přechodného členství ve skupině.
* Token Details for user_name *
V tokenu je 957 skupin.
V uživatelích SIDHistory jsou identifikátory SID.
Ve skupinách uživatelů je 248 SID atributů SIDHistory.
Existuje 248 celkových SID historie pro uživatele a skupiny, které je členem.
1188 jsou globální skupiny zabezpečení domény.
37 jsou místní skupiny zabezpečení domény.
68 jsou univerzální skupiny zabezpečení uvnitř domény uživatelů.
0 jsou univerzální skupiny zabezpečení mimo doménu uživatelů.
Podrobnosti o skupině obsažené ve výstupním souboru na adrese C: \ Windows \ temp \ TokenSizeDetails.txt
Podrobnosti historie SID obsažené ve výstupním souboru na C: \ Windows \ temp \ TokenSizeDetails.txt

Zjistili jsme tedy, že jméno_uživatele je členem 957 skupin domén zabezpečení a velikost jeho lístku Kerberos - 22648, což je téměř dvakrát větší než standardní velikost protokolu Kerberos v systému Windows 7 / Windows Server 2008 R.

Chcete-li tedy vyřešit problém s ověřením, musíte buď zmenšit velikost uživatelského tokenu nebo zvětšit velikost vyrovnávací paměti na všech serverových systémech, na kterých je dodržována autorizace Kerberos.

Zmenšení velikosti tokenu Kerberos pro uživatele

Pokud je to možné, zkuste snížit lístek uživatele Kerberos o:

  • Snížení počtu skupin uživatelů.Tip. To lze usnadnit zavedením nového mechanismu pro řízení přístupu k souborovým prostředkům, který se objevil v systému Windows Server 2012 - Dynamic Access Control
  • Vyčištění historie SID
  • Odmítnutí důvěry pro delegování účtů (výrazně snižuje velikost tokenu)

Jak zvětšit velikost tokenu Kerberos

V případě, že není možné zmenšit velikost lístku Kerberos pro uživatele, můžete pro něj zvětšit velikost vyrovnávací paměti. Pro tento účel má registr speciální parametr MaxTokenSize.

Společnost Microsoft nedoporučuje nastavení velikosti MaxTokenSize na více než 64 kB, obecně se doporučuje nejprve zvýšit limit na 48 kB (limit pro Windows 8/2012). Zvětšení velikosti vyrovnávací paměti:

  1. Otevřete editor registru a přejděte do sekce HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Parameters.
  2. Vytvořte nový parametr typu Hodnota DWORD (32bitová) se jménem MaxTokenSize
  3. Zadejte požadovanou hodnotu pro maximální velikost vyrovnávací paměti (specifikovali jsme 48000, protože velikost tokenu uživatele nepřesahuje tuto hodnotu)
  4. Restartujte systém

Tato operace musí být provedena na všech serverových systémech, které mají problémy s ověřováním..

Dojde-li k problémům s ověřováním na serverech IIS, budete také muset zvětšit velikost hlavičky HTTP na 64 KB (0000ffff). Ve výchozím nastavení je maximální velikost záhlaví 16 KB. Chcete-li to provést, musí být na serverech IIS provedeny následující změny v registru (bude také vyžadován restart):

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

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

Windows 8 a Windows Server 2012 mají nové zásady, které vám umožňují nastavit maximální velikost MaxTokenSize - Set maximum Kerberos SSPI kontext token pufr velikost. Je umístěn pod položkou Konfigurace počítače -> Zásady -> Šablony pro správu -> Systém -> Kerberos.

Kromě toho existuje další zajímavá politika. Upozornění na velké vstupenky Kerberos , což vám umožní nakonfigurovat výstup v systémovém protokolu varování o překročení vstupenek.

Po povolení zásady, když je překročena prahová velikost lístku, budou události zaznamenány do protokolu Událost 31 s textem:

Pro účet "AccountName" @ "DomainName" je vydán lístek na službu ldap / "DC Name" / "DomainName". Velikost šifrované části této vstupenky je 17421 bajtů, což je blízko nebo je větší než nakonfigurovaná prahová hodnota velikosti vstupenky (12000 bajtů). Tento lístek nebo jakékoli další lístky vydané z tohoto lístku by mohly mít za následek selhání ověření, pokud klientská nebo serverová aplikace přidělí vyrovnávací paměti tokenů SSPI ohraničené hodnotou, která je blízko prahové hodnoty..

.