Implementacón de referencia de SSO en OpenSAML v3.2 - wiki - Seguridad
Wiki
Implementacón de referencia de SSO en OpenSAML v3.2
Motivación
Al ser una librería nueva, la documentación de la v3 de OpenSAML es escasa e incompleta. Cualquiera que trate de implementar SSO con esta librería se verá un incontable número de horas buscando ejemplos y documentación en foros, la mayoría de las veces encontrará ejemplos de la v2, remedio peor que la enfermedad al momento de intentar compatibilizarla con la versión actual.
¿Por qué no utilzar la versión vieja entonces?
Desde el 31 de julio de 2016, el ciclo de vida de OpenSAML 2 se vio finalizado, lo que significa que ya no recibe más actualizaciones, ni siquiera actualizaciones críticas de seguridad.
Lo que debes saber
OpenSAML es una librería de Java que ayuda a construir y transportar mensajes sobre el protocolo HTTP. Por esta razón, es importante que quien pretenda implementarla posea experiencia y conocimientos básicos en Java, aplicaciones web y protocolo HTTP. Algunas de las funciones que permite OpenSAML son:
- Crear mensajes SAML
- Parsear y exportar objetos SAML como XML
- Firmar y encriptar mensajes
- Codificación y transporte de mensjes
SAML es un framework XML para intercambio de información de seguridad y define los protocolos y formato de comunicación para hacerla de una manera segura. El esquema centralizado de autenticación de SAML define dos entidades que se comunican:
- Service Provider (SP): Es la aplicación web/servicio de negocio que actuará como cliente delegando la autenticación al IDP. O sea, es el sistema que se quiere integrar al mismo. Ej: portal de organismo o empresa.
- Identity Provider (IDP): Es el proveedor de identidades, es el actor del sistema de clave única al cual se le delega la autenticación.
Esquema centralizado significa que los SPs dependen de un IdP que les provea autenticación para todos sus usuarios. En cambio, un esquema descentraliado como OpenID, típicamente permite a varios IdPs identificar, dependiendo de la preferencia del usuario.
Configuraciones previas
Las configuraciones que veremos a continuación son pensadas para el sistema operativo Windows, fueron probadas en la versión 10 pero los pasos son muy similares en otras versiones. El entorno de desarrollo utilizado fue Netbeans 8.2 y JDK 1.7.
Instalar Maven
1-Descargar maven https://maven.apache.org/download.cgi
Para este ejemplo lo descomprimimos en la carpeta C:\dev\tools
2-Agregar carpeta \bin al path
Abre las propiedades (System Properties) pulsando Windows + R y escribes sysdm.cpl, luego en la solapa Avanzado (Advanced) ingresas a Variables de entorno (Environment Variables).
Agregar al Path la ruta donde está descomprimido maven.
En la misma ventana agrega una nueva variable MAVEN_HOME con la ruta.
Ya que tienes abierta la ventana, asegurate que tengas JAVA_HOME bien definido en tus variables de entorno apuntando a tu java.
3-Abre la consola y verifica mvn -v
Instalar Apache Tomcat
Esta maqueta utiliza Apache Tomcat 8.5.12 pero es compatible con cualquier versión mayor a la 7.
Agregar un servidor a NetBeans es muy simple:
Descarga la versión que más te guste de Tomcat de http://tomcat.apache.org/ y descomprime el zip.
En el menú de NetBeans: Tools -> Servers -> Add Server
Marca la ruta de la carpeta que descomprimiste, crea un usuario y contraseña y finalizar.
La maqueta funciona sobre https con un certificado autogenerado, próximamente habrá una guía en el centro de recursos para hacerlo. Mientras tanto hay guías muy útiles en internet.
Configurar localhost
Abre el Bloc de Notas como administrador y abrir el archivo en la siguiente dirección: C:\Windows\System32\drivers\etc\hosts
Al final del archivo agrega la línea:127.0.0.1 maquetasaml.gub.uy
Esto hará que la ruta "maquetasaml.gub.uy" te dedirija a 127.0.0.1, donde estará hosteado tu programa para este ejemplo.El proxy puede generar problemas en varios browsers, por lo que se recomienda desactivar el proxy en configuración avanzada.
La maqueta y los procesos que recorre
Puedes clonar el proyecto en http://goo.gl/CcUzjq
La maqueta es un Web Application con las siguientes clases:
Constantes
Las constantes que utilizaremos están alojadas en esta clase, las más relevantes que tienes que manejar si quieres implementar en otro sistema son:
- Entity ID del Service Provider : "https://maquetasaml.gub.uy"
- Entity ID del Identity Provider : "https://test-eid.portal.gub.uy/idp"
- SSO Service (es a donde se envía el request para autenticarse): "https://test-eid.portal.gub.uy/v1.1/idp/profile/SAML2/Redirect/SSO"
- Assertion Consumer Service (es a donde te redirige la página luego de autentificado) : "https://maquetasaml.gub.uy:8443/maqueta/acs"
SSO_FULL
Es un Servlet que se encarga de crear el Request, firmarlo, encapsularlo y redirigir al IdP
acs (Assertion Consumer Service)
Es un Servlet que recibe el Response del IdP, lo desencapsula, lee y verifica la firma.
slo
Es un Servlet que recibe el Logout Request, cierra la sesión y manda un Logout Response, o si el Logout sale desde la maqueta misma envía un Logout Request al IDP.
OpenSAMLUtils, SPCredentials, CredencialIDP
Son clases con herramientas para simplificar la creación de objetos SAML y las Credenciales para firmar y verificar firmas.
Por arreglar
La ruta especificada para el certificado Agesic-Coesys-Testing.cer en la clase CredencialIDP.java se dirige a la raíz, que para Windows es el disco C, para hacer funcionar el programa hay que copiar el certificado (viene en el respositorio de github) al disco C o agregar código para que se indique la ruta relativa y no la absoluta, la solución surgió de una consulta en el foro de este mismo centro de recursos, el link es el siguiente: https://goo.gl/XnDZQC