¿Cómo funciona SSO con Active Directory mediante el cual los usuarios inician sesión de forma transparente en una aplicación web de intranet?

40

Me dijeron que es posible hacer una aplicación web que no requiera un inicio de sesión. El usuario inicia sesión en Windows, que se autentica mediante una búsqueda de Active Directory (LDAP). Luego, deberían poder ir a mi aplicación web y nunca ver un mensaje de inicio de sesión. Estos clientes se han referido a esto como Single Sign On (quizás incorrectamente y como parte de mi confusión).

Pero, por lo que leí Single Sign On de los documentos de Tomcat es:

La válvula de inicio de sesión único se utiliza cuando desea dar a los usuarios la capacidad de iniciar sesión en cualquiera de las aplicaciones web asociadas con su host virtual , y luego que todas las demás aplicaciones web reconozcan su identidad en el mismo host virtual.

Esto está perfectamente claro para mí. El usuario tiene que iniciar sesión una vez y puede acceder a todas las aplicaciones web en una instancia de tomcat. Pero, lo que tengo que hacer es permitirles iniciar sesión sin proporcionar ninguna credencial a mi servidor Tomcat.

Entonces, para que esto funcione, me imagino:

  • El usuario solicita alguna página
  • El servidor no ve ningún token de sesión y luego solicita al cliente algunas credenciales.
  • El navegador del cliente sin ninguna intervención del usuario proporciona algunas credenciales al servidor.
  • Luego, utilizando esas credenciales proporcionadas por el navegador del cliente, realiza una búsqueda en un LDAP.

He visto algunos ejemplos que usan certificados del lado del cliente ... particularmente el sistema DoD PKI que tiene sentido para mí porque en esos casos configuras Tomcat para solicitar certificados del lado del cliente , pero solo iniciando sesión en Windows no veo cómo esto funcionaría y qué información pasaría el navegador al servidor, etc. ¿Para esto se utiliza NTLM?

blak3r
fuente

Respuestas:

40

En primer lugar, y en caso de que otros usuarios visiten esta página, solo hay ciertos métodos de autenticación que le permiten realizar SSO sin demoras. Estos son NTLM y Kerberos . LDAP, por otro lado, nunca le dará un SSO inmediato.

NTLM es en realidad NTLMv1 y NTLMv2. Estos son muy diferentes y NTLMv1 está en desuso debido a problemas de seguridad graves. Debe evitar las soluciones de autenticación de Java que no identifican correctamente si son compatibles con NTLMv1 o NTLMv2 porque solo usan la palabra "NTLM" en su documentación. Lo más probable es que los desarrolladores de dicha solución de seguridad no se conozcan a sí mismos, lo que es una razón más para buscar la salida de incendios.

Contrariamente a la creencia tradicional, tanto NTLMv1 como NTLMv2 están completamente documentadas por Microsoft, pero aún así encontrará soluciones que afirman que el protocolo ha sido "diseñado por ingeniería inversa". Es cierto que esto era necesario antes de que Microsoft documentara los protocolos que creo alrededor de 2006 o 2007. De todos modos, NTLMv1 es un no-no. No hay nada malo con NTLMv2 per-se pero Microsoft ha estado eliminando gradualmente NTLM (en cualquier forma) en todos sus productos a favor de la autenticación Kerberos. NTLMv1 está muerto hace mucho tiempo y NTLMv2 ahora solo lo usa Microsoft en los casos en que no hay un controlador de dominio disponible. En pocas palabras: NTLM (en cualquier forma) no es realmente el camino a seguir. En realidad, deberíamos saludar a Microsoft por adoptar un enfoque basado en estándares aquí.

Esto te deja con Kerberos. Microsoft ha creado un protocolo para negociar y transportar información de autenticación a través de HTTP. Esto se conoce en los productos de Microsoft como " Autenticación de Windows integrada ", pero se ha establecido como un estándar oficial bajo el nombre de SPNEGO . Esto es lo que deberías estar buscando. SPNEGO es compatible tanto con NTLMv2 como con Kerberos como mecanismo de autenticación subyacente, pero por las razones anteriores, debe apuntar a Kerberos en lugar de NTLMv2.

He integrado con éxito varias aplicaciones de Tomcat (que se ejecutan en Linux / Solaris) con Active Directory utilizando el Proyecto SPNEGO en SourceForge . He encontrado que este es el enfoque más simple. Esto le brinda un SSO rápido, similar a lo que hace, por ejemplo, un servidor Sharepoint. Es muy probable que esto sea lo que sus usuarios esperarán cuando hablen de 'SSO'. Obtener la configuración correcta de Kerberos, generar claves y configurar cuentas "ficticias" en Active Directory puede ser una molestia, pero una vez que lo hace bien, funciona de maravilla.

Lo único que no me gusta del Proyecto SPNEGO en SourceForge es que no entiendo con qué frecuencia realiza la autenticación. Mi sospecha desagradable es que lo hace para cada vista de página en lugar de una vez para cada sesión. Quizás estoy equivocado en esto. De todos modos: esto resalta otra cosa a tener en cuenta en las soluciones de SSO: no desea implementar una solución que "envíe" a su proveedor de identidad (por ejemplo, Active Directory) con solicitudes innecesarias.

unixhacker2010
fuente
2
Gracias, hizo de esta la respuesta aceptada. Una cosa para agregar a su lista de inicios de sesión rápidos son los inicios de sesión de certificados x509 ... Al igual que las tarjetas CAC del gobierno.
blak3r
¡Esta es una respuesta fantástica, incluso si tiene 6 años! ¡Votaría x10 si pudiera!
Tim S.
2

En un entorno de Windows Active Directory, el inicio de sesión único se utiliza para significar que visitar una página web interna conlleva sus permisos de inicio de sesión de Windows y el servidor web puede actuar sobre ellos. Es algo para lo que se usa NTLM, pero las implementaciones más nuevas usan Kerberos en su lugar.

Si abre un sitio web de Sharepoint Server, sabe quién es sin necesidad de un nombre de usuario y contraseña de inicio de sesión, pero esto funciona solo para sitios web internos en la misma red, no creo que tenga mucho sentido que funcione en un sitio web público. (No puedo decir si te refieres a "host virtual" como en un servidor virtual Apache o como en un servidor alojado externo).

Aquí hay un documento de Microsoft que describe cómo funciona la autenticación Kerberos para un servidor web que ejecuta IIS / ASP.Net: http://msdn.microsoft.com/en-us/library/ff647076.aspx

Parece posible hacerlo con Apache / Tomcat / Java. Aquí hay un PDF que describe la implementación de eso en la Universidad del Reino Unido: http://gfivo.ncl.ac.uk/documents/UsingKerberosticketsfortrueSingleSignOn.pdf y un proyecto de Codeplex para ello: http://tomcatspnego.codeplex.com/ y Openfire tienen algunos documentación relacionada con el trabajo general con Java / Kerberos aquí ( http://community.igniterealtime.org/docs/DOC-1060 ).

TessellatingHeckler
fuente
0

Parece que está describiendo a lo que Microsoft se refiere como autenticación integrada de Windows.

Parece que Tomcat es compatible con la autenticación de Windows, según este artículo .

Artomegus
fuente
-1

Para empezar, no puede evitar iniciar sesión. Si desea identificar a los usuarios, debe hacer que inicien sesión. Olvídese de NTLM, Kerberos viene al rescate: puede hacer todo de una manera completamente transparente.

SingleSignOnValve no es lo que estás buscando. Si utiliza Tomcat 7, se puede utilizar el SpnegoAuthenticator de inmediato, pero el 6 de usted tiene que utilizar este .

Michael-O
fuente
Poco confundido ... la primera y la segunda oración parecen contradecirse. Con Kerberos, ¿no se le solicita al usuario que inicie sesión?
blak3r
1
No, no lo hacen. Vea el panorama general, gracias a Kerberos, el usuario ingresa sus credenciales una vez de forma manual y luego cada inicio de sesión se realiza automáticamente en su nombre. Esto no significa que no se inicie sesión en absoluto en ese momento. Esto es lo que escribiste.