Spring Blog

Nos complace anunciar que el primer hito de la extensión Spring Security Kerberos ya está disponible para descargar. La versión también está disponible a través del repositorio Maven milestone en http://maven.springframework.org/milestone. Con la extensión Spring Security Kerberos, los usuarios se autentican en su aplicación web con solo abrir la URL. No es necesario introducir un nombre de usuario/contraseña ni instalar software adicional.

Antes de profundizar en Kerberos, me gustaría presentar Spring Security Extensions, un nuevo proyecto de extensión de muelles dedicado a proporcionar módulos de extensión para el proyecto de seguridad de muelles central. Actualmente tenemos dos extensiones desarrolladas allí: Una integración SAML2 y una integración Kerberos/SPNEGO. Cada módulo tendrá su propio ciclo de lanzamiento, para que las personas puedan beneficiarse de estas extensiones tan pronto como estén listas y no tengan que esperar a la próxima versión de seguridad de primavera. Si tiene alguna idea o incluso algún código para extensiones adicionales, ¡díganos!

Kerberos / SPNEGO

En el primer hito de este módulo le proporcionamos una solución Kerberos/SPNEGO lista para usar para aplicaciones web. Kerberos es un protocolo de autenticación de red estandarizado, que está diseñado para proporcionar una autenticación sólida para aplicaciones cliente/servidor, como las aplicaciones web donde el navegador es el cliente. También es la forma recomendada de autenticar usuarios en una red de Windows y reemplaza al obsoleto y relativamente inseguro NTLM. Además de esto, es ampliamente utilizado en entornos *NIX y hay implementaciones para todas las plataformas principales. Por lo tanto, es muy probable que ya tenga Kerberos en su lugar y ahora puede usar esto también en su propia aplicación web. Eso significa que el usuario simplemente ingresa la URL y se autentica automáticamente con su nombre de usuario de dominio, por ejemplo [email protected]. A continuación, puede encontrar este nombre de usuario a través de Spring Security o incluso con solicitud.getRemoteUser(). ¿Cómo funciona esto? He aquí un breve resumen:

El Navegador envía una solicitud GET a su aplicación web (1), que luego devuelve que se requiere autenticación de «negociación» (2). El Navegador le pedirá al servidor Kerberos que obtenga un llamado ticket de servicio (3). A continuación, el navegador envía este ticket de servicio, que prueba la identidad de la persona que llama, y algunas cosas adicionales a la aplicación web (5). Después de validar el ticket, basado en algún secreto compartido entre su aplicación web y el servidor Kerberos, recuperará el nombre de usuario.

Para que esto funcione, todas las aplicaciones web deben registrarse en el servidor Kerberos y obtener un prinicipal de servicio y un secreto compartido asignado. Para las aplicaciones web, el principal de servicio debe ser «HTTP / < nombre de dominio completo calificado> @DOMINIO». Por ejemplo «HTTP/[email protected]», si su aplicación se ejecuta en web.springsource.com A continuación, debe exportar las credenciales de este principal a un archivo keytab (secreto compartido) y ponerlo a disposición de su aplicación. Cada sistema basado en Kerberos funcionará de esta manera, pero la creación de este principal de servicio y el keytab es diferente entre los sistemas. Te mostraré cómo hacer esto con Microsoft Windows y MIT Kerberos, pero también debería funcionar con otras implementaciones.

Crear principal de servicio con Microsoft Windows 2008 Server

Aunque esto se refiere a Microsoft Windows 2008 Server, debería ser muy similar en 2003 e incluso en 2000 Server. En ActiveDirectory, solo tiene que crear un usuario de dominio normal y, a continuación, asignarle un director de servicio (SPN), y crear la pestaña de claves con una utilidad de línea de comandos. Y ahora paso a paso:

Crea un usuario normal que se convertirá en el principal del servicio. El nombre de usuario y la contraseña no tienen sentido para Kerberos, pero, por supuesto, debe elegir un nombre útil, como http-web.springsource.com. Solo asegúrese de desactivar la opción «El usuario debe cambiar la contraseña en el próximo inicio de sesión» y activar «La contraseña nunca caduca».

Después de eso, debe usar la herramienta de línea de comandos » ktpass.exe». Ya está incluido en Windows 2008 Server, en versiones anteriores debe instalarlo usted mismo. Solo asegúrese de que está utilizando una versión que coincida con la versión de su servidor y también la configuración regional debe coincidir. Esta herramienta asignará el nombre principal de servicio (SPN) a su usuario creado anteriormente y exportará la clave de usuario a un archivo keytab. Si su director de servicio es «HTTP/[email protected]» y tu usuario es http-web.springsource.com, entonces su comando ktpass debería tener este aspecto:


ktpass /out http-web.keytab /mapuser /princ HTTP/ /pass *

ktpass le pedirá una contraseña. Usted debe elegir algún seguro al azar para ello. Si ahora tiene un archivo http-web.keytab en su directorio, luego todo funcionó bien. Este archivo se necesita más adelante en la aplicación, ya que contiene el secreto compartido para validar los tickets de servicio.

Crear el principal de servicio con MIT Kerberos

En sistemas * NIX y también en Mac OS X, la implementación de MIT Kerberos se usa ampliamente. Con MIT Kerberos es aún más simple. Simplemente abra la consola kadmin y ejecute los siguientes comandos:


kadmin: addprinc -randkey HTTP/web.springsource.comkadmin: ktadd -k /http-web.keytab HTTP/web.springsource.com

A continuación, debe tener un archivo http-web.keytab bajo raíz. Este archivo se necesita más tarde en su aplicación, ya que contiene el secreto compartido para validar los tickets de servicio.

Configurar la seguridad de resorte

En primer lugar, los requisitos:

  • Seguridad de muelles 3.0.0 M2
  • SUN JRE/JDK 1.6.x
  • Entorno Kerberos
  • Navegador compatible con SPNEGO (Firefox, IE, Safari)

Para usar el módulo Kerberos en Spring Security, solo tiene que declarar un filtro, un punto de entrada de autenticación y un proveedor de autenticación. Incluimos una aplicación web de ejemplo que puede usar como punto de partida. Solo tiene que configurar el nombre principal de su servicio y colocar su llave de generación allí. La aplicación de ejemplo se incluye en la descarga mencionada anteriormente.

Si abre la seguridad.el archivo xml de la aplicación de ejemplo, que se encuentra en /src/main/webapp / WEB-INF, muestra una configuración de seguridad de resorte básica que utiliza el nuevo módulo Kerberos.

Los dos primeros beans (SpnegoEntryPoint y SpnegoAuthenticationProcessingFilter) son responsables del apretón de manos, y el KerberosServiceAuthenticationProvider finalmente valida el ticket de servicio. Actualmente solo soportamos la implementación de Kerberos / SPNEGO que está incluida en JRE/JDK de SUN. Como solo obtiene el nombre de usuario de Kerberos, también necesita un servicio UserDetailsService para obtener los roles y tal vez algunos otros atributos de usuario. En este ejemplo, solo usamos una implementación ficticia para facilitar las pruebas.

Como puede ver, ya completamos el nombre del prinicipal del servicio y la ubicación de keytab. Cambie estos valores según sus necesidades y asegúrese de que la ficha de claves generada previamente esté disponible en esta ubicación.

Ahora inicie su servidor e intente una autenticación SPNEGO. Debería ver su nombre de usuario de dominio completo en el navegador. En su código puede recuperar el nombre de usuario con las clases de seguridad de Primavera normales o incluso con la solicitud de llamada de servlet Java estándar.getRemoteUser(). Si no funciona (tal vez veas una página vacía), revisa estas cosas:

  • Compruebe el archivo de registro
  • Asegúrese de usar el nombre de dominio completo calificado (no la dirección IP y no el nombre corto) en su URL.
  • Si está utilizando Internet Explorer: Active «Autenticación integrada de Windows» y asegúrese de que el dominio (en nuestro caso web.springsource.com) aparece en la sección del sitio de intranet local de IE.
  • Si está utilizando Firefox: Eche un vistazo aquí.
  • Si está utilizando un cliente de Windows: El Cliente y el servidor deben estar en máquinas diferentes, porque de lo contrario Windows usará NTLM en lugar de Kerberos.
  • Compruebe si la hora está sincronizada en todas las máquinas involucradas.
  • Si está utilizando Microsoft AD, encontrará más ayuda aquí: http://msdn.microsoft.com/en-us/library/ms995329.aspx
    • Además de esto, configurar un entorno Kerberos adecuado puede ser complicado, y es importante hacerlo bien antes de comenzar a usar la extensión Spring Security Kerberos. La mayoría de los problemas que encontramos durante la consultoría son problemas con el entorno Kerberos y no con la aplicación en sí.

      Si no desea utilizar la extensión Spring Security Kerberos en su propio proyecto Maven, debe agregar el repositorio Spring Milestone a su pom.XML. Debería verse así.:

y, por supuesto, la dependencia:

Todavía hay trabajo por hacer, por ejemplo, para proporcionar Kerberos para clientes Java y no solo para el servidor, pero esperamos que pruebe esta versión de hito y proporcione algunos comentarios. El Foro de la Comunidad es el mejor lugar para hacer preguntas o iniciar discusiones sobre nuevas características. Alternativamente, si encuentras algo mal, puedes plantear un problema con Jira.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.