Innego dnia napotkałem dość interesujący problem dla niektórych użytkowników, a mianowicie niemożność uwierzytelnienia się za pomocą wielu usług domenowych z powodu przekroczenia maksymalnego rozmiaru biletu Kerberos (tokena). W tym artykule postaramy się rozważyć funkcje tworzenia tokena Kerberos, metodologię określania jego rozmiaru dla konkretnego użytkownika i zwiększenia bufora do przechowywania go.
W naszym przypadku problem objawił się następująco. Niektórzy użytkownicy nie mogli uzyskać dostępu do wielu wdrożonych usług. W szczególności wystąpił problem podczas próby połączenia się z farmą RDS (błąd „Odmowa dostępu”)
W dziennikach serwera pulpitu zdalnego zarejestrowano błąd zdarzenia o identyfikatorze 6:
Pakiet kerberos SSPI wygenerował token wyjściowy o rozmiarze 22041 bajtów, który był zbyt duży, aby zmieścić się w buforze tokenów o rozmiarze 12000 bajtów, dostarczonym przez identyfikator procesu 4.Wyjściowy token SSPI jest zbyt duży, prawdopodobnie wynika to z faktu, że użytkownik @ domena jest członkiem dużej liczby grup.
Zaleca się zminimalizowanie liczby grup, do których użytkownik należy. Jeśli problemu nie można rozwiązać poprzez zmniejszenie członkostwa w grupach tego użytkownika, skontaktuj się z administratorem systemu, aby zwiększyć maksymalny rozmiar tokena, który jest konfigurowany dla całej maszyny za pomocą następującej wartości rejestru: HKLM \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Parameters \ MaxTokenSize.
Podczas próby połączenia z programem SQL Server zaobserwowano następujący błąd:
Nieznany błąd bazy danych.
Stan SQL: HY000, kod błędu SQL: 0
Nie można wygenerować kontekstu SSPI. Skontaktuj się z administratorem systemu.
W dzienniku zarejestrowano błąd Identyfikator zdarzenia -40960
System bezpieczeństwa wykrył błąd uwierzytelnienia dla serwera XXXXXX. Kod błędu z protokołu uwierzytelniania Kerberos to „Zbyt mały buforBufor jest zbyt mały, aby mógł zawierać wpis. Żadne informacje nie zostały zapisane w buforze. (0xc0000023).
Sprawdzanie praw dostępu do zasobów nie ujawniło problemu. Dalsze badanie incydentu ujawniło zależność - wszyscy „problematyczni” użytkownicy należeli do dużej liczby grup zabezpieczeń Active Directory (biorąc pod uwagę zagnieżdżone grupy ponad 200). Dlatego stopniowo doszliśmy do wniosku, że problemem jest przekroczenie maksymalnej długości biletu Kerberos używanego do autoryzacji użytkowników.
Treść
- Rozmiar biletu Kerberos
- Jak znaleźć aktualny rozmiar biletu Kerberos użytkownika
- Zmniejszenie rozmiaru tokena Kerberos dla użytkownika
- Jak zwiększyć rozmiar tokena Kerberos
Rozmiar biletu Kerberos
Rozmiar biletu Kerberos zależy od następujących czynników:
- Liczba grup zabezpieczeń usługi Active Directory (w tym zagnieżdżonych), których użytkownik jest członkiem (grupy typów dystrybucji nie są uwzględnione w tokenie)
- Zastosowania SIDHistory.Uwaga. Problem z przekroczeniem maksymalnego rozmiaru biletu jest szczególnie powszechny podczas migracji użytkowników między domenami Active Directory i utrzymywania dostępu do zasobów starej domeny za pośrednictwem mechanizmu SIDHistory
- Zastosowany mechanizm uwierzytelniania (zwykłe hasło lub wieloskładnikowe, na przykład karty inteligentne)
- Niezależnie od tego, czy konto jest delegowane do przekazania, czy nie
Kerberos używa bufora do przechowywania informacji o autoryzacji i przesyła swój rozmiar do aplikacji korzystających z Kerberos. Parametr systemowy MaxTokenSize - określa rozmiar bufora. Rozmiar bufora ma znaczenie, ponieważ niektóre protokoły, takie jak RPC i HTTP, używają go podczas przydzielania bloku pamięci do uwierzytelnienia. Jeśli dane uwierzytelniające użytkownika próbującego się uwierzytelnić przekraczają rozmiar MaxTokenSize, próbę uwierzytelnienia uznaje się za nieudaną. Może to wyjaśniać błędy uwierzytelnienia podczas uzyskiwania dostępu do IIS, przy jednoczesnym zachowaniu dostępu do plików do zasobów sieciowych..
Domyślnie rozmiar bufora Kerberos (MaxTokenSize)
- W systemie Windows 7 i Windows Server 2008R2 - 12 Kb.
- W systemach Windows 8 i Windows Server 2012 rozmiar jest zwiększany do 48 KB.
Dlatego jeśli użytkownik należy do dużej liczby grup, wszystkie opisy grup po prostu nie mieszczą się w 12 KB, a podczas uzyskiwania dostępu do niektórych zasobów uwierzytelnianie nie powiedzie się.
Wskazówka. Istnieje sztywny limit liczby grup, do których użytkownik może należeć. Limit wynosi 1015 grup. Jeśli liczba grup zostanie przekroczona, użytkownik zaloguje się do systemu. „System nie może się zalogować z powodu następującego błędu: Podczas próby logowania kontekst bezpieczeństwa użytkownika zgromadził zbyt wiele identyfikatorów bezpieczeństwa. Spróbuj ponownie lub skontaktuj się z administratorem systemu”Jak znaleźć aktualny rozmiar biletu Kerberos użytkownika
W systemie Windows brakuje wygodnych, wbudowanych narzędzi do określania wielkości tokena Kerberos dla konkretnego użytkownika.
Aby uzyskać bieżący rozmiar biletu, używamy zewnętrznego skryptu Powershell CheckMaxTokenSize.ps1 (od Tim Springston - Microsoft). Skrypt pozwala uzyskać aktualny rozmiar tokena określonego użytkownika, liczbę grup zabezpieczeń, w których jest on uwzględniony, liczbę identyfikatorów SID przechowywanych w historii SID użytkownika, a także to, czy konto do delegowania jest zaufane, czy nie
Aby użyć skryptu, pobierz go z powyższego łącza i zapisz pod nazwą CheckMaxTokenSize.ps1
Wyłącz weryfikację skryptu:
Set-ExecutionPolicy RemoteSigned
Przejdź do katalogu ze skryptem
Cd c: \ install \ ps
I dowiedz się, jaki jest rozmiar biletu Kerberos dla nazwa_użytkownika:
.\ CheckMaxTokenSize.ps1 -Principals 'nazwa_użytkownika' -OSEmulation $ true -Details $ true
Skrypt prosi o określenie, dla którego środowiska należy obliczyć rozmiar biletu użytkownika. Istnieją dwie opcje.
1 - W systemie Windows 7 / Windows Server 2008 R2 i wcześniejszych (rozmiar tokena 12 KB)
4 - W systemie Windows 8 / Windows Server 2012 i późniejszych systemach operacyjnych (rozmiar tokena 48 KB)
Naciśnij 1 i Enter. Po chwili (3-4 minuty) skrypt zwróci następujące informacje:
Szczegóły tokena dla użytkownika nazwa_użytkownika
************************************
Domena użytkownika to CORP.
Całkowity szacunkowy rozmiar tokena wynosi 22648.
W przypadku dostępu do kontrolerów domeny i zasobów delegowanych całkowity szacowany rozmiar delegacji tokena wynosi 45296.
Efektywna wartość MaxTokenSize to: 12000
Wykryto problem. Token był zbyt duży, aby umożliwić spójną autoryzację. Zmień maksymalny rozmiar na KB http://support.microsoft.com/kb/327825 i rozważ zmniejszenie bezpośredniego i przechodniego członkostwa w grupie.
* Szczegóły tokena dla nazwy użytkownika *
W tokenie znajduje się 957 grup.
W SIDHistory użytkowników znajdują się identyfikatory SID.
W grupach użytkowników jest 248 atrybutów SIDHID.
Istnieje ogółem 248 historii SID dla użytkowników i grup, których użytkownik jest członkiem.
1188 to grupy zabezpieczeń globalnego zakresu domeny.
37 to lokalne grupy zabezpieczeń domeny.
68 to uniwersalne grupy zabezpieczeń w domenie użytkowników.
0 to uniwersalne grupy zabezpieczeń spoza domeny użytkowników.
Szczegóły grupy zawarte w pliku wyjściowym w C: \ Windows \ temp \ TokenSizeDetails.txt
Szczegóły historii SID zawarte w pliku wyjściowym w C: \ Windows \ temp \ TokenSizeDetails.txt
W związku z tym ustaliliśmy, że nazwa_użytkownika należy do 957 grup domen zabezpieczeń i wielkość jego biletu Kerberos - 22648, który jest prawie 2 razy większy niż standardowy rozmiar tokena Kerberos w Windows 7 / Windows Server 2008 R..
Dlatego w celu rozwiązania problemu z uwierzytelnianiem musisz albo zmniejszyć rozmiar tokena użytkownika, albo zwiększyć rozmiar bufora we wszystkich systemach serwerowych, w których obserwuje się autoryzację Kerberos.
Zmniejszenie rozmiaru tokena Kerberos dla użytkownika
Jeśli to możliwe, spróbuj zmniejszyć bilet Kerberos użytkownika przez:
- Zmniejszenie liczby grup użytkowników.Wskazówka. Można to ułatwić wprowadzając nowy mechanizm kontroli dostępu do zasobów plików, który pojawił się w systemie Windows Server 2012 - Dynamiczna kontrola dostępu
- Czyszczenie historii SID
- Odmowa zaufania do przekazania kont (znacznie zmniejsza rozmiar tokena)
Jak zwiększyć rozmiar tokena Kerberos
W przypadku, gdy nie jest możliwe zmniejszenie rozmiaru biletu Kerberos dla użytkowników, możesz zwiększyć dla niego rozmiar bufora. W tym celu rejestr ma specjalny parametr MaxTokenSize.
Microsoft nie zaleca ustawiania rozmiaru MaxTokenSize na więcej niż 64 KB, ogólnie zaleca się, aby najpierw zwiększyć limit do 48 KB (limit dla Windows 8/2012). Aby zwiększyć rozmiar bufora:
- Otwórz edytor rejestru i przejdź do sekcji HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Lsa \ Kerberos \ Parametry.
- Utwórz nowy parametr typu Wartość DWORD (32-bit) z imieniem MaxTokenSize
- Podaj żądaną wartość maksymalnego rozmiaru bufora (określono 48000, ponieważ rozmiar tokena użytkownika nie przekracza tej wartości)
- Uruchom ponownie system
Tę operację należy wykonać na wszystkich systemach serwerów, na których występują problemy z uwierzytelnianiem..
Jeśli problemy z uwierzytelnianiem występują w witrynach IIS, należy również zwiększyć rozmiar nagłówka HTTP do 64 KB (0000ffff). Domyślnie maksymalny rozmiar nagłówka wynosi 16 KB. Aby to zrobić, na serwerach IIS należy wprowadzić następujące zmiany w rejestrze (wymagane będzie również ponowne uruchomienie):
HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ HTTP \ Parameters \ MaxFieldLength
DWORD: 0000ffff
HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Services \ HTTP \ Parameters \ MaxRequestBytes
DWORD: 0000ffff
Systemy Windows 8 i Windows Server 2012 mają nowe zasady, które pozwalają ustawić maksymalny rozmiar MaxTokenSize - Set maksymalnie Kerberos SSPI kontekst token bufor rozmiar. Znajduje się w obszarze Konfiguracja komputera -> Zasady -> Szablony administracyjne -> System -> Kerberos.
Ponadto istnieje inna interesująca polityka. Ostrzeżenie dla dużych biletów Kerberos , umożliwiając skonfigurowanie danych wyjściowych w dzienniku systemowym ostrzeżeń o przekroczeniach biletów.
Po włączeniu zasady, po przekroczeniu progu wielkości biletu, zdarzenia zostaną zapisane w dzienniku Wydarzenie 31 z tekstem:
Bilet do usługi ldap / „DC Name” / „DomainName” jest wydawany na konto „AccountName” @ „DomainName”. Rozmiar zaszyfrowanej części tego biletu wynosi 17421 bajtów, co jest wartością zbliżoną lub większą niż skonfigurowany próg wielkości biletu (12000 bajtów). Ten bilet lub wszelkie dodatkowe bilety wydane z tego biletu mogą spowodować błędy uwierzytelnienia, jeśli aplikacja klienta lub serwera przydzieli bufory tokenów SSPI ograniczone przez wartość zbliżoną do wartości progowej.
.