Поиск по сайту:

Настройка размера токена Kerberos с помощью параметра MaxTokenSize


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

В нашем случае проблема проявилась таким образом. Некоторым пользователям не удалось получить доступ к некоторым службам домена.

  • В частности, возникла ошибка при попытке подключения к ферме RDS (ошибка «Доступ запрещен»). В журналах узла RDS может появиться следующая ошибка: Идентификатор события:

    6

    Источник:

    Microsoft-Windows-Security-Kerberos
    The Kerberos SSPI package generated an output token of size 21043 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 в журнале событий появилась следующая ошибка:
    Идентификатор события:

    40960
    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.
  • Проверьте следующие события в средстве просмотра событий:
    Идентификатор события:

    40960

    Источник:

    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 big это ясно указывает на то, что максимальная длина билета Kerberos, используемого для аутентификации пользователя, превышена.

Размер токена Kerberos

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

  • Количество групп безопасности Active Directory (включая вложенные группы), членом которых является пользователь (универсальные группы рассылки с включенной поддержкой почты не включены в токен);

  • Использование SIDHistory;

    Примечание. Проблема слишком большого размера билета довольно часто возникает, когда пользователи мигрируют между доменами Active Directory и доступ к старым ресурсам домена осуществляется с помощью SIDHistory.

  • Тип используемой аутентификации (обычный пароль или многофакторная, например смарт-карты);

  • Доверена ли учетная запись для делегирования.

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

По умолчанию размер буфера Kerberos (MaxTokenSize) составляет:

  • 12 КБ в Windows 7 и Windows Server 2008R2

  • Расширено до 48 КБ в Windows 8 и Windows Server 2012 и более поздних версиях (вплоть до Windows Server 2022 и Windows 11).

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

Максимальные ограничения на членство в группах для Active Directory

Существует жесткое ограничение на количество групп AD, членом которых может быть пользователь. Ограничение — 1015 групп (включая вложенные группы). Если количество групп превышено, при входе пользователя в Windows появляется ошибка. Если добавить пользователя более чем в 1015 групп, то он не сможет войти в Windows с ошибкой:

During a logon attempt, the user’s security context accumulated too many security IDs.

Источник:

LSA (LsaSrv)

Идентификатор события:

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 jsmith
$token=(Get-ADUser $user -Properties tokengroups).tokengroups
$token.count

Получение размера токена Kerberos с помощью сценария PowerShell

В Windows нет удобного встроенного инструмента, позволяющего узнать размер токена Kerberos для конкретного пользователя. Чтобы получить текущий размер билета Kerberos, вы можете использовать сценарий Powershell CheckMaxTokenSize.ps1 (сценарий изначально был написан Тимом Спрингстоном и загружен в галерею сценариев на TechNet). Но сейчас скрипт там недоступен, поэтому я скопировал его в свой репозиторий на GitHub (https://github.com/maxbakhub/winposh/blob/main/CheckMaxTokenSize.ps1).

Скрипт позволяет получить текущий размер токена указанного пользователя, количество групп безопасности, в которые он входит, количество SID, хранящихся в SIDHistory пользователя, а также является ли учетная запись доверенной для делегирования.

Загрузите файл сценария и сохраните его как CheckMaxTokenSize.ps1. Разрешите запуск неподписанных сценариев в политике выполнения PowerShell для текущего сеанса:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Перейдите в каталог, содержащий скрипт:

Cd c:\install\ps

И получим размер билета Kerberos для пользователя jsmith:

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

Скрипт предлагает указать среду, для которой необходимо рассчитать размер токена пользователя. Есть три варианта:

  • [1] Оцените размер токена Kerberos, используя размер токена по умолчанию для Windows 7/Windows Server 2008 R2 и более ранних версий, равный 12 КБ;

  • [4] Оцените размер токена Kerberos, используя размер токена Windows 8/Windows Server 2012 по умолчанию, равный 48 КБ. Примечание. Параметр &48K можно настроить для многих более ранних версий Windows;

  • [6] Измерьте размер токена Kerberos с помощью Windows 10 и более поздних версий.

Если в вашей сети все еще используются устаревшие версии Windows Server 2008 R2 и Windows 7, вам нужно выбрать опцию 1 и нажать Enter. Через некоторое время (3-4 минуты) скрипт вернет следующую информацию:

Token Details for user jsmith
**********************************
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 45269.
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 jsmith*
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.
1088 are domain global scope security groups.
37 are domain local security groups.
86 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

В данном случае jsmith является членом группы безопасности домена 957 и имеет размер билета Kerberos 22648, что почти в 2 раза превышает максимальный размер токена Kerberos по умолчанию. в Windows 7 и Windows Server 2008 R.

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

Если возможно, попробуйте уменьшить размер пользовательского токена Kerberos следующим образом:

  • Уменьшение количества групп, членом которых является пользователь;

  • Очистка атрибута SID History;

  • Отключение использования ограниченного делегирования Kerberos в атрибутах учетной записи (значительно уменьшает размер токена).

Как увеличить MaxTokenSize билета Kerberos?

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

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

  1. Откройте редактор реестра и перейдите к ключу реестра HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters;

  2. Создайте новый параметр Значение DWORD (32-разрядное) с именем MaxTokenSize;

  3. Укажите необходимое значение максимального размера буфера (мы указали десятичное значение 48000, поскольку размер пользовательского токена не превышает это значение);

  4. Перезагрузите компьютер.

Вы можете узнать текущий размер буфера для токена Kerberos, получив значение из реестра с помощью следующей команды PowerShell:

Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters|select maxtokensize

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

Вы также можете установить MaxTokenSize с помощью параметра групповой политики максимальный размер буфера маркера контекста Kerberos SSPI. Он расположен в следующем разделе объекта групповой политики: Конфигурация компьютера -> Политики -> Административные шаблоны -> Система -> Kerberos.

Используя политику Предупреждение о больших билетах Kerberos, вы можете записывать в журналы событий оповещения о слишком больших билетах.

Если после обновления настроек групповой политики Windows обнаружит, что пороговый размер билета Kerberos превышен, будет зарегистрировано Событие 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 22648 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 the 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 a member of, the claims data the account is setup for, and the resource groups resolved in the resource domain.

HTTP 400 Неверный запрос с использованием Kerberos (слишком длинный заголовок запроса)

Другая проблема с превышением размера токена Kerberos возникает на веб-сайтах служб IIS с проверкой подлинности Kerberos. При использовании проверки подлинности Kerberos в IIS информация о членстве пользователя в группе безопасности сохраняется в файле

WWW-Authenticate

заголовок. Если пользователь является членом большого количества групп безопасности, размер такого заголовка может быть превышен, и пользователь не будет аутентифицирован.

Чтобы решить эту проблему, вам необходимо увеличить значения следующих параметров реестра в ключе reg.

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters
  • MaxFieldLength - максимальный размер каждого заголовка (размер заголовка по умолчанию в IIS составляет 16 КБ, максимальное значение - 65536)

  • MaxRequestBytes - максимальный размер строки запроса и заголовков (максимальное значение 16777216)

Не рекомендуется сразу устанавливать максимально доступные значения для этих параметров реестра. Большие размеры заголовков значительно снижают производительность и безопасность веб-сервера IIS.

Рекомендуется начинать со значения 32 КБ (32000) для каждого из этих параметров. После внесения изменений необходимо перезагрузить сервер IIS.

Если проблема не устранена, попробуйте постепенно увеличить предельный размер до 48 000 байт.

Если для MaxFieldLength установлен максимальный размер (64 КБ), вам необходимо использовать 48 КБ для MaxTokenSize (

3/4*64 KB

).

Статьи по данной тематике