Настройка размера токена Kerberos с помощью параметра MaxTokenSize
На днях столкнулся с довольно интересной проблемой у некоторых пользователей, заключающейся в невозможности аутентифицироваться на ряде доменных сервисов из-за превышения максимального размера билета (токена) Kerberos. В этой статье мы покажем, как определить размер билета Kerberos для конкретного пользователя и увеличить буфер для хранения токена с помощью параметра MaxTokenSize.
В нашем кейсе проблема проявлялась следующим образом. Некоторые пользователи не могли получить доступ к ряду развернутых служб.
- В частности, наблюдались проблема при попытке подключения к RDS ферме (ошибка “Access denied”)В логах серверов Remote Desktop фиксировалась ошибка:
Event ID:
6
Source:
Microsoft-Windows-Security-Kerberos
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: HKLMSYSTEMCurrentControlSetControlLsaKerberosParametersMaxTokenSize.
- При попытке подключении к SQL Server, наблюдалась такая ошибка:
Неизвестная ошибка, связанная с базой данных. SQL State: HY000, SQL Error Code:0 Cannot generate SSPI context. Обратитесь к администратору системы.
- На сайтах IIS появлялись ошибки:
Bad Request – Request header too long HTTP Error 400. The size of the request headers is too long.
- В журналах Event Viewer появлялись события:
Event ID:
40960
Source:
LSA (LsaSrv)
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 с учетом вложенных групп). Вместе с ошибками
SSPI token too large
это однозначно говорит о превышении максимальной длины билета Kerberos, используемого для аутентификации пользователей.
Размер билета Kerberos в Active Directory
Размер билета Kerberos зависит от следующих факторов:
- Количества групп безопасности Active Directory (в том числе вложенных) в которых состоит пользователь (группы рассылок типа Mail-enabled universal distribution group в токен не включаются);
- Используется ли SIDHistory;
Примечание. Проблема с превышением максимального размера билета особо часто встречается при миграции пользователей между доменами Active Directory, когда вам нужно сохраненить доступ к ресурсам старого домена через механизм SIDHistory.
- Используемого механизма аутентификации (обычный парольный или мультифакторный, например, через смарт карты)
- Доверена ли учетная запись для делегирования или нет.
Kerberos использует буфер для хранения авторизационной информации и передает его размер приложениям, использующих Kerberos. Размер буфера определяется системным параметром MaxTokenSize. Размер буфера имеет значение, т.к. некоторые протоколы, такие как RPC и HTTP, используют его при выделении блока памяти для аутентификации. Если авторизационные данные пользователя, пытающегося аутентифицироваться, превышают размер MaxTokenSize, попытка аутентификация считается неудачной. Этим можно объяснить ошибки аутентификации при доступе к IIS, в то время как файловый доступ к сетевым ресурсам сохраняется.
По-умолчанию, размер токена Kerberos (MaxTokenSize):
- В Windows 7 и Windows Server 2008R2 – 12 Кб.
- В Windows 8 и Windows Server 2012 (вплоть до Windows Server 2022 и Windows 11) размер увеличен до 48 Кб.
Таким образом, если пользователь состоит в большом количестве группах, которые не помещаются в размер буфера токена MaxTokenSize, то при доступе к некоторых ресурсам происходит сбой проверки подлинности.
Ограничение на максимальное количество групп пользователя в Active Directory
В Active Directory есть жесткий лимит на количество групп, в которых может состоять пользователь. Лимит составляет 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.
Если вы добавите пользователя более чем в 1015 групп, то он не сможет войти в Windows с ошибкой:
During a logon attempt, the user’s security context accumulated too many security IDs.
В журнале событий при этом появится запись:
Source:
LSA (LsaSrv)
EventID:
6035
During a logon attempt, the user’s security context accumulated too many security IDs. This is a very unusual situation. Remove the user from some global or local groups to reduce the number of security IDs to incorporate into the security context.
Вы можете узнать в скольких группах состоит пользователь с помощью командлета Get-ADUser из модуля AD PowerShell.
$user=Get-ADUser username
$token=(Get-ADUser $user -Properties tokengroups).tokengroups
$token.count
Как узнать текущий размер билета Kerberos пользователя?
В Windows нет удобных встроенных средств, позволяющих узнать размер токена Kerberos для конкретного пользователя. Для получения текущего размер билета Kerberos можно воспользоваться Powershell скриптом CheckMaxTokenSize.ps1 (изначально скрипт был написан Tim Springston и выложен на в Script Gallery на технет). Но сейчас скрипт там не доступен, поэтому я скопировал его в свой GitHub репозитарий (https://github.com/winadm/posh/blob/master/ActiveDirectory/CheckMaxTokenSize.ps1).
Скрипт позволяет получить текущий размер токена указанного пользователя, количество групп безопасности, в которых он включен, количество SID, хранящихся в SIDHistory пользователя, а также доверена ли учетная запись для делегирования или нет.
Скачайте скрипт и сохраните его в файл CheckMaxTokenSize.ps1. Разрешите запуск неподписанных скриптов политике выполнения PowerShell для текущей сессии:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Перейдите в каталог со скриптом:Cd c:ps
Чтобы узнать размер токена пользователя user_name:
.CheckMaxTokenSize.ps1 -Principals 'user_name' -OSEmulation $true -Details $true
Скрипт просит указать для какого окружения следует вычислить размер билета пользователя. Есть три варианта в зависимости от используемых версий Windows.
1 — В Windows 7 / Windows Server 2008 R2 и более ранних (размер токена 12К)
4 — В Windows 8 / Windows Server 2012 и последующих ОС (размер токена 48K)
6 – Windows 10/Windows Server 2016 и выше
Если у вас в сети остались снятые с поддержки Windows Server 2008 R2 и Windows 7, нужно выбрать опцию
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:WindowstempTokenSizeDetails.txt SIDHistory details included in output file at C:WindowstempTokenSizeDetails.txt
В данном случае мы определили, что пользователь user_name состоит в 957 доменных группах безопасности, а размер его билета Kerberos — 22648, что почти в 2 раза больше, чем стандартный размер Kerberos Token Size в Windows 7 и Windows Server 2008 R.
Таким образом, чтобы решить проблему с аутентификацией, нужно либо уменьшить размер токена пользователя, либо увеличить размер буфера на всех системах, на которых наблюдается проблема с авторизацией Kerberos.
Вы можете уменьшить размер билета Kerberos пользователя за счет:
- Уменьшения количества групп, в которых состоит пользователь;
- Очистки атрибута SID History;
- Отключения использования ограниченного делегирования Kerberos в атрибутах учетных записей (существенно сокращает размер токена).
Как увеличить размер буфера MaxTokenSize для Kerberos?
Вы можете увеличить максимальный размер буфера для токена Kerberos с помощью параметра реестра MaxTokenSize.
Microsoft не рекомендует устанавливать размер MaxTokenSize более 64Кб. Рекомендуется сначала увеличить лимит до 48Кб (лимит для Windows 8 / Windows Server 2012) и проверить работу сервисов. Чтобы увеличить размер буфера:
- Откройте редактор реестра и перейдите в раздел HKEY_LOCAL_MACHINESystemCurrentControlSetControlLsaKerberosParameters;
- Создайте новый параметр типа DWORD (32-bit) Value с именем MaxTokenSize;
- Укажите желаемое значение для максимального размер буфера (мы указали 48000 в десятичном форматер, т.к. размеры токена пользователей не превышают этого значения);
- Перезагрузите компьютер.
Эту операцию нужно выполнить на всех серверных системах, на которых наблюдается проблемы аутентификации.
Также вы можете задать максимальный MaxTokenSize с помощью параметра групповой политики Set maximum Kerberos SSPI context token buffer size. Находится она в разделе GPO Computer Configuration -> Policies -> Administrative Templates -> System -> Kerberos.
С помощью политики Warning for large Kerberos tickets вы можете настроить вывод в системный лог предупреждений о превышении размера билета.
После применения новых параметров групповых политик, если Windows обнаруживает превышение порогового размера билета 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.
Размер токена Kerberos и ошибка IIS HTTP 400 Bad Request (Request header too long)
Еще одна проблема, связанная с превышением размера токена Kerberos, возникает на веб сайтах Internet Information Services (IIS) с Kerberos аутентификацией. При использовании Kerberos аутентификации в IIS, информация о членстве в группах безопасности пользователя хранится в заголовке
WWW-Authenticate
. Если пользователь состоит в большом количестве групп, размер такого заголовка может быть превышен и аутентфикация пользователя не произойдет.
Для решения этой проблемы нужно увеличить лимиты в следующих параметров реестра в ветке HKEY_LOCAL_MACHINESystemCurrentControlSetServicesHTTPParameters
- MaxFieldLength – максимальный размер каждого заголовка (размер заголовка по-умолчани в IIS 16 Кб, максимальное значение 65536)
- MaxRequestBytes – максимальный размер строки запроса и заголовков (максимальное значение 16777216)
Не рекомендуется сразу устанавливать максимальные значения для этих параметров реестра. При больших размерах заголовков производительности и безопасность веб сервера IIS сильно снижается.
Рекомендуется начать со значения 32 Кб (32000) для каждого из этих параметров. После внесения изменений нужно перезагрузить сервер IIS.
Если проблема не исчезнет, пробуйте понемногу повышать размер лимитов вплоть до 48000 байт.
Если вы установите для MaxFieldLength максимальное значение 64 Кб, нужно использовать значение 48 Кб для MaxTokenSize (
3/4*64 Кб
).
PowerShell
Настройка размера токена Kerberos с помощью параметра MaxTokenSize