Kerberos Размер на билети и предизвикателства за растеж

Онзи ден се сблъсках с доста интересен проблем за някои потребители, а именно невъзможността да се удостоверят с редица услуги на домейна поради превишаване на максималния размер на билета за Kerberos (токен). В тази статия ще се опитаме да разгледаме характеристиките на формирането на маркера Kerberos, методологията за определяне на неговия размер за конкретен потребител и увеличаване на буфера за съхранението му.

В нашия случай проблемът се прояви по следния начин. Някои потребители не можеха да получат достъп до редица разгърнати услуги. По-конкретно, имаше проблем при опит да се свържете с фермата RDS (грешка „Забранен достъп“)

В дневниците на сървъра за отдалечен работен плот беше записана грешка в идентификатора на събитие 6:

Пакетът kerberos SSPI генерира изходен маркер с размер 22041 байта, който беше твърде голям, за да се побере в буфера на жетони с размер 12000 байта, осигурен от идентификатора на процеса 4.
Изходният SSPI маркер, който е твърде голям, вероятно е резултат от това, че потребител потребител @ домейн е член на голям брой групи.
Препоръчва се да се намали броят на групите, към които потребителят принадлежи. Ако проблемът не може да бъде коригиран чрез намаляване на членството в групата на този потребител, моля, свържете се със системния си администратор, за да увеличите максималния размер на токена, който в термин се конфигурира машинно чрез следната регистрационна стойност: HKLM \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Параметри \ MaxTokenSize.

Когато се опитвате да се свържете със SQL Server, беше наблюдавана следната грешка:

Неизвестна грешка в базата данни.

SQL състояние: HY000, SQL код на грешка: 0

Не може да се генерира контекст на SSPI. Свържете се със системния си администратор.

И в дневника беше регистрирана грешка Id на събитието -40960

Системата за сигурност откри грешка при удостоверяване на сървъра XXXXXX. Кодът на неуспеха от протокола за удостоверяване Kerberos беше „Buffer Too Small
Буферът е твърде малък, за да съдържа записа. В буфера не е записана информация. (0xc0000023).

Проверката на правата за достъп до ресурси не разкри проблем. По-нататъшното разследване на инцидента разкри зависимост - всички „проблемни“ потребители бяха в голям брой групи за сигурност на Active Directory (като се вземат предвид вложени групи от над 200). По този начин постепенно стигнахме до извода, че проблемът е в превишаването на максималната дължина на билета Kerberos, използван за упълномощаване на потребителите.

Съдържание:

  • Размер на билети в Kerberos
  • Как да разберете текущия размер на билета Kerberos на потребителя
  • Намаляване на размера на маркера Kerberos за потребителя
  • Как да увеличите размера на маркера Kerberos

Размер на билети в Kerberos

Размерът на билета за Kerberos зависи от следните фактори:

  • Броят на групите за сигурност на Active Directory (включително вложени такива), на които потребителят е член (групите типове разпространение не са включени в маркера)
  • Използване на SIDHistory.забележка. Проблемът с превишаването на максималния размер на билети е особено често срещан при миграция на потребители между Active Directory домейни и поддържане на достъп до ресурсите на стария домейн чрез механизма SIDHistory
  • Използваният механизъм за удостоверяване (обикновена парола или многофактор, например, смарт карти)
  • Независимо дали акаунтът е делегиран за делегиране или не

Kerberos използва буфер за съхранение на информация за упълномощаване и прехвърля размера му на приложения, използвайки Kerberos. Системен параметър MaxTokenSize - той определя размера на буфера. Размерът на буфера има значение, защото някои протоколи, като RPC и HTTP, го използват, когато разпределят блок памет за удостоверяване. Ако данните за удостоверяване на потребителя, който се опитва да удостовери, надвишават размера на MaxTokenSize, опитът за удостоверяване се счита за неуспешен. Това може да обясни грешките при удостоверяване при достъп до IIS, докато достъпът до файлове до мрежовите ресурси се запазва..

По подразбиране размер на буфера на Kerberos (MaxTokenSize)

  • В Windows 7 и Windows Server 2008R2 - 12 Kb.
  • В Windows 8 и Windows Server 2012 размерът е увеличен до 48Kb.

По този начин, ако потребителят е в голям брой групи, всички описания на групи просто не отговарят на 12 KB, а при достъп до някои ресурси автентичността не успява.

съвет. Съществува твърда граница за броя на групите, на които потребителят може да принадлежи. Ограничението е 1015 групи. Ако броят на групите е надвишен, потребителят влиза в системата. „Системата не може да ви регистрира поради следната грешка: По време на опита за влизане контекстът на защита на потребителя натрупа твърде много идентификационни номера на защита. Моля, опитайте отново или се консултирайте със системния си администратор“

Как да разберете текущия размер на билета Kerberos на потребителя

В Windows липсват удобни вградени инструменти, за да разберат размера на токена Kerberos за конкретен потребител.

За да получим текущия размер на билета, използваме скрипт на Powershell на трета страна CheckMaxTokenSize.ps1 (от Тим ​​Спрингстън - Microsoft). Скриптът ви позволява да получите текущия размер на маркера на посочения потребител, броя на групите за сигурност, в които той е включен, броя на SID-ите, съхранявани в SIDHistory на потребителя, както и дали акаунтът за делегиране е надежден или не

За да използвате скрипта, изтеглете го от връзката по-горе и го запишете с името CheckMaxTokenSize.ps1

Деактивиране на проверката на скрипта:

Set-ExecutionPolicy RemoteSigned
Отидете в директорията със скрипта

Cd c: \ инсталиране \ ps
И разберете размера на билета на Kerberos за име на потребител:

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

Скриптът ви моли да посочите за коя среда трябва да се изчисли размерът на билета на потребителя. Има две възможности.

1 - В Windows 7 / Windows Server 2008 R2 и по-стари (размер на токена 12K)

4 - В Windows 8 / Windows Server 2012 и следващите ОС (размер на токена 48K)

Натиснете 1 и Enter. След известно време (3-4 минути) скриптът ще върне следната информация:

Подробности за маркера за потребителско име на потребител
**********************************
Домейнът на потребителя е CORP.
Общият прогнозен размер на токена е 22648.
За достъп до DC и делегируеми ресурси общият прогнозен размер на делегацията на жетони е 45296.
Ефективната стойност на MaxTokenSize е: 12000
Открит е проблем. Маркерът беше твърде голям за последователно разрешаване. Променете максималния размер на KB http://support.microsoft.com/kb/327825 и помислете за намаляване на прякото и преходното членство в групата.
* Подробности за токена за име на потребител *
В обозначението има 957 групи.
В SIDHistory на потребителите има SID.
Има 248 SID в потребителските групи атрибути SIDHistory.
Съществуват общо 248 Истории на SID за потребител и групи, в които потребителят е член.
1188 са групи за сигурност в глобален обхват на домейни.
37 са местни групи за сигурност.
68 са универсални групи за сигурност вътре в домейна на потребителите.
0 са универсални групи за сигурност извън домейна на потребителите.
Подробности за групата, включени в изходния файл на C: \ Windows \ temp \ TokenSizeDetails.txt
Подробности за историята на SID, включени в изходния файл на C: \ Windows \ temp \ TokenSizeDetails.txt

По този начин установихме, че user_name е член на 957 групи домейни за сигурност и размера на неговия билет Kerberos - 22648, който е почти 2 пъти по-голям от стандартния размер на Kerberos Token в Windows 7 / Windows Server 2008 R.

По този начин, за да разрешите проблема с удостоверяването, трябва или да намалите размера на потребителския маркер или да увеличите размера на буфера на всички сървърни системи, на които се наблюдава разрешение на Kerberos.

Намаляване на размера на маркера Kerberos за потребителя

Ако е възможно, опитайте да намалите билета на Kerberos от потребителя с:

  • Намаляване на броя на потребителските групи.съвет. Това може да бъде улеснено чрез въвеждането на нов механизъм за контрол на достъпа до файлови ресурси, който се появи в Windows Server 2012 - динамичен контрол на достъпа
  • Почистване на историята на SID
  • Отказ от доверие за делегиране на акаунти (значително намалява размера на маркера)

Как да увеличите размера на маркера Kerberos

В случай, че не е възможно да намалите размера на билета Kerberos за потребителите, можете да увеличите размера на буфера за него. За да направите това, регистърът има специален параметър MaxTokenSize.

Microsoft не препоръчва да задавате размера на MaxTokenSize на повече от 64K, като цяло се препоръчва първо да увеличите лимита до 48K (ограничението за Windows 8/2012). За да увеличите размера на буфера:

  1. Отворете редактора на системния регистър и отидете на секцията HKEY_LOCAL_MACHINE \ Система \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Параметри.
  2. Създайте нов параметър тип DWORD (32-битова) стойност с името MaxTokenSize
  3. Посочете желаната стойност за максималния размер на буфера (посочихме 48000, тъй като размерът на потребителския маркер не надвишава тази стойност)
  4. Рестартирайте системата

Тази операция трябва да се извърши на всички сървърни системи, които имат проблеми с удостоверяването..

Ако възникнат проблеми с удостоверяването на IIS сайтове, ще трябва също да увеличите размера на HTTP заглавката до 64 KB (0000ffff). По подразбиране максималният размер на заглавката е 16 KB. За целта трябва да се правят следните промени в системния регистър на IIS сървърите (ще се изисква и рестартиране):

HKEY_LOCAL_MACHINE \ Система \ CurrentControlSet \ Услуги \ HTTP \ Параметри \ MaxFieldLength
DWORD: 0000ffffff

HKEY_LOCAL_MACHINE \ Система \ CurrentControlSet \ Услуги \ HTTP \ Параметри \ MaxRequestBytes
DWORD: 0000ffffff

Windows 8 и Windows Server 2012 имат нова политика, която ви позволява да зададете максималния размер MaxTokenSize - комплект максимален Kerberos SSPI контекст жетон буфер размер. Той се намира под Конфигурация на компютъра -> Политики -> Административни шаблони -> Система -> Kerberos.

Освен това има и друга интересна политика. Предупреждение за големи билети на Kerberos , което ви позволява да конфигурирате изхода в системния дневник на предупрежденията за излишъци на билети.

След активиране на правилото, когато размерът на прага на билета е надвишен, събитията ще се записват в дневника Събитие 31 с текст:

Билет за услугата ldap / "DC Name" / "DomainName" се издава за сметка "AccountName" @ "DomainName". Размерът на шифрованата част от този билет е 17421 байта, което е близко или по-голямо от конфигурирания праг за размер на билета (12000 байта). Този билет или всички допълнителни билети, издадени от този билет, могат да доведат до неуспехи при удостоверяването, ако клиентът или сървърното приложение разпредели SSPI буфери за символи, ограничени от стойност, близка до стойността на прага.

.