2010-02-25 5 views
18

Deseo implementar Single Sign On con Kerberos en Java y he logrado crear un ticket para el Servicio utilizando el ticket del inicio de sesión de Windows. Desafortunadamente, solo puedo crear ese ticket cuando la clave de registro "allowtgtsessionkey" está habilitada. Recibo una excepción con el mensaje "El identificador no coincide con el valor esperado (906)" tan pronto como lo desactivo. La clave de registro está documentada en http://java.sun.com/j2se/1.5.0/docs/guide/security/jgss/tutorials/Troubleshooting.html y http://support.microsoft.com/kb/308339.¿Existe alguna forma en Java o en una línea de comandos para obtener un vale Kerberos para un servicio que utiliza la API SSPI nativa?

Lamentablemente no tengo acceso al registro en las computadoras donde se utilizará mi aplicación, entonces estoy buscando una manera de hacerlo sin tener que modificarlo. Cuando realizo el inicio de sesión único en SPNEGO en Internet Explorer o Mozilla Firefox, crean un ticket de servicio en mi caché de tickets, por lo que definitivamente tiene que haber una forma de hacerlo sin configurar la clave de registro. ¿Alguien tiene una idea de cómo hacer esto en Java?

Gracias por su ayuda, Memminger

Actualización: Me estoy dando seguimiento a este tema. La clave de registro de Windows impide el acceso al ticket (más exactamente: el asunto) dentro de la memoria caché del ticket. Java en Windows usa su propia implementación de GSSAPI, y supongo que necesita acceso al ticket para crear un ticket de servicio. Sin embargo, la API SSPI de Windows tiene acceso completo a la memoria caché de Ticket y, por lo tanto, puede crear tickets de Servicio. Esta API es utilizada por los navegadores web, pero Java no la usa (de acuerdo con http://java.sun.com/developer/technicalArticles/J2SE/security/#3). Cuando desactivo SSPI en Firefox después de haber accedido a una página web (para que se haya creado un ticket de servicio), aún puedo acceder a la página, así que tal vez bastaría con una línea de comando que cree un ticket de servicio utilizando la API de SPPI.

Para nosotros, esto significa que ahora podemos abandonar el inicio de sesión único (que no es aceptable para nosotros) o que realizamos la autenticación en el lado del cliente de nuestra aplicación (porque solo podemos leer el nombre de usuario pero no verificar el boleto en el servidor), que es un riesgo de seguridad importante. Otro ejemplo de cómo las restricciones de seguridad más fuertes llevan a agujeros de seguridad más grandes porque se vuelven demasiado complicados de usar.

+0

¿Ha mirado OpenID como una alternativa a Kerberos? –

+0

Conozco OpenID y lo estoy usando para varios servicios web. Pero en este caso hay una infraestructura existente que utiliza Kerberos y, por cierto, quiero implementar SSO para una aplicación que no es web, por lo que no creo que OpenID brinde ningún beneficio a los usuarios. – user269667

Respuesta

4

Perdona si te estoy mal entendido problema, pero ...

El punto de los sistemas de tipo SSO es que el cliente se autentifica directamente al servidor de autenticación (por separado), y obtiene un boleto de ella. A continuación, pasa el ticket al (los) servidor (s) de destino que desea utilizar, cada uno de los cuales verifica que el ticket sea válido con el servidor de autenticación. Si el ticket se valida, el servidor puede suponer que el cliente solo lo obtuvo presentando el servidor Kerberos (de confianza) con credenciales aceptables.

En ninguna parte en el proceso, en caso de cualquier servidor de autenticación en nombre de el cliente. En dicho sistema, el único servidor que necesita conocer y validar las credenciales del cliente es el servidor de autenticación; ningún otro servidor necesita tener acceso a esta información. De esta forma, el cliente puede autenticarse para muchos servidores con solo un intercambio de autenticación, y las credenciales no se ponen en riesgo al almacenarse o acceder a varios servidores.

Parece que su implementación está funcionando como debería: la autenticación debería ocurrir en el lado del cliente de la aplicación, y esto es correcto y no supone un riesgo para la seguridad.

+0

Eso es cierto, el cliente obtiene un boleto del servidor Kerberos al ingresar las credenciales. Para iniciar sesión en un servicio, el cliente tiene que solicitar un nuevo ticket para ese servicio desde el servidor Kerberos, utilizando el ticket antiguo (lo que hace el comando kvno de MIT Kerberos). Para crear este nuevo ticket, el cliente obviamente necesita acceso al ticket antiguo, y en Windows, solo el API SSPI nativo tiene acceso a ese ticket antiguo, pero el GSSAPI de Java no lo usa y, por lo tanto, no tiene (siempre y cuando usted no habilite la clave de registro). Entonces, una solución sería una forma de usar la biblioteca SSPI en Java. – user269667

+1

Olvidé mencionar que el servicio obviamente tiene que validar el ticket que envió el cliente. Esto no es posible si el cliente no puede crear un ticket para enviar al servidor. Lo único que conseguimos hacer en este momento es leer el nombre de inicio de sesión de Windows en el cliente y enviarlo al servidor, pero, por supuesto, todos pueden forjar eso. – user269667

+0

@ user269667 descargo de responsabilidad No sé mucho sobre Kerberos, pero usted dice: "Entonces, una solución sería una forma de utilizar la biblioteca SSPI en Java". ¿Por qué no exploras más esto y creas un contenedor nativo (JNA/JNI) en la parte superior de la API de Windows que usa tu navegador? – eirirlar

1

Ha intentado establecer sun.security.jgss.native en Java 6? ¿No sería SSPI la interfaz "nativa" para Windows?

+2

Windows no era una plataforma compatible para esto. Abrí http://stackoverflow.com/questions/3467253/windows-support-of-native-gss-api-in-java-6 para ver si las cosas han cambiado. –

Cuestiones relacionadas