MaxTokenSize Parametresini Kullanarak Kerberos Simge Boyutunu Yapılandırma
Son zamanlarda, bazı kullanıcıların Kerberos biletinin maksimum boyutunu aşması nedeniyle bazı etki alanı hizmetlerinde kimlik doğrulaması yapamadığı oldukça ilginç bir sorunla karşılaştım. Bu makalede, size belirli bir kullanıcı için bir Kerberos anahtarının boyutunu nasıl belirleyeceğinizi ve MaxTokenSize parametresini kullanarak belirteci depolamak için arabelleği nasıl artıracağınızı göstereceğiz.
Bizim durumumuzda sorun bu şekilde kendini göstermiştir. Bazı kullanıcılar bazı etki alanı hizmetlerine erişemedi.
Özellikle, RDS çiftliğine bağlanmaya çalışırken bir hata oluştu (“Erişim reddedildi ” hatası). RDS ana bilgisayar günlüklerinde aşağıdaki hatayı görebilirsiniz: Olay Kimliği:
6Kaynak:
Microsoft-Windows-Security-KerberosThe 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'a bağlanmaya çalışırken, olay günlüğünde aşağıdaki hata belirdi:
Olay Kimliği:40960SQL State: HY000, SQL Error Code:0 Cannot generate SSPI context. IIS web sitelerinde ortaya çıkan hatalar:
Bad Request - Request header too long HTTP Error 400. The size of the request headers is too long.Olay Görüntüleyicide aşağıdaki olayları kontrol edin:
Olay Kimliği:40960Kaynak:
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).Grup İlkeleri kullanıcıya uygulanmaz.
Sorunu giderirken, tüm sorunlu kullanıcıların çok sayıda Active Directory güvenlik grubuna (iç içe gruplar dahil 200'den fazla) ait olduğunu fark ettik. SSPI belirteci çok büyük hatalarıyla birlikte bu, kullanıcının kimliğini doğrulamak için kullanılan maksimum Kerberos anahtarı uzunluğunun aşıldığını açıkça gösterir.
Kerberos Token Boyutu
Kerberos belirtecinin boyutu aşağıdakilere bağlıdır:
Bir kullanıcının üyesi olduğu Active Directory güvenlik gruplarının (iç içe geçmiş gruplar dahil) sayısı (Mail etkin evrensel dağıtım grupları belirteçte yer almaz);
SIDHhistory'nin kullanımı;
Not. Bilet fazlalığı sorunu, kullanıcılar Active Directory etki alanları arasında geçiş yaptığında ve eski etki alanı kaynaklarına SIDHistory kullanılarak erişildiğinde sıklıkla ortaya çıkar.
-
Kullanılan kimlik doğrulama türü (normal bir parola veya akıllı kartlar gibi çok faktörlü);
Hesabın yetki devri için güvenilir olup olmadığı.
Kerberos, kimlik doğrulama verilerini depolamak için bir arabellek kullanır ve boyutunu Kerberos kullanan uygulamalara aktarır. MaxTokenSize sistem parametresi arabelleğin boyutunu tanımlar. RPC veya HTTP gibi bazı protokoller kimlik doğrulama için bir bellek bloğu tahsis ederken kullandığından, arabellek boyutu önemlidir. Kullanıcı kimlik doğrulama verilerinin boyutu MaxTokenSize'daki değerden büyükse, kimlik doğrulama başarısız olur. Bu, paylaşılan ağ kaynaklarına dosya erişimi korunurken IIS'ye erişirken kimlik doğrulama hatalarını açıklayabilir.
Varsayılan olarak, Kerberos arabelleğinin boyutu (MaxTokenSize):
Windows 7 ve Windows Server 2008R2'de 12 KB
Windows 8 ve Windows Server 2012 ve sonrasında (Windows Server 2022 ve Windows 11'e kadar) 48 KB'a genişletildi
Bu nedenle, kullanıcı MaxTokenSize belirteç arabelleğine sığmayan çok sayıda grubun üyesiyse, bazı kaynaklara erişirken kimlik doğrulama başarısız olur.
Active Directory için Maksimum Grup Üyeliği Sınırları
Bir kullanıcının üye olabileceği AD gruplarının sayısında katı bir sınır vardır. Sınır, 1015 gruptur (iç içe gruplar dahil). Grup sayısı aşılırsa, kullanıcı Windows'ta oturum açtığında bir hata görüntülenir. Bir kullanıcıyı 1015'ten fazla gruba eklerseniz, şu hatayla Windows'ta oturum açamaz:
During a logon attempt, the user’s security context accumulated too many security IDs.Kaynak:
LSA (LsaSrv)
Etkinlik Kimliği:
6035During 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.AD PowerShell modülünden Get-ADUser cmdlet'ini kullanarak bir kullanıcının kaç gruba üye olduğunu öğrenebilirsiniz.
$user=Get-ADUser jsmith
$token=(Get-ADUser $user -Properties tokengroups).tokengroups
$token.countPowerShell Komut Dosyası ile Kerberos Token Boyutunu Alma
Windows, belirli bir kullanıcı için Kerberos belirteç boyutunu almanıza izin veren kullanışlı bir yerleşik araca sahip değildir. Geçerli Kerberos bilet boyutunu almak için CheckMaxTokenSize.ps1 Powershell komut dosyasını kullanabilirsiniz (komut dosyası orijinal olarak Tim Springston tarafından yazılmıştır ve TechNet'teki komut dosyası galerisine yüklenmiştir). Ancak betik artık orada mevcut değil, bu yüzden onu GitHub depoma kopyaladım (https://github.com/maxbakhub/winposh/blob/main/CheckMaxTokenSize.ps1).
Komut dosyası, belirtilen kullanıcının belirtecinin geçerli boyutunu, dahil edildiği güvenlik gruplarının sayısını, kullanıcının SIDHistory'sinde depolanan SID sayısını ve hesabın yetki devri için güvenilir olup olmadığını öğrenmenizi sağlar.
Betik dosyasını indirin ve CheckMaxTokenSize.ps1 olarak kaydedin. Geçerli oturum için PowerShell yürütme ilkesinde imzasız betiklerin çalışmasına izin verin:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUserKomut dosyasını içeren dizine gidin:
Cd c:\install\psVe jsmith kullanıcısı için Kerberos anahtarının boyutunu alın:
.\CheckMaxTokenSize.ps1 -Principals 'jsmith' -OSEmulation $true -Details $trueKomut dosyası, kullanıcı belirtecinin boyutunun hesaplanması gereken ortamı belirtmenizi ister. Üç seçenek vardır:
[1] Kerberos belirteç boyutunu Windows 7/Windows Server 2008 R2 ve önceki varsayılan 12K belirteç boyutunu kullanarak ölçer;
[4] Windows 8/Windows Server 2012 varsayılan simge boyutu olan 48K'yı kullanarak Kerberos belirteç boyutunu ölçün. Not: &48K ayarı, önceki birçok Windows sürümü için isteğe bağlı olarak yapılandırılabilir;
[6] Windows 10 ve sonraki sürümlerini kullanarak Kerberos jeton boyutunu ölçün.
Ağınızda hala eski Windows Server 2008 R2 ve Windows 7 varsa, 1 seçeneğini belirlemeniz ve Enter'a basmanız gerekir. Bir süre sonra (3-4 dakika), komut dosyası aşağıdaki bilgileri döndürür:
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
Bu durumda, jsmith, 957 etki alanı güvenlik gruplarının bir üyesidir ve 22648 Kerberos bilet boyutuna sahiptir; bu, varsayılan maksimum Kerberos simge boyutunun neredeyse 2 katıdır. Windows 7 ve Windows Server 2008 R'de.
Bu nedenle, kimlik doğrulama sorununu çözmek için, Kerberos kimlik doğrulama sorununun ortaya çıktığı tüm ana bilgisayarlarda kullanıcı belirteci boyutunu küçültmeniz veya arabellek boyutunu artırmanız gerekir.
Mümkünse, kullanıcı Kerberos belirtecinin boyutunu şu şekilde küçültmeyi deneyin:
Kullanıcının üye olduğu grup sayısı azaltılarak;
SID Geçmişi niteliğini temizleme;
Hesap özniteliklerinde Kerberos kısıtlamalı yetkilendirme kullanımının devre dışı bırakılması (belirteç boyutunu önemli ölçüde azaltır).
Kerberos Biletinin MaxTokenSize'ı Nasıl Artırılır?
MaxTokenSize kayıt defteri değerini kullanarak Kerberos belirteci için maksimum arabellek boyutunu artırabilirsiniz.
Microsoft, MaxTokenSize'ın 64 KB'nin üzerine ayarlanmasını önermez. Önce limiti 48Kb'a (Windows 8 ve Windows Server 2012 için limit) yükseltmeniz ve servislerin işleyişini kontrol etmeniz önerilir. Arabellek boyutunu artırmak için:
Kayıt Defteri Düzenleyicisini açın ve HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters kayıt anahtarına gidin;
MaxTokenSize adıyla yeni bir DWORD (32-bit) Value parametresi oluşturun;
Maksimum arabellek boyutu için gerekli değeri belirtin (kullanıcı belirtecinin boyutu bu değeri aşmadığından ondalık değeri 48000 olarak belirledik);
Bilgisayarını yeniden başlat.
Aşağıdaki PowerShell komutunu kullanarak kayıt defterinden değeri alarak Kerberos belirteci için geçerli arabellek boyutunu öğrenebilirsiniz:
Get-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters|select maxtokensizeBu değişiklik, kimlik doğrulama sorunları olan tüm ana bilgisayarlarda yapılmalıdır.
MaxTokenSize'ı maksimum Kerberos SSPI bağlam belirteci arabellek boyutu Grup İlkesi seçeneğini kullanarak da ayarlayabilirsiniz. Aşağıdaki GPO bölümü altında bulunur: Bilgisayar Yapılandırması -> İlkeler -> Yönetim Şablonları -> Sistem -> Kerberos.
Büyük Kerberos biletleri için uyarı politikasını kullanarak, Olay günlüklerine büyük boyutlu bilet uyarıları yazabilirsiniz.
Grup İlkesi ayarlarını güncelledikten sonra Windows, Kerberos bileti eşik boyutunun aşıldığını algılarsa Olay 31 günlüğe kaydedilir:
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.Kerberos Kullanan HTTP 400 Hatalı İstek (İstek Başlığı Çok Uzun)
Kerberos kimlik doğrulaması ile Internet Information Services (IIS) Web sitelerinde başka bir Kerberos belirteci aşırı boyut sorunu ortaya çıkıyor. IIS'de Kerberos kimlik doğrulaması kullanılırken, kullanıcının güvenlik grubu üyelik bilgileri, IIS'de depolanır.
WWW-Authenticatebaşlık. Kullanıcı çok sayıda güvenlik grubunun üyesiyse, böyle bir başlığın boyutu aşılabilir ve kullanıcının kimliği doğrulanmaz.
Bu sorunu çözmek için, reg anahtarında aşağıdaki kayıt defteri parametrelerinin değerlerini artırmanız gerekir.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\ParametersMaxFieldLength - her başlığın maksimum boyutu (IIS'deki varsayılan başlık boyutu 16 KB'dir, maksimum değer 65536'dır)
MaxRequestBytes - sorgu dizesi ve başlıklarının maksimum boyutu (maksimum değer 16777216)
Bu kayıt defteri parametreleri için kullanılabilir maksimum değerleri hemen ayarlamanız önerilmez. Büyük başlık boyutları, IIS web sunucusunun performansını ve güvenliğini büyük ölçüde azaltır.
Bu parametrelerin her biri için 32 KB (32000) değerinden başlamanız önerilir. Değişiklikleri yaptıktan sonra, IIS sunucusunu yeniden başlatmanız gerekir.
Sorun devam ederse, sınır boyutunu kademeli olarak 48000 bayta yükseltmeyi deneyin.
MaxFieldLength'i maksimum boyuta (64KB) ayarlarsanız, MaxTokenSize() için 48KB kullanmanız gerekir.
3/4*64 KB).








