¿Cómo validar un ticket de Kerberos contra un servidor en Java?
active-directory single-sign-on (2)
Como mencionó, la forma correcta de resolver esto es mediante la kerberización de su servicio, que es el punto central del protocolo Kerberos (autenticación de clientes contra servidores). La reutilización del ticket no funciona exactamente porque sería un problema de seguridad si lo hiciera. Un servicio Kerberos no necesita "iniciar sesión en Active Directory", solo necesita tener una clave compartida con AD.
Por cierto, para obtener el SSO utilizando JAAS es necesario tener ese conjunto de teclas allowtgtsession, no hay forma de evitarlo en Windows.
estamos utilizando JAAS para habilitar el inicio de sesión único en una aplicación Java utilizando el caché de tickets de Windows Kerberos. Nuestro archivo de configuración jaas.conf se ve así:
LoginJaas {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
doNotPrompt=true
debug=true;
};
Con esto, podemos crear un Jaas LoginContext y obtener con éxito el ticket Kerberos del usuario. Enviamos este ticket a nuestra aplicación de servidor usando JMI. Sin embargo, lo que no logramos hacer es verificar en el servidor que el ticket de Kerberos fue creado por nuestro Directorio Activo.
En este momento, hacemos una validación muy insegura del ticket simplemente verificando si el nombre del servidor principal (KerberosTicket.getServer ()) tiene nuestro nombre de dominio en la parte del dominio. Pero, por supuesto, cualquiera puede configurar un servidor Kerberos con el mismo nombre de reino y usar ese ticket para iniciar la aplicación.
Una idea que encontré fue autenticarme contra el LDAP de Active Directory usando el ticket de Kerberos. Desafortunadamente, usamos Windows 7 y la reutilización del ticket de Kerberos para autenticar contra LDAP solo funciona cuando se configura una entrada del Registro (consulte http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html , busque allowtgtsessionkey). Esto es inaceptable para nuestros usuarios.
¿Hay alguna forma de validar el ticket contra nuestro servidor de Active Directory? Sospecho que hay una manera de comprobar si el ticket KerberosTicket.getServer () es igual al ticket de nuestro servidor, pero no tengo idea de cómo hacerlo. ACTUALIZACIÓN: KerberosTicket (). GetServer () solo devuelve un KerberosPrincipal que no contiene nada más que el nombre y el dominio del ticket del servidor, por lo que no es adecuado para la validación.
Gracias por tu ayuda, memminger
Como nadie parece realmente saber una respuesta a esto, supongo que tenemos que hacer un servicio Kerberos adecuado de nuestra aplicación de servidor. Uno que inicia sesión en el propio Active Directory y que tiene el atributo ServicePrincipalName establecido correctamente. Algo así como SPNEGO hace para HTTP. Un buen punto de partida para hacerlo será el filtro de Servlet SPNEGO en SourceForge ( http://spnego.sourceforge.net/ ). http://thejavamonkey.blogspot.com/2008/04/clientserver-hello-world-in-kerberos.html es también un muy buen ejemplo de cómo hacer el inicio de sesión del Servicio. Desafortunadamente, esto lleva al mismo problema con la clave de registro, así que publiqué una nueva pregunta en ¿Existe alguna forma en Java o en una línea de comandos para obtener un ticket de Kerberos para un servicio utilizando la API SSPI nativa? .