Размер билета Kerberos и проблемы его роста | Windows для системных администраторов

Размер билета Kerberos и проблемы его роста

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

В нашем кейсе проблема проявлялась следующим образом. Некоторые пользователи не могли получить доступ к ряду развернутых служб. В частности, наблюдались проблема при попытке подключения к RDS ферме (ошибка “Access denied”)

Remote Desktop Services - Access is deniedВ логах серверов Remote Desktop фиксировалась ошибка Event Id 6:

The kerberos SSPI package generated an output token of size 22041 bytes, which was too large to fit in the token buffer of size 12000 bytes, provided by process id 4.
The output SSPI token being too large is probably the result of the user user@domain  being a member of a large number of groups.
It is recommended to minimize the number of groups a user belongs to. If the problem can not be corrected by reduction of the group memberships of this user, please contact your system administrator to increase the maximum token size, which in term is configured machine-wide via the following registry value: HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters\MaxTokenSize.

При попытке подключении к SQL Server, наблюдалась такая ошибка:

Неизвестная ошибка, связанная с базой данных.

SQL State: HY000, SQL Error Code:0

Cannot generate SSPI context. Обратитесь к администратору системы.

Cannot generate SSPI contextА в журнале регистрировалась ошибка Event Id -40960

The Security System detected an authentication error for the server XXXXXX. The failure code from authentication protocol Kerberos was “{Buffer Too Small}
The buffer is too small to contain the entry. No information has been written to the buffer.(0xc0000023).

Проверка прав доступа к ресурсам проблемы не выявила. В ходе дальнейшего расследования инцидента выявилась зависимость – все «проблемные» пользователи состояли в большом количестве групп безопасности Active Directory (с учетом вложенных групп более 200). Таким образом, постепенно мы пришли к вывод, что проблема заключается в превышении максимального длины билета Kerberos, используемого для авторизации пользователей.

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


Размер билета Kerberos зависит от следующих факторов:

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

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

По-умолчанию, размер буфера Kerberos (MaxTokenSize)

  • В Windows 7 и Windows Server 2008R2 – 12 Кб.
  • В Windows 8 и Windows Server 2012 размер увеличен до 48Кб.

Таким образом, если пользователь состоит в большом количестве группах, все описания групп просто не помещаются 12 КБ, и при доступе к некоторых ресурсам происходит сбой проверки подлинности.

Совет. Есть жесткий лимит на количество групп, в которых может состоять пользователь. Лимит составляет 1015 групп. При превышении количества групп пот входе пользователя в систему появляется ошибка «The system cannot log you on due to the following error: During a logon attempt, the user’s security context accumulated too many security IDs. Please try again or consult your system administrator»

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


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

Для получения текущего размер билета воспользуемся сторонним скриптом Powershell CheckMaxTokenSize.ps1 (от Tim Springston — Microsoft). Скрипт позволяет получить текущий размер токена указанного пользователя, количество групп безопасности, в которых он включен, количество SID, хранящихся в SIDHistory пользователя, а также доверена ли учетная запись для делегирования или нет

Чтобы воспользоваться скриптом, скачайте его по ссылке выше и сохраните с именем CheckMaxTokenSize.ps1

Отключаем проверку скриптов:

Set-ExecutionPolicy RemoteSigned
Переходим в каталог со скриптом

Cd c:\install\ps
И узнаем размер билета Kerberos для пользователя user_name:

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

CheckMaxTokenSize.ps1 Скрипт просит указать для какого окружения следует вычислить размер билета пользователя. Есть два варианта

1 — В Windows 7 / Windows Server 2008 R2 и более ранних (размер токена 12К)

4 — В Windows 8 / Windows Server 2012 и последующих ОС (размер токена 48K)

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

Token Details for user user_name
**********************************
User's domain is CORP.
Total estimated token size is 22648.
For access to DCs and delegatable resources the total estimated token delegation size is 45296.
Effective MaxTokenSize value is: 12000
Problem detected. The token was too large for consistent authorization. Alter the maximum size per KB http://support.microsoft.com/kb/327825 and consider reducing direct and transitive group memberships.
*Token Details for user_name*
There are 957 groups in the token.
There are SIDs in the users SIDHistory.
There are 248 SIDs in the users groups SIDHistory attributes.
There are 248 total SIDHistories for user and groups user is a member of.
1188 are domain global scope security groups.
37 are domain local security groups.
68 are universal security groups inside of the users domain.
0 are universal security groups outside of the users domain.
Group Details included in output file at C:\Windows\temp\TokenSizeDetails.txt
SIDHistory details included in output file at C:\Windows\temp\TokenSizeDetails.txt

The token was too large for consistent authorizationТаким образом, мы определили, что пользователь user_name состоит в 957 доменных группах безопасности, а размер его билета Kerberos — 22648, что почти в 2 раза больше, чем стандартный размер Kerberos Token Size в Windows 7 / Windows Server 2008 R.

Таким образом, чтобы решить проблему с аутентификацией, нужно либо уменьшить размер токена пользователя, либо увеличить размер буфера на всех серверных системах, на которых наблюдается проблема с авторизацией  Kerberos.

Уменьшение размера токена Kerberos для пользователя

Если возможно, попытайтесь уменьшить размер билета Kerberos пользователя за счет:

  • Уменьшения количества групп, в которых состоит пользователь.
    Совет. Этому может способствовать внедрение нового механизма контроля доступа к файловым ресурсам, появившийся в Windows Server 2012 — Dynamic Access Control
  • Очистки SID History
  • Отказ от доверения на делегирование учетных записей (существенно сокращает размер токена)

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

В том случае, если сократить размер билета Kerberos пользователей не представляется возможным, можно увеличить размер буфера для него. Для этого в реестре имеется специальный параметр MaxTokenSize.

Microsoft не рекомендует устанавливать размер MaxTokenSize более 64Кб, в общем случае рекомендуется сначала увеличить лимит до 48Кб (лимит для Windows 8 / 2012). Чтобы увеличить размер буфера:

  1. Откройте редактор реестра и перейдите в раздел HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters.
  2. Создайте новый параметр типа DWORD (32-bit) Value с именем MaxTokenSize
  3. Укажите желаемое значение для максимального размер буфера (мы указали 48000, т.к. размеры токена пользователей не превышают этого значения)MaxTokenSize
  4. Перезагрузите систему

Эту операцию нужно выполнить на всех серверных системах, на которых наблюдается проблемы аутентификации.

Если проблемы аутентифкации наблюдаются на сайтах IIS, потребуется также увеличить размер заголовка HTTP до 64 КБ (0000ffff). По умолчанию максимальный размер заголовка — 16 КБ. Для этого на серверах IIS нужно внести следующие изменения в реестр (также потребуется перезагрузка):

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

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

В Windows 8 и Windows Server 2012 появилась новая политика, позволяющая задать размер максимальный MaxTokenSize — Set maximum Kerberos SSPI context token buffer size. Находится она в разделе Computer Configuration ->Policies -> Administrative Templates -> System -> Kerberos.

Set maximum Kerberos SSPI context token buffer size

Кроме того, есть еще одна интересная политика Warning for large Kerberos tickets , позволяющая настроить вывод в системный лог предупреждений о превышении размера билета.Предупреждение о билетах Kerberos большого размера

После включения политики при превышении порогового размера билета, в журнале будут фиксировать событий Event 31 с текстом:

A ticket to the service ldap/»DC Name»/»DomainName» is issued for account «AccountName»@»DomainName». The size of the encrypted part of this ticket is 17421 bytes, which is close or greater than the configured ticket size threshold (12000 bytes). This ticket or any additional tickets issued from this ticket might result in authentication failures if the client or server application allocates SSPI token buffers bounded by a value that is close to the threshold value.

The size of ticket is largely determined by the size of authorization data it carries. The size of authorization data is determined by the groups the account is member of, the claims data the account is setup for, and the resource groups resolved in the resource domain.

Event 31

Еще записи по теме: Active Directory
Понравилась статья? Скажи спасибо и расскажи друзьям!
Назад:
Вперед:

Комментариев: 2

Оставить комментарий
  1. mc.sim | 17.05.2015

    Очень интересно.
    P.S. 200 групп — это сильно )))

    Ответить
    • itpro | 18.05.2015

      Уверяю, это не предел. Моя учетка, к примеру, состоит в 337 группах AD (причем непосредственно она включена всего в 70 групп, остальные появляются за счет вложенности групп одна в другую).
      Ох уж эта ролевая модель доступа….

      Ответить
Полные правила комментирования на сайте winitpro.ru. Вопросы, не связанные с содержимым статьи или ее обсуждением удаляются.

Сказать Спасибо! можно на этой странице или (еще лучше) поделиться с друзями ссылкой на понравившуюся статью в любимой социальной сети(специально для этого на сайте присуствуют кнопки популярных соц. сетей).

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)