Browsers sigue enviando token NTLM en lugar de Kerberos: ¿cómo resolverlo?
arece que no puedo configurar correctamente el sistema y que el navegador envíe una kerberos ticket para el servidor web. En cambio, unaNTLM
token es enviado.
Q: ¿Como puedo resolver esto
odos los detalles y configuraciones se enumeran a continuació
Infraestructura
Tengo tres máquinas dentro del dominioCOMPANY.local
:
PC-I7.COMPANY.local
(en192.168.0.5
). Actúa comoKDC
, se trata de unActive-Directory
servidor con las otras máquinas (ver más abajo) registradas en el AD. También tiene laDNS
para la red local configurada. El dominio en el Active Directory es:COMPANY.local
SOFTWARE.COMPANY.local
(en192.168.0.10
) ejecuta elembarcader aplicación web que tiene laJetty/SPNego
soporte configurado.OTHER.COMPANY.local
(en192.168.0.9
), solo un cliente para poder acceder al servidor de software desde otra máquina.Los dos últimos son en realidadVM
s corriendo en unalinux
servidor en la intranet. Son accesibles con su propia IP. Su primariaDNS
inNetwork Configuration
puntos a192.168.0.5
.
Ambos están unidos enCOMPANY.local
y están presentes como computadoras en elAD
.
Conozco cliente y servidor debe permanecer en diferentes máquinas; y estar en dos diferentesVM
debería evitar este problema.
Las tres máquinas están registradas comoA
hosts en elDNS
con un puntero inverso para cada uno de ellos en laReverse lookup zone
.
SPN
Después de haber creado el usuariosoftware
en Active Directory, genero el archivo de tabla de claves
ktpass -princ HTTP/[email protected] -mapuser [email protected] -crypto ALL -ptype KRB5_NT_PRINCIPAL -pass __PassForADUserSoftware__ -out C:/winnt/krb5.keytab
Obtengo el siguiente resultado que parece contener un error:
Targeting domain controller: PC-I7.COMPANY.local
Failed to set property 'userPrincipalName' to 'HTTP/[email protected]' on Dn 'CN=Software SSO Kerberized WebServer,DC=COMPANY,DC=local': 0x13.
WARNING: Failed to set UPN HTTP/[email protected] on CN=Software SSO Kerberized WebServer,DC=COMPANY,DC=local.
kinits to 'HTTP/[email protected]' will fail.
Successfully mapped HTTP/software.company.local to software.
Password successfully set!
Key created.
Key created.
Key created.
Key created.
Key created.
Output keytab to C:/winnt/krb5.keytab:
Keytab version: 0x502
keysize 64 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x1 (DES-CBC-CRC) keylength 8 (0x0bf1688040abadba)
keysize 64 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x3 (DES-CBC-MD5) keylength 8 (0x0bf1688040abadba)
keysize 72 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x17 (RC4-HMAC) keylength 16 (0x737d9811dd38e108741461ba79153192)
keysize 88 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x12 (AES256-SHA1) keylength 32 (0xcc8ab2939f822f9df6904a987954e0cfaa261bc36803af6c5f8d9a98f1d4f2aa)
keysize 72 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 8 etype 0x11 (AES128-SHA1) keylength 16 (0xd616b814dcd1b955f125ab4de5895d39)
LosAD
usuario tiene las dosThis account supports the Kerbers AES-...
casillas marcadas.
LosOTHER.COMPANY.local
servidor
Inicio sesión en esta máquina a través deRDP
con las credenciales:
user: Administrator
pass: ARandomPass
Cuando solicite un boleto deOTHER
servidor con
kinit HTTP/[email protected]
Puedo ver estos paquetes conwireshark
Internet explorer (y, por lo tanto, Chrome) tienen la siguiente configuración enInternet Options
:
Security > Local Intranet > Sites > *.company.local
Security > Custom level > Automatic logon only in Intranet area
Cuando llego a la aplicación web enhttp://software.company.local:8998/software/login
Puedo ver que el navegador envía unNTLM
solicitu
y puedo ver elExcepción de token defectuoso en el lado del servidor
WARN:oejs.SpnegoLoginService:qtp506835709-28:
GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
at sun.security.jgss.GSSHeader.<init>(GSSHeader.java:97)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:306)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285)
at org.eclipse.jetty.security.SpnegoLoginService.login(SpnegoLoginService.java:138)
at org.eclipse.jetty.security.authentication.LoginAuthenticator.login(LoginAuthenticator.java:61)
at org.eclipse.jetty.security.authentication.SpnegoAuthenticator.validateRequest(SpnegoAuthenticator.java:99)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:483)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.server.Server.handle(Server.java:524)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
at java.lang.Thread.run(Thread.java:748)
También esta información aparece en eljava
Iniciar sesión
Debug is true storeKey true useTicketCache false useKeyTab true doNotPrompt false
ticketCache is null isInitiator false
KeyTab is C:/software/inst/modules/common-config/auth/krb5.keytab refreshKrb5Config is false
principal is HTTP/[email protected] tryFirstPass is false
useFirstPass is false storePass is false clearPass is false
Información que puedo obtener de la respuesta vinculada:
Point 1: El SPN para el servicio HTTP coincide con la URL ingresada por el navegador. Yo ingresosoftware.company.local
en el navegador que es el mismo que el SPNHTTP/[email protected]
Punto 2:*.company.local
se agrega a los sitios de confianza.
Point 3: no estoy restringiendo la encriptación aDES-CBC-MD5
Point 3: he marcadoAES-128
yAES-256
... pero noDES
porque la versión de Windows Server con la que estoy trabajando tiene la casilla de verificación que diceUse only Kerberos DES encryption types for this account
, que no es lo que quiero. ¿Debería verificarlo?
LosSOFTWARE.COMPANY.local
servidor
Losembarcader la aplicación web está registrada como un servidor de Windows.
Estos son los archivos de configuración:
krb5.ini
archivo
[libdefaults]
default_realm = COMPANY.LOCAL
permitted_enctypes = rc4-hmac,aes128-cts,aes256-cts,arcfour-hmac-md5,aes256-cts-hmac-sha1-96
default_tgs_enctypes = rc4-hmac,aes128-cts,aes256-cts,arcfour-hmac-md5,aes256-cts-hmac-sha1-96
default_tkt_enctypes = rc4-hmac,aes128-cts,aes256-cts,arcfour-hmac-md5,aes256-cts-hmac-sha1-96
default_keytab_name = FILE:C:/software/inst/modules/common-config/krb5.keytab
[domain_realm]
COMPANY.local = COMPANY.LOCAL
.company.local = COMPANY.LOCAL
[realms]
COMPANY.LOCAL = {
admin_server = PC-I7.COMPANY.local
kdc = PC-I7.COMPANY.local:88
}
spnego.conf
archivo
com.sun.security.jgss.initiate {
com.sun.security.auth.module.Krb5LoginModule required
principal = "HTTP/[email protected]"
keyTab = "C:/software/inst/modules/common-config/auth/krb5.keytab"
useKeyTab = true
storeKey = true
debug = true
isInitiator = false;
};
com.sun.security.jgss.accept {
com.sun.security.auth.module.Krb5LoginModule required
principal = "HTTP/[email protected]"
useKeyTab = true
keyTab = "C:/software/inst/modules/common-config/auth/krb5.keytab"
storeKey=true
debug=true
isInitiator=false;
};
y esta es laspnego.properties
archivo
targetName = HTTP/software.company.local
Mijetty-web.xml
el archivo de configuración contiene:
<Get name="securityHandler">
<Set name="loginService">
<New class="org.eclipse.jetty.security.SpnegoLoginService">
<Set name="name">Company Realm</Set>
<Set name="config">
<SystemProperty name="jetty.home" default="."/>/modules/common-config/auth/spnego.properties</Set>
</New>
</Set>
<Set name="checkWelcomeFiles">true</Set>
</Get>
Así es como programáticamente registro laspnego
configuración enJava
:
private SecurityHandler wrapEnableSSOAuthHandlers(final Handler collection) {
// ini file
System.setProperty(
"java.security.krb5.conf",
_config.getString("authentication.win_sso.spnego.krb5") // the krb5.ini file
);
System.setProperty(
"java.security.auth.login.config",
_config.getString("authentication.win_sso.spnego.login") // the spnego.conf file
);
System.setProperty(
"javax.security.auth.useSubjectCredsOnly",
"false"
);
final Constraint spnegoConstraint = new Constraint();
spnegoConstraint.setName(Constraint.__SPNEGO_AUTH);
final String domainRealm = _config.getString("authentication.win_sso.domain.realm"); // resolves to COMPANY.LOCAL
spnegoConstraint.setRoles(new String[]{domainRealm});
spnegoConstraint.setAuthenticate(true);
final ConstraintMapping mapping = new ConstraintMapping();
mapping.setConstraint(spnegoConstraint);
mapping.setPathSpec("/*");
final String spnegoProperties = _config.getString("authentication.win_sso.spnego.properties"); // the spnego.properties file
final SpnegoLoginService loginService = new SpnegoLoginService();
loginService.setConfig(spnegoProperties);
loginService.setName(domainRealm);
final ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler();
securityHandler.setLoginService(loginService);
securityHandler.setConstraintMappings(new ConstraintMapping[]{mapping});
securityHandler.setRealmName(domainRealm);
securityHandler.setAuthenticator(new SpnegoAuthenticator());
securityHandler.setHandler(collection);
return securityHandler;
}
// here I disable the TRACE method for all calls
Handler wrappedSecurityHandler = wrapDisableTraceHandlers(handlers);
wrappedSecurityHandler = wrapEnableSSOAuthHandlers(wrappedSecurityHandler);
_server.setHandler(wrappedSecurityHandler);
EDIT 1: Información adicional
He descargado la Herramienta de prueba de autenticación Kerberos y al ejecutarlo desde elKDC
servidor 192.168.0.5
) y pruebas contrahttp://software.company.local:8998
muestra una @ correcKerberos
autenticación.
Al ejecutarlo desde el192.168.0.10
servidor (donde está el navegador) dice:
Encabezado de autorización inesperado
y método de autenticación:NTLM
.
Supongo que es unaDNS
problema o el hecho de que son dosVM
en el mismo servidor.