2010-02-09 17 views
16

estamos utilizando JAAS para habilitar el Inicio de sesión único en una aplicación Java utilizando la memoria caché de Windows Kerberos. Nuestro archivo de configuración jaas.conf se ve así:¿Cómo validar un ticket Kerberos contra un servidor en Java?

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 vale 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 boleto de Kerberos fue creado por nuestro Directorio Activo.

Por el momento, hacemos una validación muy insegura del ticket simplemente comprobando si el nombre del servidor principal (KerberosTicket.getServer()) tiene nuestro nombre de dominio en la parte de dominio. Pero, por supuesto, cualquiera podría configurar un servidor Kerberos propio con el mismo nombre de dominio y usar ese ticket para iniciar la aplicación.

Una idea que encontré fue la de autenticar contra el LDAP de Active Directory utilizando el ticket de Kerberos. Desafortunadamente, utilizamos Windows 7 y reutilizar el ticket de Kerberos para autenticar contra LDAP solo funciona al establecer una entrada de 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 forma 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 su ayuda, Memminger

Respuesta

2

Como nadie parece saber realmente una respuesta a esto, yo supongo que tenemos que hacer un servicio adecuado Kerberos fuera de nuestra aplicación de servidor. Uno que inicia sesión en el Active Directory y que tiene el atributo ServicePrincipalName establecido correctamente. Algo así como lo hace SPNEGO para HTTP. Un buen punto de partida para hacerlo es el filtro 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 iniciar sesión en el servicio. Desafortunadamente, esto genera el mismo problema con la clave de registro, por lo que publiqué una nueva pregunta en Is there a way in Java or a command-line util to obtain a Kerberos ticket for a service using the native SSPI API?.

+0

¿Alguna vez descubrió esto? –

5

Como mencionaste, la forma correcta de resolver esto es mediante la kerberización de tu servicio, que es el objetivo principal del protocolo Kerberos (autenticar clientes contra servidores). La reutilización de tickets 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.

BTW, para obtener SSO con JAAS requiere tener ese allowtgtsessionkey establecido, no hay forma de evitarlo en Windows.

+1

Tenga en cuenta que los nombres de usuario de Active Directory con caracteres latinos no funcionan en el módulo de inicio de sesión de Kerberos en JAAS. Limitación significativa a menos que el sistema sea US-ASCII solamente. – akirekadu

Cuestiones relacionadas