Kerberos Tokensize exeeds IIS Headersize - Bad Request Request Too Long

Hallo zusammen,

Diesen Artikel habe ich geschrieben um einen Fehler in einem Produktiven Active Directory zu simulieren.

Ausgangslage

Benutzer können nach einer Forestmigration nicht auf einen Webserver mit Windows Authentication zugreifen. Sie erhalten eine Fehlermeldung "Bad Request - Request Too Long"

Vorbereitung auf dem Server

Auf dem Server richte ich eine neue Webseite ein welche unter http://test.destination.internal erreichbar ist und richte Windows Authentication ein.

Bei den Providers ist nur noch "Negotiate" drin.

Um den Service Principal Name (SPN) Eintrag zu machen gebe ich folgenden Befehl ein. Nur so hat der negotiate Prozess die möglichkeit ein Kerberos Service Token zu erhalten.

Setspn-A HTTP/test.destination.internal DEST02

Hier sieht man, dass auf dem Computerkonto der "servicePrincipalName" eingetragen ist.

HTTP/test.destination.internal

Vorbereitungen auf dem Client

Auf dem Client erhöhe ich die MaxTokenSize erhöht, damit ich Kerberos Tokens grösser als 12KB erhalten kann.

http://blogs.technet.com/b/shanecothran/archive/2010/07/16/maxtokensize-and-kerberos-token-bloat.aspx

Das grösste Problem war eigentlich eine Tokensize grösser als 12 KB zu erzeugen. Selbst ein Benutzer mit der maximalen Gruppenanzahl von 1015 Gruppen hatte eine TokenSize welche kliener als 10KB war.

Ich musste also eine Forest Migration mit ADMT von Gruppen machen, damit ich sidHistory Attribute an den Gruppen hatte und somit eine grössere Tokensize zu erzeugen.

Im Browser habe ich die URL zu der Internet Explorer Zone "Local Intranet" hinzugefügt, damit die Benutzercredentials automatisch gesendet werden.

Testen des Szenarios

Nun versuche ich mit dem Browser auf die Website zuzugreifen und erhalte die folgende Fehlermeldung:

Bad Request - Request Too Long

Auch das IIS Log hilft hier nicht weiter - da sieht man nur den Statuscode 401

#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2012-10-10 21:00:05
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
2012-10-10 21:00:05 172.21.175.96 GET / - 80 - 172.21.175.208 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/5.0;+SLCC2;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+Media+Center+PC+6.0;+.NET4.0C;+.NET4.0E) 401 2 5 31285
2012-10-10 21:02:06 172.21.175.96 GET / - 80 - 172.21.175.208 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/5.0;+SLCC2;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+Media+Center+PC+6.0;+.NET4.0C;+.NET4.0E) 401 2 5 0
2012-10-10 21:02:08 172.21.175.96 GET / - 80 DESTINATION\j.smith 172.21.175.208 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/5.0;+SLCC2;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+Media+Center+PC+6.0;+.NET4.0C;+.NET4.0E) 200 0 0 1059
2012-10-10 21:11:54 172.21.175.96 GET / - 80 - 172.21.175.208 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/5.0;+SLCC2;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+Media+Center+PC+6.0;+.NET4.0C;+.NET4.0E) 401 2 5 3

Das ganze habe ich aber mit dem Network Monitor aufgezeichnet. Mit dem Befehl "klist purge" habe ich die Kerberos Tickets vorgängig gelöscht.

Im Untenstehenden Bild sieht man wie das Kerberos Ticket ausgestellt wird und die grösse von 25638 Bit.

Beim HTTP Request wird die Authorisation mitgegeben. Man sieht hier dass die Authorisation 25727 Bit gross ist. Das Problem ist, dass die maximale Headergrösse im IIS per Default auf 16384 Bit eingestellt ist. Das ist dann natürlich zu gross.

Entfernt man wieder einige Gruppen, und kommt unter die IIS Headersize von 16 KB dann klappt alles wieder.

Lösung

Man kann die HTTP Headersize in der Registry vergrössern. Danach ist ein neustart des Servers notwendig.

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters\
MaxFieldLength
Default Value: 16384
Min – Max Value to set: 64 - 65534 (64kb) bytes

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\HTTP\Parameters\
MaxRequestBytes
Default value: 16384
Min-Max value to set: 256 - 16777216 (16MB) bytes

Weitere Informationen

http://blogs.technet.com/b/deds/archive/2010/06/01/maxtokensize-und-seine-freunde.aspx

Grüsse
Andres