Formato pdf

Anuncio
Curso para operadores de Proveedores
de Identidad
1.0
Sixto Martin y Lorenzo Gil
June 18, 2012
ÍNDICE GENERAL
1. Introducción
1.1. Qué es una federación de identidades . . . . . . . .
1.2. Ventajas de la federación de identidades . . . . . . .
1.3. Ejemplos de federaciones . . . . . . . . . . . . . .
1.4. Conceptos (IdP, SP, AA, WAYF, atributos, bindings)
1.5. Protocolos (SAML PAPI, OpenId) . . . . . . . . . .
1.6. Autenticación y autorización (AuthN & AuthZ) . . .
.
.
.
.
.
.
2
2
3
3
5
7
9
2. Posibles arquitecturas de las federaciones de identidad
2.1. Modelos de interconexión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
11
3. Descripción de la arquitectura desplegada en Confía
3.1. Entorno en Confía . . . . . . . . . . . . . . . . . . .
3.2. Arquitectura de Confía . . . . . . . . . . . . . . . . .
3.3. Entornos y servicios comunes desplegados en el CICA
3.4. Workflow de alta de IdP o Servicio (SP) . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14
14
14
15
15
4. Gestión de los metadatos
4.1. Modelos de gestión de metadatos . . . . . . . . .
4.2. Los metadatos en simpleSAMLphp . . . . . . . .
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
4.4. PEER . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
17
17
18
20
32
5. Gestión de los datos del usuario
5.1. La importancia del conjunto común de atributos
5.2. LoAs . . . . . . . . . . . . . . . . . . . . . . .
5.3. Políticas de liberación de atributos (ARPs) . . .
5.4. Validación y consolidación de atributos en el IdP
5.5. Consentimiento informado . . . . . . . . . . . .
5.6. Configuración del consentimiento informado . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
33
33
33
34
34
36
37
6. Protocolo de resolución de incidencias en un entorno de federación de identidades
6.1. Errores más frecuentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6.2. Protocolo de gestión de errores actual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
41
41
7. Desplegar un IdP con SimpleSAMLphp
7.1. Recursos de ayuda . . . . . . . . . .
7.2. Instalación y configuración . . . . . .
7.3. Backends de autenticación . . . . . .
7.4. Repaso de filtros en simpleSAMLphp
43
43
43
50
51
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
I
7.5.
Alta disponibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
8. El IdP como SP
8.1. Caso base: IdP y SP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2. Hub & Spoke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3. IdP como SP en federación Hub & Spoke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
60
60
61
9. Referencias
9.1. Protocolos . . . . . . . . . . . .
9.2. Iniciativas de federación . . . . .
9.3. Federaciones de identidad . . . .
9.4. Especificación SAML . . . . . .
9.5. Implementaciones de SAML . . .
9.6. Hub&Spoke . . . . . . . . . . .
9.7. WAYF embebido . . . . . . . . .
9.8. Consentimiento informado . . . .
9.9. Gestión centralizada de metadatos
9.10. Otros conceptos avanzados . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
64
64
64
64
65
65
65
65
66
66
66
10. Anexo A. Despliegue de entorno Hub&Spoke
10.1. Funcionamiento . . . . . . . . . . . . . . . . . . . . . . .
10.2. Implementación basada en simpleSAMLphp. “nodo bridge”
10.3. Migración del modelo de estrella al modelo Hub&Spoke. .
10.4. Tareas de mantenimiento. . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
67
67
68
76
76
11. Anexo B. assertion.encryption, redirect.sign y redirect.validate
11.1. assertion.encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11.2. redirect.sign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11.3. redirect.validate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
77
77
78
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
II
Curso para operadores de Proveedores de Identidad, 1.0
Esta documentación pertenece al curso para operadores de Proveedores de Identidad que se celebra en Sevilla el 12 de
Junio y en Granada el 14 de Junio de 2012.
ÍNDICE GENERAL
1
CAPÍTULO
ONE
INTRODUCCIÓN
1.1 Qué es una federación de identidades
Una federación de identidades es un grupo o conjunto de entidades que comparten la técnología, estandares y casos
de uso que permiten transmitir información de identidad de un usuario de manera segura facilitando la autenticación y
autorización entre diferentes dominios.
En una federación de identidades se establece un círculo de confianza que permite que un usuario autenticado en un
organismo de la federación acceda a recursos de otro organismo de la misma federación. La idetificación se realiza en
los Proveedores de Identidad (abrev. ingl. IdP). El Proveedor de Servicio (abrev. ingl. SP) al que accede el usuario
confía en los datos del usuario que le son suministrados por el IdP y en función de los mismos autoriza al usuario a
hacer uso de los recursos.
En una federación de identidades los servicios perciben al usuario como una entidad homogenea y no como un conjunto
de porciones de información sin relación entre ellas. Se denomina identificador opaco al identificador único que
mantiene la privacidad del usuario y que representa la asociación entre la cuenta del usuario en un Proveedor de
Servicio y la que posee en el Proveedor de Identidad.
Figura 1.1: Esquema federación
Es tarea del operador de la federación de identidades:
Decidir y gestionar la integración de los miembros (tanto proveedores de identidad como de servicio) a la
federación.
2
Curso para operadores de Proveedores de Identidad, 1.0
Gestionar las políticas de liberación de atributos (ARPs) y velar porque estás se cumplan.
Definir los esquemas de datos que van a utilizar los diferentes miembros con el fin de homogeneizar atributos.
Actuar como intermediario e incluso poder gestionar el consentimiento de cesión de datos para servicio que
accede el usuario.
Velar por el correcto funcionamiento de la federación.
Gestionar la interoperabilidad con otras federaciones formando confederaciones de identidades.
1.2 Ventajas de la federación de identidades
Ventajas para los usuarios:
Identidad única para todos los servicios federados: Una única clave que le da acceso a todos los servicios.
Single Sign ON (SSO) Web. Una vez identificado el usuario en un sistema federado tendrá acceso al resto de
servicios hasta que se finalice la sesión (log out) sin tener que volver a introducir sus credenciales de acceso.
Single Log Out (SLO). Al cerrar sesión de una aplicación se cerrará la sesión de todas las aplicaciones
federadas, mejorando así la seguridad del sistema.
Fiable, fácil y rápido. Al usuario se le presentá un único sistema de autenticación que conoce.
Ventajas para administradores de sistemas:
Facilita los procedimientos. Se despliega un escenario controlado en el que los accesos están
monitorizados y todos el procesos controlados.
Menor número de incidencias:
Al existir una clave única los administradores dejan de atender a incidencias relacionadas con
pérdidas y reseteos de claves.
Los datos de los usuarios pasan a estar en un punto común verificados y actualizados por lo que se
reducen las duplicidades de cuentas y los conflictos.
Mayor control de los datos del usuario. Mediante la definición de ARPs (Attribute Release
Policies) adecuadas el administrador puede decidir, dentro del conjunto de datos que posee de cada
usuario, cuáles enviar a un servicio concreto.
Ventajas para las organizaciones:
Ahorro en costes. Se ha demostrado que su uso reduce considerablemente sus costes de mantenimiento.
Mayor interoperabilidad / productividad. Fácil integración con multitud de sistemas heterogéneos. la
tecnología SAML2 se erige como el futuro de los sistemas de federación de identidades. Un ejemplo son los
exitodos sistemas de acceso unificado de Facebook o Google, que permiten acceder a todos sus servicios bajo
el protocolo SAML2.
Reducción de riesgos de seguridad. Las comunicaciones que envían información del usuario siempre van
cifradas incluso cuando se accede por protocolos no seguros como HTTP. La contraseña del usuario nunca
viaja entre los distintos nodos de la federación. Se utiliza tecnología PKI para todo este proceso de cifrado de
comunicaciones.
1.3 Ejemplos de federaciones
En la actualidad podemos identificar muchas federaciones de identidad basadas en la tecnología SAML:
1.2. Ventajas de la federación de identidades
3
Curso para operadores de Proveedores de Identidad, 1.0
Europeas:
Españolas:
En Andalucía existe Confía que es una federación de identidades de las universidades andaluzas.
En España tenemos el Servicio de dentidad de SIR operado por REDIRIS
En Dinamarca tienen la federación de identidades WAYF operado por el WAYF-secretariat.
En Reino Unido tienen la JANET(UK) operada por JISC y EDINA
En Finlandia tienen HAKA operada por
En Holanda tienen la SURFfederatie operada por SURFnet
En Norugega tienen FEIDE operada por Uninett
En la República Checa tienen SWITCHaai operada por SWITCH
Existe una confederación de los paises nórdicos denominada Kalmar Union
Existe una federación para la educación superior y la investigación europea llamada Edugate
También a nivel europeo destacamos el proyecto STORK que trata de proveer una plataforma de interoperabilidad de identidades.
No europeas:
En Australia tienen la AFF
1.3. Ejemplos de federaciones
4
Curso para operadores de Proveedores de Identidad, 1.0
En USA tienen la InCommon Federation
En Brasil tienen la federación CAFe
En Canada tienen la federación CAF-CANARIE
En China tienen federación CARSI
En Japón tienen la federación GakuNin
Se puede consultar más información sobre federaciones en una wiki de Terena.
1.4 Conceptos (IdP, SP, AA, WAYF, atributos, bindings)
IdP Proveedor de Identidad. Organización que provee la autenticación del usuario y devuelve los datos del usuario
que el SP requiere para autorizar su acceso al recurso o servicio.
SP Proveedor de Servicio. Cualquier organismo o institución registrado en la federación que provee acceso al usuario
final a algún servicio y recurso basandose en una serie de atributos que satisfacen sus requerimientos de autorización.
WAYF Cuando un SP está conectado a varios proveedores de identidad surge la necesidad de que el usuario seleccione
en que entidad se desea identificar. A este proceso de identificar tu proveedor de identidad se le conoce como WAYF,
que viene de las siglas Where Are You From.
AA Autoridad de atributos. Sistema que responde consultas sobre atributos.
1.4. Conceptos (IdP, SP, AA, WAYF, atributos, bindings)
5
Curso para operadores de Proveedores de Identidad, 1.0
Gestor de metadatos Elemento encargado de gestionar los diferentes metadatos de las entidades que componen la
federación (IdPs y SPs). Dichos metadatos deberán de estar actualizados periódicamente. Además opcionalmente
puede validar los metadatos, clasificarlos, validar los certificados de los metadatos o gestionar las ARPs.
Scoping Indica al IdP el ambito de la petición. De que SP surgió y con que contexto.
Binding Mapeo de una petición SAML o de una aserción de respuesta con un protocolo específico de transporte.
(HTTP-Redirect, HTTP-POST, Artifact o SOAP)
Descubrimiento En terminos de federación se hace referencia al descubrimiento como la acción de obtener la lista de
proveedores de identidad.
Metadatos Conjunto de datos que conforman la información necesaria para que una entidad se comunique con otra
entidad de la federación. En el protocolo SAML distinguimos los metadatos de los IdPs y de los SPs.
Entity ID Dentro de los metadatos de una entidad se define el entity id como el identificador que unívocamente al SP
o IdP. La última tendencia es la de utilizar como entity id la url en la que se publican los metadatos de dicha entidad.
ARP Política de liberación de atributos. Política que rige la distribución de los atributos del usuario a los diferentes
SPs.
Atributo Parte sencilla de los datos de un usuario (como por ejemplo el nombre, apellido, email, etc). Pueden ser
generales o personales. Uno o la agrupación de varios atributos identifican univocamente al usuario.
Esquema de atributos Compendio de nombres de atributos estandarizado. Surge de la necesidad de definir un vocablo
común que defina un nombre para los diferentes atributos que forman parte de la información del usuario que van a
transferirse entre los elementos de la federación de identidades.
Identificador opaco Identificador persistente que puede ser usado para conectar cuentas de usuario conservando la
privacidad.
Consentimiento En términos de federación se hace referencia al consentimiento como a la acción en la que el usuario
acepta que los atributos que posee un IdP se transfieran a un SP (cumpliendo la ARP y de forma segura).
SAML Es el lenguaje de marcado para las aserciones de seguridad. Un estandar definido y mantenido por OASIS.
Está basado en XML y diseñado para el intercambio de información sensible de forma segura.
XML Encryption Un estandar W3C para cifrar un documento XML. Es usado en SAML para cifrar la Aserción
SAML con el fin de dificultar que una entidad o individuo que no pertenezca a la federación pueda obtener los datos
del usuario.
XML Signature Un estandar W3C para firmar un documento XML. Es usado en SAML para autenticar al organismo
que firmo el documento permitiendo establecer una relación de confianza.
Profile Reglas que definen como integrar las aserciones SAML y como extraerlas de otros protocolos para poder
habilitar el SSO y el SLO. Define también el flujo de peticiones y respuestas SAML que se efectuan en un determinado
caso de uso.
SSO Single Sign On. Procedimiento de autenticación que habilita al usuario para acceder a varios sistemas con una
sola instancia de identificación. En una federación de identidades el SSO habilita al usuario a acceder a cada uno de
los SP (previa autorización en el mismo) una vez se haya identificado en un IdP.
SLO Single Log Out. Procedimiento por el cual el usuario deja de estar identificado en el conjunto de
aplicaciones/elementos en los que estuviera logado.
Puede ampliar su glosario de terminos con el siguiente documento.
1.4. Conceptos (IdP, SP, AA, WAYF, atributos, bindings)
6
Curso para operadores de Proveedores de Identidad, 1.0
1.5 Protocolos (SAML PAPI, OpenId)
1.5.1 SAML
Security Assertion Markup Language. Está basado en XML y es un estandar abierto para el intercambio de información
de autorización y autenticación entre dominios de forma segura. Fue creado por la empresa OASIS
Básicamente define como debe de hacerse de forma segura la tránsmisión de los diferentes tipos de aserciones SAML
entre IdPs y SPs utilizando un binding definido.
Para saber mas del protocolo SAML puede consultar el siguiente tutorial
1.5.2 PAPI
PAPI es un sistema de SSO desarrollado por RedIRIS desde el año 2001. Permite desplegar una infraestructura de
autenticación y autorización y un sistema de Single Sign-On fácilmente.
Los componentes principales del sistema son: El servidor de autenticación (AS) y los puntos de acceso (PoA).
Un PoA se encarga de interceptar los accesos a recursos o servicios forzando la auntenticación del usuario en un
AS (cada PoA puede estar conectado a uno o varios AS),La autenticación se produce contra alguno de los backends
configurados en el AS (Ldap, BD, etc) y tras producirse se genera una aserción que se transmite al POA, y que contiene
datos del usuario autenticado.
Existe un elemento especial que se denomina GPoA que se conecta con varios PoAs y a un AS, que se comporta como
si fuera un AS para sus PoAs, estableciendo una relación de confianza con ellos y suya a su vez con el AS.
1.5. Protocolos (SAML PAPI, OpenId)
7
Curso para operadores de Proveedores de Identidad, 1.0
Si el PoA no puede integrarse con la aplicación a federar (diferente tecnologia, diferente entorno) se hace uso de un
elemento conocido como Proxy PAPI.
El funcionamiento de PAPI es bastante similar al Browser Post Profile de Liberty/SAML 2.0: la aserción es transmitida
mediante el método POST de HTTP desde un proveedor de autenticación hasta los proveedores de servicio, solo que
dicha aserción no es SAML (ni siquiera XML).
Puede obtener más información sobre el protocolo en la wiki del proyecto PAPI
1.5.3 OpenID
OpenID es un sistema de identificación digital descentralizado, con el que un usuario puede identificarse en una
aplicación web a través de una URL (o un XRI en la versión actual) y ser verificado por cualquier servidor que soporte
el protocolo.
En los aplicaciones web que soportan OpenID, los usuarios no requieren tener una cuenta de acceso. En su lugar, solo
necesitan disponer de un identificador creado en un servidor que verifique OpenID, llamado proveedor de identidad o
IdP.
1.5. Protocolos (SAML PAPI, OpenId)
8
Curso para operadores de Proveedores de Identidad, 1.0
1.6 Autenticación y autorización (AuthN & AuthZ)
Es importante diferenciar estos 2 conceptos.
La autenticación es el proceso de verificar la identidad de una persona mientras que la autorización es el proceso
de verificación de que una persona conocida tiene la autoridad para realizar una cierta operación o acceder a un
servicio/recurso .
Generalmente el acceso de un usuario sigue el siguiente procedimiento:
1. El usuario solicita acceso a un sistema.
2. El sistema solicita al usuario que se autentique.
3. El usuario aporta las credenciales que le identifican y permiten verificar la autenticidad de la identificación.
(autenticación)
1.6. Autenticación y autorización (AuthN & AuthZ)
9
Curso para operadores de Proveedores de Identidad, 1.0
4. El sistema valida según sus reglas si las credenciales aportadas son suficientes para dar acceso al usuario o
no. (autorización)
En un sistema federado:
La autenticación se realiza en el IdP.
La autorización se realiza en el SP o en la propia aplicación
1.6. Autenticación y autorización (AuthN & AuthZ)
10
CAPÍTULO
TWO
POSIBLES ARQUITECTURAS DE LAS
FEDERACIONES DE IDENTIDAD
2.1 Modelos de interconexión
Existen varios modelos atendiendo a como se conectan cada uno de los elementos que forman una federación de
identidades. Cada módelo tiene sus ventajas y desventajas por lo que dependiendo del entorno y contexto optaremos
por uno u otro modelo.
2.1.1 Modelo centralizado
Figura 2.1: Arquitectura centralizada
Los SP se conectan a un único nodo IdP cuyas fuentes de autenticación (auth backends) son Ldaps, BDs, etc de
diferentes instituciones.
11
Curso para operadores de Proveedores de Identidad, 1.0
Si el IdP tiene soporte los SP podrían comunicarse en los diferentes protocolos de autenticación actualmente
existentes: SAML2, sHibboleth, OpenId, PAPI
Los proveedores de identidad delegarían la petición del consentimiento en el único nodo posible: el IdP central.
Cada SP está directamente conectado con el IdP (no habría descubrimiento de IdP) siendo necesario especificar
de alguna forma contra que backend de autenticación actuar.
El SP podría pasarle un parámetro al IdP o ser el IdP directamente el que decidiera a donde ir dependiendo de
donde le llegue la petición, del username del usuario, etc.
2.1.2 Modelo distribuido
Figura 2.2: Arquitectura distribuida
Cada SP está conectado con cada IdP.
Cada IdP tiene que soportar los diferentes protocolos con los que se comuniquen los SPs.
El consentimiento se realizaría en cada uno de los IdPs.
El descubrimiento se realizaría en el SP.
2.1.3 Modelo Hub & Spoke
Cada SP está conectado con un nodo central que a su vez está conectado a cada IdP.
Puede que un SP y un IdP que no tengan protocolos compatibles de comunicación puedan comunicarse haciendo
uso del nodo central que hará de puente (bridging) y traduzca las aserciones de un protocolo a otro.
Los IdPs delegarían la petición del consentimiento en el nodo central (aunque también puede haber un doble
consentimiento y requerirse el consentimiento tanto en el IdP como en el nodo central).
El descubrimiento se realizaría en el nodo central. (Aunque existen federaciones con esta arquitectura que
realizan un wayf embebido en la aplicación federada).
Ventajas del modelo Hub & Spoke
2.1. Modelos de interconexión
12
Curso para operadores de Proveedores de Identidad, 1.0
Figura 2.3: Arquitectura Hub & Spoke
Desacople de los diferentes elementos, desacople tecnológico (al poder coexistir diferentes protocolos siempre
que el nodo central sea compatible con los mismos y actue de bridge). Mejora escalabilidad.
Poder tener centralizados los servicios de la federación: consentimiento, descubrimiento (wayf), filtros
de atributos, validación de atributos, monitorización, estadísticas. Reduciendo costes y facilitando el
mantenimiento.
Posibilidad de inter-federación. Conectando el nodo central con otro nodo central de otra federación
conseguimos que los nodos de ambas federaciones queden conectados.
2.1. Modelos de interconexión
13
CAPÍTULO
THREE
DESCRIPCIÓN DE LA ARQUITECTURA
DESPLEGADA EN CONFÍA
3.1 Entorno en Confía
Existen 3 entornos replicados en Confía:
Producción. Es el entorno oficial, el que utilizan los usuarios finales.
Pre-producción. Es utilizado como entorno de pruebas. Antes de pasar cualquier IdP o SP a producción debe
de validarse dicho elemento en este entorno.
Laboratorio. Es utilizado para desarrollar nuevos plugins y para probar nuevos servicios.
3.2 Arquitectura de Confía
La federación Confía está desplegada con una arquitectura Hub & Spoke.
Figura 3.1: Entorno Confía
14
Curso para operadores de Proveedores de Identidad, 1.0
En Confía es obligatorio que de cada IdP y de cada SP se ofrezcan 2 instancias: La instancia oficial y la instancia
de pruebas sobre la que se harán nuevos desarrollos o se validaran nuevas versiones del software.
3.3 Entornos y servicios comunes desplegados en el CICA
Actualmente en el CICA se tienen desplegado lo siguiente:
Figura 3.2: Entornos y servicios desplegados en el CICA
3.4 Workflow de alta de IdP o Servicio (SP)
El proceso de incorporar un nuevo IdP o un nuevo SP en la infraestructura del Confía es la siguiente:
1. Lo primero será realizar los “tramites burocráticos” para que se acepte la incorporación del servicio: Aceptación
por parte de la AUPA-TIC, ofrecer información del servicio al Comité, visto bueno técnico por parte del Comité.
2. Se desarrollará el IdP o el Servicio (SP) conectándolo con el entorno de laboratorio.
3. Una vez desarrollado el IdP o el Servicio y una vez pasados los “trámites burocráticos” se pasará al entorno de
pre-producción en el que el operador de la infraestructura validará que todo está en orden
3.3. Entornos y servicios comunes desplegados en el CICA
15
Curso para operadores de Proveedores de Identidad, 1.0
4. Se Conectará el IdP o el Servicio con el entorno de producción. Y se conectará una instancia no oficial con
el entorno de laboratorio para seguir mejorando el servicio o para cuando haya que hacer pruebas con nuevas
versiones de software.
Por tanto:
En el entorno de producción únicamente habrá instancias de IdPs y SPS oficiales.
En el entorno de pre-producción habrá instancias de IdPs y SPs oficiales, e instancias que van a ser validadas
como oficiales.
En el entorno de laboratorio deberá de haber instancias de pruebas de los IdPs y SPs.
A efectos prácticos dar de alta en un determinado entorno no es más que registrar el correspondiente metadato de la
entidad en el gestor de metadatos de dicho entorno.
3.4. Workflow de alta de IdP o Servicio (SP)
16
CAPÍTULO
FOUR
GESTIÓN DE LOS METADATOS
La gestión de los metadatos constituye una tarea esencial para el funcionamiento de las federaciones de identidades
basadas en el protocolo SAML. Es imprescindible proporcionar metadatos confiables, disponibles y precisos a los
participantes de la federación: la descripción de las entidades, sus responsables y sobre todo las url donde ofrecen las
funcionalidades y las claves públicas.
Dentro de los metadatos se incluyen 2 atributos opcionales que hay que tener muy en cuenta a la hora de realizar la
gestión de los metadatos:
validUntil: Indica en tiempo absoluto cuando caducan los metadatos
cacheDuration: Indica el máximo periodo de tiempo en el que las entidades deberían de confiar en esos
metadatos y albergarlos en su “cache” (en simpleSAMLphp la cache está basada en ficheros de sistema que
se alojan dentro de la carpeta metadata).
También es importante ver como se llegó al consenso para que los entityIDs de las entidades coincidieran con las urls
donde se alojan sus metadatos, lo cual facilita el trabajo de la gestión de los metadatos.
4.1 Modelos de gestión de metadatos
4.1.1 Modelo de agregación
La arquitectura de agregación permite actualizar los metadatos en el lado de la entidad que los va a consumir y debido
al simple modelo de confianza, los metadatos serán considerados válidos siempre que estos sean descargados de una
fuente fiable (URL pre-acordada y los metadatos convenientemente firmados con una clave pública del publicador)
4.1.2 Modelo distribuido
En la arquitectura distribuida cada entidad es responsable de la gestión y publicación de sus propios metadatos. Con
este modelo los metadatos de un determinado punto pueden ser obtenidos bajo demanda sin la necesidad de la descarga
periódica de una colección de gran tamaño de metadatos. (Se realiza el descubrimiento dinámico de metadatos en
función de las necesidades). Es un modelo que puede acarrear problemas ya que se relaja el concepto de “confianza”.
4.1.3 Modelo centralizado utilizado en Confía
Es una arquitectura que viene muy bien en federaciones Hub & Spoke, en el nodo bridge o en un nuevo nodo, se
despliega un sistema que será responsable de almacenar, monitorizar y verificar los metadatos de las entidades de una
federación.
17
Curso para operadores de Proveedores de Identidad, 1.0
Los metadatos de la federación son agregados periódicamente, almacenados y publicados como un archivo XML
convenientemente firmado.
El sistema deberá de disponer de mecanismos para poder delegar las responsabilidades de gestión de un determinado
metadato al administrador de la entidad a la que describe.
4.2 Los metadatos en simpleSAMLphp
4.2.1 Configurar los directorios que albergan los metadatos en simpleSAMLphp
En el fichero config/config se especifica con el parámetro ‘metadata.sources’ donde simpleSAMLphp va a buscar los
ficheros que contienen las fuentes de los diferentes metadatos.
Si queremos que además de en el directorio metadata/ (directorio en el que siempre por defecto se buscan los
metadatos) se busquen metadatos dentro del directorio example1:
’metadata.sources’ => array(
// Habilita los metadatos que se encuentren en los archivos del directorio metadata
array(’type’ => ’flatfile’),
// Habilita los metadatos que se encuentren en los archivos del directorio metadata/example1
array(’type’ => ’flatfile’, ’directory’ => ’metadata/example1’),
),
Además es posible configurar el tipo de fichero en el que simpleSAMLphp espera leer los metadatos. Las alternativas
son flatfile (formato propio de ssp) o xml.
4.2.2 Metarefresh
Para conectar un proveedor de identidad (IdP) o un proveedor de servicio (SP) a una federación, es necesario especificar
los metadatos de las fuentes en las que se confía. En muchas federaciones es normal configurar una distribución
automatizada de los metadatos utilizando el formato de metadatos XML SAML 2.0. Generalmente una administración
o autoridad central proporciona una URL con un documento SAML 2.0 que incluye los metadatos de todas las
entidades de la federación.
Mediante el módulo metarefresh de simpleSAMLphp es posible obtener los metadatos remotos de una URL y
almacenarlos en un archivo.
Instalación y configuración del módulo metarefresh
El módulo metarefresh existe en la instalación básica de simpleSAMLphp por lo que únicamente tendremos que
habilitarlo:
# touch <ruta hasta simplesamlphp>/simplesamlphp/modules/metarefresh/enable
Puesto que el módulo utiliza wget para realizar las descargas de los metadatos deberemos tener este software instalado
en la máquina:
# yum install wget
El módulo tiene un archivo de configuración propio que debemos alojar en el directorio config
del simpleSAMLphp. El fichero config-metarefresh.php (podemos encontrar una plantilla en
simplesamlphp/modules/metarefresh/config-templates/config-metarefresh.php).
El contenido del fichero sería el siguiente:
4.2. Los metadatos en simpleSAMLphp
18
Curso para operadores de Proveedores de Identidad, 1.0
<?php
$config = array(
’sets’ => array(
// Pueden habilitarse varios conjuntos
’confia’ => array(
// El cron se ejecutará cada hora descargandose metadatos.
’cron’
=> array(’hourly’),
/* Pueden habilitarse varios fuentes, por ejemplo se podría
tener los metadatos de los IdPs y de los SPs por separado. */
’sources’
=> array(
array(
’src’ => ’URL_DE_LA_FUENTE_DE_METADATOS’,
),
),
// Tiempo en el que expiraran los metadatos descargados.
’expireAfter’
=> 60*60*24*4,
/* Directorio en el que se crearan los ficheros saml20-idp-remote.php
y saml20-sp-remote.php */
’outputDir’
=> ’metadata/federation/’,
// Formato en que se encuentran los metadatos
’outputFormat’ => ’flatfile’,
),
),
);
Donde URL_DE_LA_FUENTE_DE_METADATOS es la URL de la fuente de metadatos SAML 2.0 en XML. En el
array cron hay que especificar alguna de las perioricidades que defina el módulo de cron (en este caso ‘hourly’). Esto
se explica más abajo.
A continuación hay que crear el directorio donde se guardarán los metadatos descargados, tal y como se especifica en
el atributo outputDir del fichero anterior:
# mkdir simplesamlphp/metadata/federation
Es muy importante que este directorio tenga permisos de escritura para el usuario con el que se ejecuta el servidor web
(y por tanto, el intérprete de PHP). En el caso de máquinas con RedHat? o Centos este usuario se llama apache, en el
caso de máquinas basadas en Debian, el usuario es www-data.:
# chown -R apache:apache <ruta-al-simplesamlphp>/simplesamlphp/metadata/federation
Para que metarefresh funcione correctamente, es necesario configurar el módulo sanitycheck para lo cual simplemente
copiamos a la carpeta config de simpleSAMLphp la plantilla config-sanitycheck.php y configuramos los
cron_tag que queramos.
Habilitar y configurar módulo cron y el crontab
Es necesario activar también el módulo cron:
# touch <ruta hasta simplesamlphp>/modules/cron/enable
Y crear el fichero de configuración config/module_cron.php:
<?php
/*
* Configuration for the Cron module.
*
* $Id: $
4.2. Los metadatos en simpleSAMLphp
19
Curso para operadores de Proveedores de Identidad, 1.0
*/
$config = array (
’key’ => ’secret’,
’allowed_tags’ => array(’daily’, ’hourly’, ’frequent’),
’debug_message’ => TRUE,
’sendemail’ => TRUE,
);
?>
Alternativamente, se puede desactivar el envío de correos, que puede llegar a ser intensivo, poniendo ‘sendemail’ =>
FALSE,. En el array ‘allowed_tags’ hay que definir frecuencias a las que se puedan enganchar los distintos módulos.
En nuestro caso, metarefresh lo hace con ‘hourly’.
Estas tags no son más que cadenas arbitrarias. Quien decide con qué frecuencia se ejecuta cada tag es el propio cron,
bien con scripts en los directorios /etc/cron.[hourly|daily|weekly...] o en ficheros crontab en /etc/cron.d. Para que se
descarguen periódicamente los metadatos, hay que colocar un fichero crontab en /etc/cron.d con una línea para cada
tag definida. En nuestro caso, necesitamos una línea que se ejecute diariamente, otra cada hora y otra “frecuentemente”
(cada minuto, por ejemplo):
0 0 * * * root wget --quiet -O /dev/null --no-check-certificate
"https://HOST_SSP/simplesaml/module.php/cron/cron.php?key=secret&tag=daily"
0 * * * * root wget --quiet -O /dev/null --no-check-certificate
"https://HOST_SSP/simplesaml/module.php/cron/cron.php?key=secret&tag=hourly"
* * * * * root wget --quiet -O /dev/null --no-check-certificate
"https://HOST_SSP/simplesaml/module.php/cron/cron.php?key=secret&tag=frequent"
Donde HOST_SSP es el dominio de la máquina en la que está funcionando nuestro simpleSAMLphp.
Por último es necesario copiar el fichero config-sanitycheck.php de modules/sanitycheck/config-templates/ a config/.
Crear directorio que albergará los metadatos
Por último, es necesario configurar simpleSAMLphp para que, además de utilizar los ficheros de metadatos generales
(los ficheros de metadata/), utilice también los que Metarefresh dejará en el directorio metadata/federation/. Para ello
hay que editar el fichero config/config.php, concretamente la opción metadata.sources, para añadirle nuestra nueva
fuente de metadatos:
’metadata.sources’ => array(
array(’type’ => ’flatfile’),
array(’type’ => ’flatfile’, ’directory’ => ’metadata/federation’),
),
Es posible consultar más documentación del módulo metarefresh.
4.3 Gestor de metadatos en simpleSAMLphp - JANUS
En simpleSAMLphp existe un módulo llamado Janus que permite: * Gestionar los metadatos de IdPs y SPs (Posee
diferentes niveles de permisos para los usuarios) * Publicar subconjuntos de los metadatos registrados. * Gestionar
ARPs para los SPs, (el estandar SAML permite definir ARPs e incluirlas dentro de los metadatos de un SP).
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
20
Curso para operadores de Proveedores de Identidad, 1.0
4.3.1 Instalación
JANUS no es más que un módulo de simpleSAMLphp. En una federación de identidades Hub & Spoke podemos
desplegar el gestor de metadatos dentro de la instancia del “nodo bridge” o en una instancia nueva. (Explicamos como
se desplegaría en una nueva instancia.
Al servicio Janus lo protegeremos con una fuente de autenticación local en la que habilitemos los diferentes
administradores que van a gestionar los metadatos. Lo ideal sería que el Janus estuviese protegido de forma federada,
pero se puede dar el caso de que un administrador no pudiera acceder al servicio Janus a través de su Proveedor de
Identidad precisamente porque los metadatos del mismo son los que necesitan ser actualizados.
Lo primero que debemos hacer es obtener el código del software Janus el cual obtendremos ejecutando:
# svn co http://janus-ssp.googlecode.com/svn/tags/v.1.11.0 janus
Una vez realizado esto copiamos el directorio janus dentro del directorio modules y lo activamos:
# touch /var/www/janus/simplesamlphp/modules/janus/enable
En Janus, los diferentes metadatos van a ser almacenados en una base de datos por tanto deberemos tener acceso a un
sistema de base de datos.
Configuración de Apache
Se debe crear un fichero de configuración para el VirtualHost de janus.example.com.conf en el directorio
/etc/httpd/conf.d/ con el siguiente contenido:
<VirtualHost *:80>
ServerName janus.example.com
DocumentRoot /var/www/janus/simplesamlphp/www
SSLProxyEngine On
ProxyPreserveHost On
Alias /simplesaml /var/www/janus/simplesamlphp/www
<Location />
ProxyPass https://localhost
</Location>
</VirtualHost>
<VirtualHost *:443>
ServerName janus.example.com
DocumentRoot /var/www/janus/simplesamlphp/www
Alias /simplesaml /var/www/janus/simplesamlphp/www
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/janus.example.com/crt/janus.example.com.crt
SSLCertificateKeyFile /etc/httpd/ssl/janus.example.com/key/janus.example.com.key
</VirtualHost>
Además es necesario crear los certificados (autogenerados) que se han especificado en la configuracion del VirtualHost
para https. Se deberán seguir las siguientes instrucciones:
1. Crear el directorio donde alojar los certificados, en este caso, /etc/httpd/ssl/janus.example.com/:
# mkdir -p /etc/httpd/ssl/janus.example.com/crt /etc/httpd/ssl/janus.example.com/key
2. Cambiar el directorio actual por /etc/httpd/ssl/janus.example.com/:
# cd /etc/httpd/ssl/janus.example.com/
3. Creación de la clave sin contraseña y con una encriptación 1024:
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
21
Curso para operadores de Proveedores de Identidad, 1.0
# openssl genrsa -out key/janus.example.com.key 1024
4. Generar el fichero CSR (solicitud de certificado):
# openssl req -new -key key/janus.example.com.key -out janus.example.com.csr
5. Generar el certificado autofirmado:
# openssl x509 -req -days 1825 -in janus.example.com.csr -signkey key/janus.example.com.key
-out crt/janus.example.com.crt
Por último, es necesario reiniciar el servicio httpd para que la nueva configuración sea aplicada:
# service httpd restart
Certificado (janus.example.com.crt) y clave (janus.example.com.key) deberemos también de tenerlos accesibles en la
carpeta cert del simpleSAMLphp para que sean usados en el firmado y cifrado de aserciones. Para ello lo mejor es
crear enlaces simbólicos:
# ln -s /etc/httpd/ssl/janus.example.com/key/janus.example.com.key
/var/www/janus/simplesamlphp/cert/janus.example.com.key
# ln -s /etc/httpd/ssl/janus.example.com/crt/janus.example.com.crt
/var/www/janus/simplesamlphp/cert/janus.example.com.crt
Creación de la base de datos y configuración
Una vez reiniciado el servidor apache podremos acceder a un script que posee Janus para crear la base de datos y las
tablas pertinentes. Dicho script se ejecuta accediendo por navegador a la URL:
https://janus.example.com/simplesaml/module.php/janus/install/
Una vez que lo hayamos ejecutado y se hayan creado las tablas oportunas deberemos de borrar el archivo install por
motivos de seguridad:
# rm
-rf /var/www/janus/simplesamlphp/modules/janus/install
A continuación copiaremos la plantilla de configuración de janus del janus/config-templates/module_janus.php al
directorio de configuración de simplesamlphp config/ :
# cp /var/www/janus/simplesamlphp/modules/janus/config-templates/module_janus.php
/var/www/janus/simplesamlphp/config/module_janus.php
Y editaremos el archivo convenientemente con la configuración que más nos interese. A continuación vamos a ir
detallando los diferentes parámetros y el valor que recomendamos darles.
Configuración de datos del administrador:
// Nombre del administrador de Janus
’admin.name’ => ’JANUS admin’,
// Email del administrador de Janus, aparecerá como contacto de la aplicación,
’admin.email’ => ’janusadmin@example.org’,
Configuración de la base de datos Janus:
’store’ => array(
// Configuración de conexión con la base de datos.
’dsn’
=> ’mysql:host=localhost;dbname=janus_db’,
’username’ => ’janus’,
// Usuario de la base de datos
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
22
Curso para operadores de Proveedores de Identidad, 1.0
’password’
’prefix’
=> ’’,
=> ’janus__’,
// Password para acceder a la base de datos
// Prefijo utilizado en las tablas, si lo hubiera
),
Configuración de cron:
/* Habilita un cron que se ejecutará y refrescará los metadatos de cada una de
las entidades */
’metadata_refresh_cron_tags’ => array(’janus’),
/* Hay otras 2 tareas que son importantes ejecutar periodicamente que se
habilitan con estos 2 parámetros, básicamente validan que los certificados
y los metadatos sean correctos, en caso contrario se puede activar el
sendMail para que se envien correos al administrador */
’validate_entity_certificate_cron_tags’ => array(’daily’),
’validate_entity_endpoints_cron_tags’
=> array(’daily’),
/* Si habilitamos la validación de certificados es necesario indicar la ruta
donde se encuentren las CAs */
’ca_bundle_file’ => ’/etc/pki/tls/certs/ca-bundle.crt’,
Configuración de acceso al Janus:
/* Crearemos en el authsources una fuente de autenticación del tipo exampleauth con
la lista de usuarios de janus */
’auth’ => ’janus-users’,
/* Este atributo del usuario es el que va a ser comparado con el identificador
de usuarios de la base de datos de Janus para relacionar el usuario */
’useridattr’ => ’uid’,
/* Con el valor a TRUE permite que el Janus cree al usuario en la base de datos si
se ha autenticado correctamente */
’user.autocreate’ => false,
Configuración visual de Janus:
// Permite paginar la pestaña INBOX de Janus
’dashboard.inbox.paginate_by’ => 20,
/* Metadato de la entidad que será utilizado en la vista de conexión para la identificación
visual de la entidad. Se puede usar el ’entityid’ o el ’name’ (este ultimo, si es
suficientemente representativo y existe en todas las entidades) */
’entity.prettyname’ => ’entityid’,
Configuración de uso:
// Lo habitual en una federación con nodos simpleSAMLphp es habilitar IdPs y SPs del tipo SAML 2.0
’enable.saml20-sp’ =>
true,
’enable.saml20-idp’ => true,
’enable.shib13-sp’ =>
false,
’enable.shib13-idp’ => false,
// Indica el estado al que se va a asociar a una entidad cuando se registre.
’workflowstate.default’ => ’testaccepted’,
Configuración del sistema Janus:
El conjunto de estados que puede tener una entidad se va a definir en la array ‘workflowstates’
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
23
Curso para operadores de Proveedores de Identidad, 1.0
El conjunto de metadatos posibles que van a tener las entidades se definen en las variables
‘metadatafields.saml20-idp’, ‘metadatafields.saml20-sp’, ‘metadatafields.shib13-idp’ y ‘metadatafields.shib13sp’
El conjunto de permisos sobre acciones de Janus se define en la array ‘access’
Los cambios posibles de estado de las entidades se definen en la array ‘workflow_states’
El conjunto de tipos de usuarios se define en la array ‘usertypes’
Configuración de ARPs:
/* Cuando asociamos una ARP a un SP, se añadiran a los metadatos una serie de etiquetas
RequestedAttribute. En simpleSAMLphp, en el caso de que esté definido un filtro
attributelimit y una ARP para un SP, se tomarán esos atributos definidos en el ARP
para filtrar los atributos que se liberan desde el IdP */
/* Permite configurar una lista con los atributos que conformarán la ARP
que se asociará a los SPs que no tengan una ARP asociada. Si no queremos
establecer ninguna ARP debemos de dejar la array vacia. */
’entity.defaultarp’ => array(
’eduPersonTargetdID’,
),
// Conjunto de atributos que van a estar disponibles para crear las ARPs
’attributes’ => array(
’uid’ => array(
’name’ => ’uid’
),
’common name (cn)’ => array(
’name’ => ’cn’
),
’surname’ => array(
’name’ => ’sn’,
),
’gn’ => array(
’name’ => ’gn’,
),
’displayName’ => array(
’name’ => ’displayName’,
),
’eduPersonPrincipalName’ => array(
’name’ => ’eduPersonPrincipalName’,
),
’mail’ => array(
’name’ => ’mail’,
),
’irisMailMainAddress’ => array(
’name’ => ’irisMailMainAddress’,
),
’eduPersonAffiliation’ => array(
’name’ => ’eduPersonAffiliation’,
),
’eduPersonPrimaryAffiliation’ => array(
’name’ => ’eduPersonPrimaryAffiliation’,
),
’eduPersonScopedAffiliation’ => array(
’name’ => ’eduPersonScopedAffiliation’,
),
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
24
Curso para operadores de Proveedores de Identidad, 1.0
’preferredLanguage’ => array(
’name’ => ’preferredLanguage’,
),
’eduPersonEntitlement’ => array(
’name’ => ’eduPersonEntitlement’,
),
’eduPersonTargetedID’ => array(
’name’ => ’eduPersonTargetedID’,
),
),
Configuración de la exportación de metadatos:
// Este atributo define el formato posible para las publicaciones de metadatos
’mdexport.allowed_mime’ => array(
1 => ’application/xml’,
2 => ’application/samlmetadata+xml’,
3 => ’application/simplesamlphp+text’, // SSP flat file format
),
/* Este atributo define un conjunto de opciones por defecto con el que se publicarán
los metadatos de las entidades */
’mdexport.default_options’ => array(
’entitiesDescriptorName’ => ’Federation’,
// Nombre del set de entidades
’mime’ => ’application/xml’,
// Formato de salida
’maxCache’
=> 60*60*24,
// 24 horas de límite de cache
’maxDuration’ => 60*60*24*5, // 5 días de para que caduquen los metadatos de la entidad
/* Si queremos que los metadatos se firmen, de ser así posteriormente podrán ser
comprobados en el modulo metarefreh */
’sign.enable’ => FALSE,
// Datos del certificado con el que se firmará la publicación, en caso de que se habilite
’sign.privatekey’ => ’janus.example.com.key’,
’sign.privatekey_pass’ => NULL,
’sign.certificate’ => ’janus.example.com.crt’,
),
Configuración de los feeds de publicaciones:
’mdexport.feeds’ => array(
// Este feed publica bajo firma
’sp-prod’ => array(
’types’
=>
’states’
=>
’mime’
=>
’exclude’
=>
’postprocessor’
=>
’entitiesDescriptorName’ =>
’filename’
=>
’maxCache’
=>
’maxDuration’
=>
’sign.enable’
=>
’sign.privatekey’
=>
’sign.privatekey_pass’
=>
’sign.certificate’
=>
),
todas los proveedores de servicio del tipo SAML 2.0
array(’saml20-sp’),
array(’prodaccepted’),
’application/samlmetadata+xml’,
array(),
NULL,
’SPs del SINED’,
’sp_sined.xml’,
60*60*48, // 24 hour cache time
60*60*24*7, // Maximum 5 days duration on ValidUntil.
TRUE,
’janus.example.com.key’,
’’,
’janus.example.com.crt’,
// Este feed publica bajo firma todas los proveedores de identidad del tipo SAML 2.0
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
25
Curso para operadores de Proveedores de Identidad, 1.0
’idp-prod’ => array(
’types’
’states’
’mime’
’exclude’
’postprocessor’
’entitiesDescriptorName’
’filename’
’maxCache’
’maxDuration’
’sign.enable’
’sign.privatekey’
’sign.privatekey_pass’
’sign.certificate’
),
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
=>
array(’saml20-idp’),
array(’prodaccepted’),
’application/samlmetadata+xml’,
array(),
NULL,
’IdPs del SINED’,
’idp_sined.xml’,
60*60*48, // 24 hour cache time
60*60*24*7, // Maximum 5 days duration on ValidUntil.
TRUE,
’janus.example.com.key’,
’’,
’janus.example.com.crt’,
/* Este feed publica bajo firma todas los proveedores de identidad y de servicio del tipo
SAML 2.0 (salvo los del nodo bridge) */
’idpsp-prod’ => array(
’types’
=> array(’saml20-idp’,’saml20-sp’),
’states’
=> array(’prodaccepted’),
’mime’
=> ’application/samlmetadata+xml’,
’exclude’
=> array(
’https://wayf.example.com/simplesaml/saml2/idp/metadata.php’,
’https://wayf.example.com/simplesaml/module.php/saml/sp/metadata.php/saml’
),
’postprocessor’
=> NULL,
’entitiesDescriptorName’ => ’IDPs & SPs del SINED’,
’filename’
=> ’idpsp_sined.xml’,
’maxCache’
=> 60*60*48, // 24 hour cache time
’maxDuration’
=> 60*60*24*7, // Maximum 5 days duration on ValidUntil.
’sign.enable’
=> TRUE,
’sign.privatekey’
=> ’janus.example.com.key’,
’sign.privatekey_pass’
=> ’’,
’sign.certificate’
=> ’janus.example.com.crt’,
),
),
Otros parametros:
’entity.useblacklist’ => true,
’entity.usewhitelist’ => false,
/* Permite habilitar listas blancas o negras a que IdPs se les
ESTA o NO ESTA permitido conectar con un SP */
Existe una wiki en la web de Janus donde viene más información sobre documentación de cada uno de estos atributos.
Importante. El cron que vamos a asociar al Janus para que automáticamente actualice los metadatos de
las entidades haciendo uso de la URL donde dichos metadatos están publicados por la entidad (atributo
‘metadata_refresh_cron_tags’ del archivo de configuración Janus) debe de estár dado de alta como tag válido en el
module_cron.php. Además tenemos que crear una entrada en el servicio de cron para que se ejecute con la periocidad
que deseemos.
4.3.2 Funcionamiento
A continuación se describen las principales vistas del software Janus. También puede consultar una serie de videos en
la web de Janus para entender su funcionamiento.
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
26
Curso para operadores de Proveedores de Identidad, 1.0
Panel de administración de usuarios
Desde esta vista podremos crear, editar o eliminar usuarios. Cada usuario tendrá asociado un tipo y será identificado
por el ID de usuario. Una funcionalidad a destacar es que Janus permite tener usuarios inactivos, siempre será mejor
esta opción que la de borrarlo en el caso de que tengamos dudas sobre la cuenta.
Panel de administración de entidades
Desde esta vista podremos crear, deshabilitar o eliminar entidades, así como visualizar y editar los permisos de los
usuarios sobre las entidades. Si un usuario tiene permiso sobre una entidad, le aparecerá en su vista de listado de
entidades.
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
27
Curso para operadores de Proveedores de Identidad, 1.0
Listado de entidades
En esta vista veremos un listado de las entidades que el usuario administra. Podremos ver el estado de cada una de las
entidades (se usan diferentes colores para cada estado y para saber si está habilitado o no. Estos colores se definen en
el archivo de configuración de Janus).
Además en esta vista podremos dar de crear nuevas entidades especificando el tipo de la entidad (IdP / SP) y el entityID
de la misma.
Exportador de entidades
En esta vista podremos exportar los metadatos de las entidades probando diferentes configuraciones. En esta vista
podremos simular posibles “feeds de entidades” que luego podremos configurar en el archivo de configuración de
janus, en el atributo ‘mdexport.feeds’
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
28
Curso para operadores de Proveedores de Identidad, 1.0
Edición de ARPs
En esta vista podremos administrar las diferentes ARPs de Janus. Por cada ARP se le asigna un nombre, una
descripción y el conjunto de atributos que la componen. Además se puede establecer una determinada ARP para
que sea la ARP por defecto que se asocie a una entidad. Si una entidad no tiene ARP, Janus le asociará la ARP que
tenga configurada en el atributo ‘entity.defaultarp’ (Si no queremos que se asocie ARP dejaremos este atributo vacio
y no definiremos ARP en la entidad.
Si seleccionamos una determinada ARP, además de editarla se nos mostrará el conjunto de entidades que la están
utilizando en ese momento.
Panel de administración de una entidad
En esta vista se nos presenta información relacionada con la entidad:
Connection ID. Que es el entityID de la entidad
Metadata URL. Que es la dirección en la que se encuentran disponibles los metadatos de la entidad, y que es
la URL que es utilizada para que JANUS actualice automáticamente sus metadatos
ARP. Define la ARP asociada a la entidad
Revision note. Indica algún comentario asociado a la actual reversión de datos de la entidad
Parent revision. Indica cual es la revisión que precede a la actual.
State. Estado actual en el que se encuentra la entidad. El Workflow por el que pasan las entidades viene definido
en el archivo de configuración de Janus
Type. Tipo de entidad.
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
29
Curso para operadores de Proveedores de Identidad, 1.0
Desde esta vista podemos acceder a diferentes vistas:
Metadata. Vista de edición de los metadatos
Import metadata. Vista de importación de los metadatos
History. Vista del historico. Desde esta vista podremos volver a una revisión anterior de los datos de la entidad.
Validate. VIsta de validación. Desde esta vista podremos validar los metadatos de la entidad. Hay que tener en
cuenta que si los certificados son autofirmados siempre se devolvera un error en la vista de validación.
Export. Vista de exportación de metadatos
Importador de metadatos de una entidad
Desde esta vista podremos importar los metadatos de una entidad. Se permiten varias formas:
Importar metadatos publicados en una URL.
Importar metadatos copiando su XML.
Importar metadatos copiando su JSON.
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
30
Curso para operadores de Proveedores de Identidad, 1.0
Editor de metadatos de una entidad
Desde esta vista podremos editar los metadatos de una entidad.
4.3. Gestor de metadatos en simpleSAMLphp - JANUS
31
Curso para operadores de Proveedores de Identidad, 1.0
Vista de metadatos de una entidad
Desde esta vista podremos comprobar los metadatos que se están publicando de una determinada entidad. Se muestran
varios formatos: XML, “flatfile”
4.4 PEER
PEER es un proyecto para desarrollar un directorio de metadatos de los diferentes Proveedores de Identidad y
Proveedores de Servicio existentes en la actualidad. Los administradores de cada entidad pueden darla de alta en
el sistema trás la verificación de que ese administrador controla dicha entidad. Este directorio es capaz de publicar
colecciones de metadatos por lo que puede ser utilizado como servicio fuente fiable de metadatos.
4.4. PEER
32
CAPÍTULO
FIVE
GESTIÓN DE LOS DATOS DEL
USUARIO
5.1 La importancia del conjunto común de atributos
En un sistema federado, debido a la probable hetereogeneidad de los elementos que lo componen (IdPs y SPs), es
importante definir un conjunto común de los nombres de atributos que van a viajar por el. Siempre que se pueda se
deben de utilizar esquemas estandarizados de atributos: schac, eduPerson, eduOrg, etc
Puede darse el caso de que los nombres de atributos que el IdP recoja de la fuente de autenticación (BD, Ldap, etc) no
coincidan con los nombres utilizados en la federación. Esto se soluciona implementando filtros de mapeo de atributos
en el IdP que renombraran los atributos. Puede ocurrir que si tenemos un IdP conectado a 2 federaciones tengamos
que aplicar 2 filtros de mapeo de atributos diferentes según a que federación iran a parar los datos.
De la misma forma pueden llegar a un SP una serie de nombres de atributos y ser necesario que se tengan que renombrar
a los nombres de atributos que entiende el servicio al que el SP protege.
Cuando se trata de unir federaciones para formar una confederación es habitual interponer un elemento intermedio
que realizará el mapeo de atributos en ambos sentidos en el caso de que sea necesario.
Las federación de identidad deben de tener publicada la lista de atributos que utiliza para que los IdPs/SPs que quieran
adherirse a ella implementen los filtros necesarios. Por ejemplo estos son los atributos de la federación WAYF y estos
los atributos de la federación Confía.
Es importante que cada IdP conectado a un sistema federado devuelva un conjunto de atributos que satisfaga la ARP
de los diferentes SP. De lo contrario podría darse el caso de que un usuario aún estando identificado en la federación no
tuviera acceso a un recurso/servicio por no proporcionar al SP/aplicación el suficiente conjunto de atributos para poder
ejecutar su lógica de autorización/negocio. En el caso de que esto se permita es importante que al menos se avise al
usuario de lo que sucede, para facilitar la traceabilidad del problema. Generalmente las federaciones de indentidades
disponen de mecanismos para validar los atributos y comprobar que estos cumplen las diferentes ARP con datos
válidos.
5.2 LoAs
LoA (Level of Assurance). Es el nivel de garantía (confiabilidad) que le asignamos a un determinado proveedor de
identidad en un contexto determinado.
En una federación podemos definir por un lado diferentes LoAs para cada uno de los proveedores de identidad, y por
otro lado definir los niveles mínimos que requiere cada proveedor de servicio.
33
Curso para operadores de Proveedores de Identidad, 1.0
Existe una demo implementada como módulo de simpleSAMLphp que desarrolla este concepto. También está
disponible documentación del proyecto y el código del mismo. Tras ser presentado tuvo buena aceptación, JISC emitió
este informe final
La definición de LoAs y del Account Linking (permitir enlazar cuentas de bajo LoA a cuentas de mayor LoA) es aún
un campo muy interesante que aún está en investigación.
5.3 Políticas de liberación de atributos (ARPs)
Es una política que rige la liberación de los atributos del usuario desde los proveedores de identidad hacia los diferentes
proveedores de servicio.
Ya hemos visto que desde el gestor de metadatos Janus, era posible definir ARPs y asociarlas a los SPs. Ese conjunto
de atributos se definen dentro de los metadatos enmarcados con la etiqueta RequestedAttribute.
En simpleSAMLphp, en el caso de que esté definido el filtro attributeLimit y una ARP en los metadatos del SP, se
tomarán estos atributos como limitadores para ese determinado servicio.
5.4 Validación y consolidación de atributos en el IdP
Es bueno que cada Proveedor de Identidad aplique filtros para validar los datos que va a ofrecer a una federación o
a un proveedor de servicio en concreto. Siempre se ha de comprobar que al menos los atributos obligatorios que se
envían son válidos.
Una buena práctica a realizar por los administradores de los sistemas de gestión de identidad consistiría en ejecutar un
script que fuera recorriendo el arbol ldap y los registros de las bases de datos buscando entradas de usuarios que no
cumplieran los requisitos de la federación de identidad. (Detección temprana)
En simpleSAMLphp podemos utilizar el filtro ValidationFilter implementado en el módulo externo AttributeValidator.
Este filtro comprueba la presencia y el valor de los atributos devueltos por el IdP y los clasifica en requeridos,
recomendados, opcionales o desconocidos dependiendo de la configuración del filtro. El conjunto de atributos devuelto
por el IdP es considerado válido si todos los atributos requeridos están presentes en el esquema y son válidos.
(Detección al vuelo)
5.4.1 Instalación y configuración
Para usarlo lo descargamos en la carpeta modules
cd /var/www/idp/simplesamlphp/modules/
svn co https://forja.rediris.es/svn/confia/attributevalidator/trunk/ attributevalidator
y lo habilitamos
touch /var/www/idp/simplesamlphp/modules/attributevalidator/enable
Ejemplo de fichero de configuración (config-attributevalidator.php), se puede copiar una plantilla de la
carpeta config-template:
<?php
$config = array (
’auth’ => ’saml’,
’required_attrs’ => array (
’givenName’, ’cn’, ’sn’, ’schacSn1’, ’schacSn2’, ’displayName’,
5.3. Políticas de liberación de atributos (ARPs)
34
Curso para operadores de Proveedores de Identidad, 1.0
’irisMailMainAddress’, ’eduPersonScopedAffiliation’,
’eduPersonAffiliation’, ’eduPersonPrimaryAffiliation’,
’eduPersonPrincipalName’, ’eduPersonOrgDN’,
’schacPersonalUniqueID’,
),
’recommended_attrs’ => array (
’irisMailAlternateAddress’, ’mail’, ’schacUserPresenceID’,
’irisClassifCode’, ’schacUserStatus’,
’eduPersonEntitlement’, ’irisUserEntitlement’,
’schacUserPrivateAttribute’, ’schacPersonalUniqueCode’,
),
’optional_attrs’ => array (
’schacMotherTonge’, ’schacGender’, ’chacDateOfBirth’,
’schacPlaceOfBirth’, ’schacCountryOfCitizenship’,
’jpegPhoto’, ’eduPersonNickname’, ’schacPersonalTitle’,
’title’, ’preferredLanguage’, ’schacYearOfBirth’,
’postalAddress’, ’homePostalAddress’, ’street’, ’l’,
’postalCode’, ’mobile’, ’homePhone’, ’telephoneNumber’,
’fax’, ’schacCountryOfResidence’, ’eduPersonAssurance’,
’userCertificate’, ’userSMIMECertificate’,
’irisPublicKey’, ’uid’, ’o’, ’ou’, ’labeledURI’,
’description’, ’seeAlso’,
),
’generated_attrs’ => array(
’eduPersonTargetedID’, ’schacHomeOrganization’,
’schacHomeOrganizationType’,
),
’format_validation_regex’ => array(
’irisMailMainAddress’ =>
’/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i’,
’eduPersonScopedAffiliation’ =>
’/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i’,
’schacPersonalUniqueID’ =>
’/urn:mace:terena.org:schac:personalUniqueID:es:(.+):(.+)/’,
’schacUserStatus’ =>
’/urn:mace:terena.org:schac:userStatus:es:(.+):([0-9]{8}):(.+):(.+):(.+)/’,
’irisMailAlternateAddress’ =>
’/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i’,
’mail’ =>
’/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i’,
),
),
);
Ejemplo de filtro en el IdP (metadata/saml20-idp-source.php):
...
/* Este filtro impide que el usuario continúe con el proceso de autenticación si sus datos no
pasan el filtro. */
’authproc’ =>
array(
....
80 => array(
’class’ => ’attributevalidator:ValidationFilter’,
’check’ => array(’required_attrs’),
),
....
),
5.4. Validación y consolidación de atributos en el IdP
35
Curso para operadores de Proveedores de Identidad, 1.0
Es posible leer más documentación del filtro AttributeValidator
5.4.2 Funcionalidad de comprobación visual
Además del filtro, el módulo attributevalidator ofrece una vista a la que se accede desde el enlace “Módulo de
validación de atributos” de la pestaña de federación donde el usuario puede autenticarse y comprobar si los datos
que el Proveedor de Identidad ofrece de él són válidos.
Figura 5.1: Pantalla de validación de atributos
Esta implementación de validación es bastante génerica y sencilla, podrían construirse filtros más complejos que
por ejemplo fueran recorriendo los diferentes Proveedores de Servicio conectados, fueran leyendo los atributos que
requieren y se fuera indicando en cada caso si los atributos del ofrecidos por el IdP cumplen con las exigencias de cada
uno de ellos.
5.5 Consentimiento informado
El consentimiento informado consiste en delegar en el usuario la aprobación de que ciertos datos suyos sean
transferidos desde el Proveedor de Identidad hasta el Proveedor de Servicio. En caso de que el usuario rechazara
dicha aprobación, los datos del usuario no viajarían al Proveedor de Servicio por lo que seguramente se le impediría
el acceso al servicio o se le daría una funcionalidad limitada del mismo.
Es muy importante defininir una buena política de ARPs (Attribute Release Policy) para que a cada aplicación se le
envíen los datos mínimos que necesita del usuario.
En una federación de modelo Hub & Spoke, lo normal es que cada Proveedor de Identidad, delegue la responsabilidad
del consentimiento informado en el nodo central. Así se tendrá un único punto en el que se registren los
consentimientos de los usuarios.
5.5. Consentimiento informado
36
Curso para operadores de Proveedores de Identidad, 1.0
Figura 5.2: Pantalla de consentimiento informado
5.6 Configuración del consentimiento informado
En simpleSAMLphp La funcionalidad del consentimiento informado se obtiene añadiendo un filtro consent:Consent .
Una cosa importante a tener en cuenta es que el filtro necesita que definamos un atributo como clave primaria
a la que asociar el consentimiento, que será el que tengamos configurado en el parámetro ‘userid.attribute’ del
metadata/saml20-idp-hosted.php. Si no se ha especificado ninguno tomará por defecto el ‘eduPersonPrincipalname’. De no existir ese atributo en los datos de usuario el filtro dará una excepción.
Dicho filtro se encuentra en el módulo consent que debemos habilitar:
# touch /var/www/idp/simplesamlphp/modules/consent/enable
Puesto que en nuestro IdP de pruebas no todos los usuarios tienen definido el ‘eduPersonPrincipalname’, haremos uso
del ‘uid’ como clave primaria, por lo que añadiremos en el metadata/saml20-idp-hosted.php
’userid.attribute’ => ’uid’,
Tendremos la posibilidad de que el sistema “recuerde” que el usuario ha aceptado dar consentimiento a una
determinada transferencia de datos hacia un determinado Proveedor de Servicio para que no vuelva a presentarse
la petición del consentimiento. Existen 2 alternativas a la hora de almacenar dicho consentimiento:
Consentimiento informado almacenado en Cookies.
Consentimiento informado almacenado en base de datos.
Consentimiento informado básico que no se almacena
5.6. Configuración del consentimiento informado
37
Curso para operadores de Proveedores de Identidad, 1.0
El consentimiento no se almacena nunca. El sistema interrogará al usuario cada vez que se vaya a transferir sus datos
a un proveedor de servicio.
Para configurarlo añadiremos el filtro en el IdP para que sea lo último que se ejecute. Para ello añadimos el filtro en la
array ‘authproc’ del metadata/saml20-idp-hosted.php
’authproc’ => array(
...
90 => array(
’class’
=> ’consent:Consent’,
),
...
),
Consentimiento informado guardado en Cookies
El consentimiento se almacena en la cookie del navegador.
Características:
Es muy facil eliminar el consentimiento borrando la Cookie del navegador. Su nombre será de la forma:
“sspmod_consent:<identificador>”
Si cambiamos de PC tendrémos que volver a dar
Para configurarlo añadiremos el filtro en el IdP para que sea lo último que se ejecute. Para ello añadimos el filtro en la
array ‘authproc’ del metadata/saml20-idp-hosted.php
’authproc’ => array(
...
90 => array(
’class’
=> ’consent:Consent’,
’store’
=> ’consent:Cookie’,
’focus’
=> ’yes’, /* Para poner el foco en "Si" o en el "No". Los posibles valores son
"yes" y "no" */
’checked’
=> TRUE,
/* Para que por defecto la casilla de "Recordar consentimiento" esté
o no habilitada */
’ìncludeValues’ => FALSE, /* Sirve para que en caso de que los atributos cambien se
invalide el anterior consentimiento y se vuelva a pedir.
Por defecto False */
’hiddenAttributes’ array() /* Es una array con un conjunto de valores que serán enviados al
Proveedor de Servicio pero que no serán mostrados al usuario,
generalemente se ocultan valores de control o que necesita la
propia federación. */
),
...
),
Consentimiento informado guardado en Base de datos
Requiere una base de datos para funcionar.
Para permitir que un usuario pueda borrar su consentimiento deberemos habilitar el módulo consentAdmin. El
acceso a dicho módulo se realiza en la pestaña de configuración en el enlace “Administración de consentimiento”
Si cambiamos de PC no se nos requerirá consentimiento, ya que se encuentra almacenado en una base de datos
en el servidor
La Base de datos debe tener una tabla con la siguiente estructura:
CREATE TABLE consent (
consent_date TIMESTAMP NOT NULL,
usage_date TIMESTAMP NOT NULL,
5.6. Configuración del consentimiento informado
38
Curso para operadores de Proveedores de Identidad, 1.0
hashed_user_id VARCHAR(80) NOT NULL,
service_id VARCHAR(255) NOT NULL,
attribute VARCHAR(80) NOT NULL,
UNIQUE (hashed_user_id, service_id)
);
Para configurar el filtro añadiremos el filtro en el IdP para que sea lo último que se ejecute. Para ello añadimos el filtro
en la array ‘authproc’ del metadata/saml20-idp-hosted.php
’authproc’ => array(
...
90 => array(
’class’
=> ’consent:Consent’,
’store’
=> array(
’consent:Database’,
’dsn’ => ’mysql:host=localhost;dbname=consent’,
’username’ => ’consentuser’,
’password’ => ’consentpass’,
),
’focus’
=> ’yes’,
’checked’
=> TRUE
’hiddenAttributes’ => array (’groups’),
),
...
),
Para permitir que el usuario pueda borrar el consentimiento que se guarda en base de datos hemos dicho que hace falta
habilitar el módulo consentAdmin:
# touch /var/www/idp/simplesamlphp/modules/consentAdmin/enable
y lo configuramos siguiendo la plantilla que existe en config-template/module_consentAdmin.php:
$config = array(
/*
* Hace falta configurar la base de datos, copiamos la info del filtro de consentimiento
*/
’consentadmin’ => array(
’consent:Database’,
’dsn’ => ’mysql:host=localhost;dbname=consent’,
’username’ => ’consentuser’,
’password’ => ’consentpass’,
),
// Indicar si hemos habilitado el parámetro ’includeValues’ en el filtro o no.
’attributes.hash’ => FALSE,
// Indicar donde queremos redirigir al usuario si sale del sistema.
’returnURL’ => ’https://idp.example.com/simplesaml/module.php/core/frontpage_welcome.php’,
/* Indicar si queremos añadir la descripción de los servicios en la vista que se le presenta
al usuario para gestionar sus permisos (Por defecto está a ’true’) */
’showDesription’ => true,
/* Establecer la fuente que tengamos definida en el authsources en la que se encuentre
el filtro de consentimiento. (Se requerirá al usuario que se autentique para acceder
al panel de administración de consentimiento) */
’authority’ => ’saml’,
);
5.6. Configuración del consentimiento informado
39
Curso para operadores de Proveedores de Identidad, 1.0
Acceder a documentación adicional sobre consentimiento informado
Personalización de la vista de consentimiento
Si queremos personalizar la vista de consentimiento deberemos acceder a la carpeta templates del módulo consent
y modificar el archivo consentform.php y los archivos de diseño del www/style.css. Aunque lo ideal realmente no es
sobreescribir este archivo sino crear un tema (nuevo módulo de simplesamlphp en el que se redefinen plantillas y se
almacenan imagenes personalizadas).
5.6. Configuración del consentimiento informado
40
CAPÍTULO
SIX
PROTOCOLO DE RESOLUCIÓN DE
INCIDENCIAS EN UN ENTORNO DE
FEDERACIÓN DE IDENTIDADES
6.1 Errores más frecuentes
Los errores más frecuentes que se dan en nuestra federación son:
Problemas en las conexiones a las fuentes de atributos como servidores de bases de datos o directorios. En
ocasiones el servidor de base de datos funciona correctamente pero lo que se queda bloqueado es el conector
del IdP a esa base de datos.
Usuarios que no tienen los atributos obligatorios. En este caso el nodo Hub es capaz de detectar este problema
e informa de esto al usuario.
Usuarios que no tienen el atributo eduPersonPrincipalName. Se produce una excepción ya que ese atributo es
requerido por simpleSAMLphp para funcionar correctamente ya que es el atributo que está establecido como
identificador del usuario.
Que las correspondencias de asignaturas en los LMS no sean correctas.
Si en el flujo de autenticación el usuario le da al botón de atrás del navegador, o se corta la conexión u otro
fallo inesperado, se pierde la sesión y es necesario que cierre el navegador y vuelva a empezar. El error que se
visualiza en este caso es “Lost state”.
Si el usuario hace click dos veces seguidas en el botón de autenticar se produce el error “Duplicated assertion
sent”.
6.2 Protocolo de gestión de errores actual
6.2.1 Falta de datos
Si el problema se ocasiona en el nodo Hub y se debe a que los atributos necesarios no están disponibles, se le presenta
una pantalla al usuario y se le informa de esta circunstancia indicandole que se ponga en contacto con el administrador
de su IdP. En esta caso se obtiene el IdP concreto a partir del atributo eduPersonPrincipalName.
Sin embargo, si uno de los atributos que faltan es el propio eduPersonPrincipalName se produce una excepción y entre
otras cosas el sistema no sabe qué IdP debe indicarle para solucionar el problema. En este caso se envía un correo a
los operadores de la federación con los atributos del usuario de los que se dispone. Los operadores examinan estos
atributos para ver si es posible averiguar el IdP de orígen de dicho usuario para informar a su administrador. Si el
41
Curso para operadores de Proveedores de Identidad, 1.0
usuario está utilizando la dirección de correo institucional, la tarea de obtener su IdP de orígen suele ser fácil. Sin
embargo, en muchas ocasiones, los usuarios utilizan correos de proveedores externos como Hotmail, GMail, etc. y por
tanto, no es posible obtener el IdP a partir de la dirección de correo.
6.2.2 Excepciones
Si se produce cualquier otro de los errores frecuentes anteriormente citados se le presenta al usuario una pantalla en
la que se le permite al usuario “reportar el error”. Ese correo se envía al operador de la federación en el caso de que
se produzca en el nodo hub (y si está bien configurado el IdP también debe llegar al administrador del proveedor de
identidad).
6.2.3 ¿Que pasa si el problema persiste?
Actualmente si el problema persiste, el operador de la federación accede a la cuenta de correo de contacto de
confia.aupa.info y desde esa cuenta informa al usuario el motivo de por qué se está produciendo dicho error y le
propone una solución: Borrar las cookies del navegador, tener cuidado en la navegación o ponerse en contacto con el
CAU de su universidad.
6.2. Protocolo de gestión de errores actual
42
CAPÍTULO
SEVEN
DESPLEGAR UN IDP CON
SIMPLESAMLPHP
7.1 Recursos de ayuda
Documentación de instalación de simpleSAMLphp
Documentación de configuración como IdP en simpleSAMLphp
Docuemntación de la wiki de Confía (y como actualizar de una version a otra)
Lista de correo
7.2 Instalación y configuración
7.2.1 Instalación y dependencias
Vamos a explicar como instalar SimpleSAMLphp en una distribución CentOS 5.6, la cual está disponible para su
descarga desde http://isoredirect.centos.org/centos/5/isos/x86_64/
Una vez se encuentre el sistema operativo instalado, se debe proceder a la instalación de los siguientes paquetes,
requeridos para el correcto funcionamiento de SimpleSAMLphp:
php53
php53-pdo
php53-mysql
php53-mbstring
php55-xml
zlib
pcre
openssl
httpd
libmcrypt
libmcrypt-devel
php53-devel
43
Curso para operadores de Proveedores de Identidad, 1.0
mhash
mhash-devel
mod_ssl
SimpleSAMLphp requiere, además de los anteriores paquetes, de ‘php53-mcrypt’ y ‘php53-memcache’. Por defecto,
estas dependencias no se encuentran en los repositorios oficiales de CentOS 5.6, asi que es necesario compilar dichas
extensiones.
Compilación de php53-mcrypt
Se deben seguir los siguientes pasos para conseguir la extensión de mcrypt:
1. Descargar el código fuente de php-5.3.3 http://es.php.net/get/php-5.3.3.tar.bz2/from/this/mirror y descomprimir
el tarball.
2. Acceder al directorio de extensiones llamado ‘ext’:
# cd php-5.3.3/ext
3. Acceder al directorio de la extension ‘mcrypt’:
# cd mcrypt
4. Preparar la extension antes de ser compilada:
# phpize
# aclocal
5. Proceder con la configuración, compilación e instalación:
# ./configure && make && make install
6. La extensión se deberá instalar en el directorio /usr/lib64/php/modules/. Es necesario crear un fichero
de configuración para la nueva extensión de PHP en el directorio /etc/php.d/ con el siguiente contenido:
extension=mcrypt.so
7. Reiniciar el servicio httpd:
# servide httpd restart
8. Es posible comprobar que el nuevo módulo se encuentra activo creando un fichero index.php en el directorio
de publicación de Apache2 con el siguiente código:
<?php phpinfo(); ?>
Compilación de php53-memcache
Se deben seguir los siguientes pasos para conseguir la extensión memcached:
1. Descargar el código de memcached http://pecl.php.net/get/memcache-2.2.4.tgz y lo descomprimir.
2. Preparar el paquete con la utilizar phpize:
# phpize
3. Configurar, compilar e instalar el módulo:
7.2. Instalación y configuración
44
Curso para operadores de Proveedores de Identidad, 1.0
# ./configure && make && make install
4. La nueva extensión deberá haberse instalado en el directorio /usr/lib64/php/modules/. Es necesario
crear un fichero de configuración para la nueva extensión de PHP en el directorio /etc/php.d/ con el
siguiente contenido:
; Enable memcache extension module
extension=memcache.so
5. Reiniciar el servicio httpd:
# service httpd restart
6. Es posible comprobar que el nuevo módulo se encuentra activo creando un fichero index.php en el directorio
de publicación de Apache2 con el siguiente código:
<?php phpinfo(); ?>
7.2.2 Instalación de SimpleSAMLphp
Una vez resueltas todas las dependencias, la instalación de SimpleSAMLphp es realmente sencilla, solamente es
necesario descargar el código fuente en un directorio del sistema, por ejemplo en el directorio /var/www/idp/:
# svn co http://simplesamlphp.googlecode.com/svn/branches/simplesamlphp-1.8 simplesamlphp
Estructura general
|--cert
|--config
|--config-templates
|--metadata
|--metadata-templates
|--modules
|--lib
|--www
|--templates
|--dictionaries
|--docs
|--log
|--attributemap
|--schemas
|--bin
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
Directorio
donde alojar el certificado y la clave que serán usados para firmar
con los ficheros de configuración de simpleSAMLphp
con plantillas de los ficheros de configuración
donde alojar el fichero de los metadatos del IdP y ficheros con los
con plantillas de los ficheros de metadatos
con los diferentes módulos de simpleSAMLphp
con las librerias de simpleSAMLphp
con la lógica web de simpleSAMLphp
con las plantillas web de simpleSAMLphp
con las traducciones de simpleSAMLphp
con dcd ocumentación
donde alojar los logs de simpleSAMLphp (Requiere configurar el conf
con ficheros con lógica para realizar el mapeo de atributos
con esquemas xsd.
con herramientas de scripts
Hay que asegurarse que el servidor Apache tenga acceso de escritura a los directorios logs y metadata.
Configuración general
Los ficheros de configuración de simpleSAMLphp se localizan dentro del directorio config donde se haya
instalado simpleSAMLphp. En el directorio config-templates se encuentran plantillas de los principales ficheros
de configuración que se pueden necesitar en simpleSAMLphp. Es bastante útil partir de una de estas plantillas y
modificarla a conveniencia en lugar de crear el fichero de configuración correspondiente desde cero, lo cuál suele ser
mucho más propenso a errores.
El primer fichero a modificar es el fichero config.php. Por tanto, lo mejor es copiar su plantilla correspondiente:
7.2. Instalación y configuración
45
Curso para operadores de Proveedores de Identidad, 1.0
# cp /var/www/idp/simplesamlphp/config-templates/config.php /var/www/idp/simplesamlphp/config/config.
Como todos los ficheros de configuración de simpleSAMLphp es un fichero PHP con las reglas de sintáxis de este
lenguaje. Un comando útil que debemos ejecutar siempre que hagamos modificaciones a este fichero es php -l ya que
nos dirá si hay fallos de sintaxis y puede ahorrar tiempo y problemas:
# php -l /var/www/idp/simplesamlphp/config/config.php
No syntax errors detected in /var/www/idp/simplesamlphp/config/config.php
A continuación se detallan las partes más habituales del fichero config.php que hay que modificar:
Contraseña de administración de simpleSAMLphp
’auth.adminpassword’ => ’admin’,
Es importante cambiar esta contraseña porque además de ser un problema de seguridad si se deja tal cual,
simpleSAMLphp lo detectará y dará un error.
Sal aleatoria y secreta:
’secretsalt’ => ’defaultsecretsalt’,
Para generar este valor se puede utilizar el siguiente comando:
# tr -c -d ’0123456789abcdefghijklmnopqrstuvwxyz’ </dev/urandom
| dd bs=32 count=1 2>/dev/null;echo
1zpz5ztl1w5hnqhx8969thxab68us5og
Nombre y dirección de correo del administrador de este simpleSAMLphp:
’technicalcontact_name’ => ’Administrator’,
’technicalcontact_email’ => ’na@example.org’,
Zona horaria:
’timezone’ => NULL,
Un valor de ejemplo para este parámetro es ‘Europe/Madrid’
Idioma predeterminado:
’language.default’ => ’en’,
Lo más habitual es poner el valor ‘es’ para que la interfaz de simpleSAMLphp salga en español.
Hay muchas más opciones de configuración pero estás son las más básicas y necesarias de modificar. Los comentarios
en el fichero config.php explican bastante bien para qué sirve cada uno de los parámetros de configuración.
Configuración como IdP
Para configurar simpleSAMLphp como IdP es necesario habilitar el parámetro ‘enable.saml20-idp’ en el fichero de
configuración config/config.php:
’enable.saml20-idp’ => true,
7.2.3 Configuración de las fuentes de autenticación
La configuración de una fuente de autenticación en SimpleSAMLphp
config/authsources.php. Para ello es necesario seguir dos pasos:
7.2. Instalación y configuración
se
realiza
en
el
fichero
46
Curso para operadores de Proveedores de Identidad, 1.0
1. Habilitar los módulos de autenticación que necesitemos, como ejemplo, habilitaremos el módulo ‘exampleauth’:
# touch modules/exampleauth/enable
2. Se deberá editar el fichero config/authsources.php, añadiendo fuentes de autenticación. En este
ejemplo vemos configuradas fuentes sencillas (admin, exampleauth):
<?php
$config = array(
’admin’ => array(
// The default is to use core:AdminPassword, but it can be replaced with
// any authentication source.
’core:AdminPassword’,
),
’example-userpass’ => array(
’exampleauth:UserPass’,
’usuario1:usuario1.’ => array(
’uid’ => array(’usuario1’),
’eduPersonAffiliation’ => array(’member’, ’student’),
),
’usuario2:usuario2.’ => array(
’uid’ => array(’usuario2’),
’eduPersonAffiliation’ => array(’member’, ’employee’),
),
),
);
?>
En la web de simpleSAMLphp se dispone de documentación sobre configuraciones de las fuentes de autenticación
7.2.4 Configuración del metadato del IdP
Los metadatos del IdP deben de definirse dentro de la carpeta metadata en el fichero saml20-idp-hosted.php.
A continuación se presenta un ejemplo:
<?php
/* The index of the array is the entity ID of this IdP. */
$metadata[’https://idp.example.com/simplesaml/saml2/idp/metadata.php’] = array(
’host’ => ’idp.example.com’,
/* Configuration options. */
/* Organization info */
’OrganizationName’ => array(
’en’ => ’Example organization’,
’es’ => ’Organizacion de ejemplo’,
),
’OrganizationURL’ => array(
’en’ => ’http://idp.example.com’,
’es’ => ’http://idp.example.com’,
),
/* The private key and certificate used by this IdP. */
’certificate’ => ’idp.example.com.crt’,
’privatekey’ => ’idp.example.com.key’,
7.2. Instalación y configuración
47
Curso para operadores de Proveedores de Identidad, 1.0
/*
* The authentication source for this IdP. Must be one
* from config/authsources.php.
*/
’auth’ => ’example-userpass’,
// Logout requests and logout responses sent from this IdP should be signed
’redirect.sign’ => TRUE,
// All communications are encrypted
’assertion.encryption’ => TRUE,
);
?>
La clave del array $metadata es el identificador de entidad (EntityID) y es importante que coincida con la URL que
devuelve los metadatos del propio IdP por motivos de interoperabilidad SAML 2.0. Normalmente es suficiente con
modificar el nombre del host y dejar el resto de la URL tal cual se ve en este ejemplo.
A continuación se detallan los principales parámetros que hay que configurar dentro del array de metadatos para una
entidad en concreto:
host Nombre del host de esta máquina que se utiliza en el VirtualHost de Apache correspondiente
certificate y privatekey Son las dos partes (pública y privada) del certificado usado en el IdP. Estos ficheros deben
encontrarse en el directorio cert del directorio raíz de simpleSAMLphp a no ser que se haya cambiado esa
ubicación en el fichero config.php
auth Este parámetro debe tener como valor el nombre de la fuente de autenticación que se desea usar para autenticar
a los usuarios de este IdP. En el ejemplo anterior ‘example-ldap’ hace referencia a la fuente de autenticación
LDAP que se configuró anteriormente.
redirect.sign, redirect.validate Estos parámetros deben estar a TRUE para que las aserciones se validen y se firmen
assertion.encryption Este parámetro deben estar a TRUE para que se cifren las aserciones SAML que genera este
IdP
7.2.5 Configuración de los metadatos de los SPs
Los metadatos de los SP en los que el IdP va a confiar deben de definirse dentro de la carpeta metadata en el fichero
saml20-sp-remote.php. A continuación se presenta un ejemplo:
<?php
/* The index of the array is the entity ID of this SP. */
$metadata[’https://sp.example.com/simplesaml/module.php/saml/sp/metadata.php/saml’] = array (
’AssertionConsumerService’ => ’https://sp.example.com/simplesaml/module.php/saml/sp/saml2-acs.php
’SingleLogoutService’ => ’https://sp.example.com/simplesaml/module.php/saml/sp/saml2-logout.php/s
’certData’ => ’MIICmTCCAgICCQDHTTCmM3WMCzANBgkqhkiG9w0BAQUFADCBkDELMAkGA1UEBhMCRVMxDjAMBgNVBAgTBX
zcC5leGFtcGxlLmNvbTEXMBUGA1UEAxMOc3AuZXhhbXBsZS5jb20xHjAcBgkqhkiG9w0BCQEWD3NtYXJ0a
YDVQQGEwJFUzEOMAwGA1UECBMFc3BhaW4xEDAOBgNVBAcTB3NldmlsbGUxDTALBgNVBAoTBHlhY28xFzAV
BwGCSqGSIb3DQEJARYPc21hcnRpbkB5YWNvLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnhEe
W1edLwVW72mZ8enl+jL3eEqwlUUz88GyC4h5t/inZ4WTW8jXc5WSNZYUXvk3F0uAO/PmKBEjFoUrA8It3J
grB9Ax8t53uTbtVkXTb/haCwrWDuRywnMjgx7QhpN5RhL5UXPU1n617V2NROVNTH+2ROlhRyPS8l2KpAuV
eug2M7gZeK’,
);
?>
7.2. Instalación y configuración
48
Curso para operadores de Proveedores de Identidad, 1.0
7.2.6 Configuración de Apache
Se debe crear un fichero de configuración para el VirtualHost de idp.example.com.conf en el directorio
/etc/httpd/conf.d/ con el siguiente contenido:
<VirtualHost *:80>
ServerName idp.example.com
DocumentRoot /var/www/idp/simplesamlphp/www
SSLProxyEngine On
ProxyPreserveHost On
Alias /simplesaml /var/www/idp/simplesamlphp/www
<Location />
ProxyPass https://localhost
</Location>
</VirtualHost>
<VirtualHost *:443>
ServerName idp.example.com
DocumentRoot /var/www/idp/simplesamlphp/www
Alias /simplesaml /var/www/idp/simplesamlphp/www
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/idp.example.com/crt/idp.example.com.crt
SSLCertificateKeyFile /etc/httpd/ssl/idp.example.com/key/idp.example.com.key
</VirtualHost>
Además es necesario crear los certificados (autogenerados) que se han especificado en la configuracion del VirtualHost
para https. Se deberán seguir las siguientes instrucciones:
1. Crear el directorio donde alojar los certificados, en este caso, /etc/httpd/ssl/idp.example.com/:
# mkdir -p /etc/httpd/ssl/idp.example.com/crt /etc/httpd/ssl/idp.example.com/key
2. Cambiar el directorio actual por /etc/httpd/ssl/idp.example.com/:
# cd /etc/httpd/ssl/idp.example.com/
3. Creación de la clave sin contraseña y con una encriptación 1024:
# openssl genrsa -out key/idp.example.com.key 1024
4. Generar el fichero CSR (solicitud de certificado):
# openssl req -new -key key/idp.example.com.key -out idp.example.com.csr
5. Generar el certificado autofirmado:
# openssl x509 -req -days 1825 -in idp.example.com.csr -signkey key/idp.example.com.key
-out crt/idp.example.com.crt
Por último, es necesario reiniciar el servicio httpd para que la nueva configuración sea aplicada:
# service httpd restart
Certificado (idp.example.com.crt) y clave (idp.example.com.key) deberemos también de tenerlos accesibles en la
carpeta cert del simpleSAMLphp para que sean usados en el firmado y cifrado de aserciones. Para ello lo mejor
es crear enlaces simbólicos:
ln -s /etc/httpd/ssl/idp.example.com/key/idp.example.com.key /var/www/idp/simplesamlphp/cert/idp.exam
ln -s /etc/httpd/ssl/idp.example.com/crt/idp.example.com.crt /var/www/idp/simplesamlphp/cert/idp.exam
7.2. Instalación y configuración
49
Curso para operadores de Proveedores de Identidad, 1.0
7.3 Backends de autenticación
Las fuentes de autenticación son usadas para identificar al usuario y obtener de el una serie de atributos. En un entorno
de SSO, las fuentes de autenticación sólo son consultadas una única vez ya que los atributos del usuario se encontraran
cacheados hasta que el usuario se deslogue.
En simpleSAMLphp las fuentes de auntenticación se configuran en config/authsources.php. En dicho fichero
pueden definirse cuantas fuentes de autenticación se deseen (incluso varias del mismo tipo).
El patrón es el siguiente:
$config = array(
...
’<nombre-fuente>’ => array(
’<modulo-fuente-autenticacion>:<nombre-fuente-autenticacion>’,
<configuration>
...
’example-userpass’ => array(
’exampleauth:UserPass’,
’usuario1:usuario1.’ => array(
’uid’ => array(’usuario1’),
’eduPersonAffiliation’ => array(’member’, ’student’),
),
),
...
);
Podemos encontrar multitud de fuentes en simpleSAMLphp:
authfacebook:Facebook
authlinkedin:LinkedIn
authmyspace:MySpace
authX509:X509userCert
authwindowslive:LiveID
authtwitter:Twitter
authYubiKey:YubiKey
cas:CAS
exampleauth:External
exampleauth:Static
exampleauth:UserPass
InfoCard:ICAuth
ldap:LDAP
ldap:LDAPMulti
multiauth:MultiAuth
openid:OpenIDConsumer
radius:Radius
saml:SP
7.3. Backends de autenticación
50
Curso para operadores de Proveedores de Identidad, 1.0
7.4 Repaso de filtros en simpleSAMLphp
Los filtros pueden definirse en el IdP o en el SP. Dentro de cada elemento se pueden configurar en distintos sitios:
En config.php, lo cual afectará globalmente al toda la instancia de simpleSAMLphp. Los filtros se pueden
colocar dentro de dos parámetros:
En ‘authproc.idp’, lo cual hará que se ejecuten los filtros en la parte IdP para todas las entidades alojadas.
En ‘authproc.sp’, lo cual hará que se ejecuten los filtros en la parte SP para todas las entidades alojadas.
Los siguientes filtros se ejecutan de manera local y se definen en la array ‘authproc’:
En un SP:
En config/authsources.php, lo cual afectará al propio SP.
En saml20-idp-remote.php, lo cual afectará a un IdP remoto concreto.
En un IdP:
En saml20-idp-hosted.php, lo cual afectará al propio IdP.
En saml20-sp-remote.php, lo cual afectará a un SP remoto concreto.
Es importante en que orden se ejecutan los filtros ya que el resultado final puede ser diferente. Por ello es importante
observar que todos los filtros definidos tengan el orden correcto que viene indicado por el número del índice del array
(los números más bajos se ejeutan antes).
Existe documentación detallada sobre los filtros de atributos implementados en simpleSAMLphp.
7.4.1 Ejemplos de filtros de atributos
Generación de atributos
ePTI: Implementado como filtro core:AttributeAlter:
10 => array(
’class’ => ’core:AttributeAlter’,
’subject’ => ’eduPersonTargetedID’,
’pattern’ => ’/^(.*)$/’,
’replacement’ => ’\1@<dominio>’
),
Comprobación de atributos
Filtro DNI: Implementado como filtro core:PHP:
11 => array(
’class’ => ’core:PHP’,
’code’ => ’
if(isset($attributes["schacPersonalUniqueID"])) {
foreach($attributes["schacPersonalUniqueID"] as $i => $personaluniqueid) {
$regex = "/urn:mace:terena.org:schac:personalUniqueID:es:(.*):([0-9]{8})$/";
if(preg_match($regex, $personaluniqueid, $values)) {
$dni = $values[2];
$letraNif= substr("TRWAGMYFPDXBNJZSQVHLCKE",$dni %23,1);
$attributes["schacPersonalUniqueID"][$i] .= $letraNif;
7.4. Repaso de filtros en simpleSAMLphp
51
Curso para operadores de Proveedores de Identidad, 1.0
}
}
}
’,
),
Eliminación de atributos
Filtro contraseña: Implementado como filtro core:AttributeAdd:
12 => array(
’class’ => ’core:AttributeAdd’,
’ %replace’,
’userPassword’ => ’’,
),
Fitro limitador de atributos (sólo deja pasar los atributos aquí definidos): Implementado como
core:AttributeLimit:
13 => array(
’class’ => ’core:AttributeLimit’,
// required
’gn’,’givenName’, ’cn’, ’sn’, ’schacSn1’, ’displayName’,
’irisMailMainAddress’, ’eduPersonScopedAffiliation’,’eduPersonAffiliation’,
’eduPersonPrimaryAffiliation’,’eduPersonPrincipalName’,’schacPersonalUniqueID’,
// recommended
’irisMailAlternateAddress’, ’mail’, ’schacUserPresenceID’,
’irisClassifCode’, ’schacUserStatus’,
’eduPersonEntitlement’, ’irisUserEntitlement’,
’schacUserPrivateAttribute’, ’schacPersonalUniqueCode’,
// optionals
’schacSn2’, ’schacMotherTonge’, ’schacGender’, ’chacDateOfBirth’,
’schacPlaceOfBirth’, ’schacCountryOfCitizenship’,
’jpegPhoto’, ’eduPersonNickname’, ’schacPersonalTitle’,
’title’, ’preferredLanguage’, ’schacYearOfBirth’,
’postalAddress’, ’homePostalAddress’, ’street’, ’l’,
’postalCode’, ’mobile’, ’homePhone’, ’telephoneNumber’,
’fax’, ’schacCountryOfResidence’, ’eduPersonOrgDN’,
’eduPersonAssurance’, ’userCertificate’, ’userSMIMECertificate’,
’irisPublicKey’, ’uid’, ’o’, ’ou’, ’labeledURI’,
’description’, ’seeAlso’,
// others
’eduPersonTargetedID’, ’schacHomeOrganization’, ’schacHomeOrganizationType’,
),
Ejemplo de creación de datos con core:PHP
Creación de datos de un usuario para realizar tests:
60 => array(
’class’ => ’core:PHP’,
’code’ =>
’
if(isset($attributes["eduPersonPrincipalName"]) &&
strpos($attributes["eduPersonPrincipalName"][0], "confiatest@") !== false) {
$scope_university = "university.es";
7.4. Repaso de filtros en simpleSAMLphp
52
Curso para operadores de Proveedores de Identidad, 1.0
$attributes = array();
$attributes["uid"] = array("confiatest");
$attributes["givenName"] = array("Pruebas");
$attributes["cn"] = array("Pruebas Confia");
$attributes["sn"] = array("Confia");
$attributes["schacSn1"] = array("Confia");
$attributes["schacSn2"] = array("");
$attributes["displayName"] = array("Pruebas Confia");
$attributes["irisMailMainAddress"] = array("confiatest@".$scope_university);
$attributes["eduPersonAffiliation"] = array("affiliate");
$attributes["eduPersonScopedAffiliation"] = array("affiliate".$scope_university);
$attributes["eduPersonPrimaryAffiliation"] = array("affiliate");
$attributes["eduPersonPrincipalName"] = array("confiatest@".$scope_university);
$attributes["schacPersonalUniqueID"] = array("urn:mace:terena.org:schac:personalUniqu
$attributes["schacUserStatus"] = array();
$base_course = "urn:mace:terena.org:schac:userStatus:es:campusandaluzvirtual.es:";
$attributes["schacUserStatus"][] = $base_course."98705999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."98706999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."98708999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."98711999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."98717999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."98748999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."98749999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."98750999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."98758999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."98763999:2009-10:student:active";
$attributes["schacUserStatus"][] = $base_course."99999999:2009-10:student:active";
}
’,
),
AttributeCollector
El AttributeCollector permite añadir atributos desde otra fuente, ya sea una BD (attributecollector:SQLCollector) o un
ldap (attributecollector:LDAPCollector).
Ejemplo:
’authproc’ => array(
10 => array(
’class’ => ’attributecollector:AttributeCollector’,
’existing’ => ’preserve’,
’uidfield’ => ’subject’,
# Aqui se añade la configuración del filtro concreto
)
),
Parámetros:
class: La clase del filtro. Siempre : ‘attributecollector:AttributeCollector’
uidfield: El nombre del campo usado como identificador único del usuario. El colector configurado recibe este
identificador para poder realizar la busqueda de atributos.
collector: Configuración del colector que va a ser usado.
7.4. Repaso de filtros en simpleSAMLphp
53
Curso para operadores de Proveedores de Identidad, 1.0
existing: Opcional. Dice al filtro que hacer cuando ya exista un valor para el atributo encontrado en la
recolección. Las aleternativas pueden ser:
‘preserve’: Ignora el valor del atributo recolectado y conserva el que ya tenía. Opción por omisión.
‘replace’: Ignora lo que había y la remplaza con el valor nuevo.
‘merge’: Mezcla lo recolectado con lo que ya se tenía.
Configuración del filtro attributecollector:SQLCollector
Recolecta atributos de un ldap.
Parámetros:
dsn: EL DSN que debe ser usado para conectar con la base de datos. Visualiza los diferentes formatos en
http://php.net/manual/en/pdo.drivers.php
username: El nombre de usuario que debe de ser usado para conectar con la BD.
password: Password para autenticarse con la BD.
query: Consulta sql para obtener los atributos. Puedes usar la cadena especial :uidfield para hacer referencia al
valor del atributo que se especifico en el campo uidfield.
Ejemplo
’collector’ => array(
’class’ => ’attributecollector:SQLCollector’,
’dsn’ => ’pgsql:host=localhost;dbname=simplesaml’,
’username’ => ’simplesaml’,
’password’ => ’secretpassword’,
’query’ => ’select address, phone, country from extraattributes where uid=:uidfield’,
)
Ejemplo complejo:
’collector’ => array(
’class’ => ’attributecollector:SQLCollector’,
’dsn’ => array(’oci:dbname=first’,
’mysql:host=localhost;dbname=second’
),
’username’ => array(’first’, ’second’),
’password’ => array(’first’, ’second’),
’query’ => array("SELECT sid as SUBJECT from subjects where uid=:uid",
"SELECT sid as SUBJECT from subjects where uid=:uid AND status=’OK’",
),
),
)
Configuración del filtro attributecollector:LDAPCollector
Recolecta atributos de una base de datos.
Parámetros:
host: Host del servidor LDAP
port: Puerto del servidor LDAP
protocol: Protocolo LDAP
binddn: El nombre de usuario que debe ser usado para conectar con el LDAP
password: Password del usuario necesario para conectar con el LDAP
7.4. Repaso de filtros en simpleSAMLphp
54
Curso para operadores de Proveedores de Identidad, 1.0
basedn: DN base para las búsquedas LDAP
attrlist: Array asociativo de [LDAP attr1 => atr1, LDAP attr2 => atr2]
searchfilter: Filtro usado para buscar en el directorio. Puedes usar la cadena especial :uidfield para hacer
referencia al valor del atributo que se especifico en el campo uidfield.
Ejemplo:
’collector’ => array(
’class’ => ’attributecollector:LDAPCollector’,
’host’ => ’myldap.srv’,
’port’ => 389,
’binddn’ => ’cn=myuser’,
’password’ => ’secret’,
’basedn’ => ’dc=my,dc=org’,
’searchfilter’ => ’uid=:uidfield’,
’protocol’ => 3,
’attrlist’ => array(
// LDAP attr => real attr
’objectClass’ => ’myClasses’,
),
),
AttributeValueFilter
El filtro AttributeValueFilter elimina determinados valores de los atributos basándose en patrones definidos.
Parámetros:
class: La clase del filtro, que es siempre: ‘coursefilter:CourseFilter’.
attributename: El nombre del campo de los atributos que queremos filtrar
spmapping: Contiene el mapeo entity_id <–> patrón de busqueda (y opcionalmente el valor a remplazar)
Ejemplo:
<?php
$course_pattern = ’urn:mace:terena.org:schac:userStatus:es:’ .
’example.com:987 %CODE %\d{3}:\d{4}-\d{2}:student:(in)?active’;
$sps = array(
’example1.com’ => ’48’,
’example2.com’ => ’05’,
’example3.com’ => ’06’,
’example4.com’ => ’08’,
);
foreach ($sps as $sp => $code)
$sps_patterns["|$sp|"] = str_replace(’ %CODE %’, $code, $course_pattern);
$config = array(
’authproc.idp’ => array(
60 => array(
’class’
=> ’attributevaluefilter:AttributeValueFilter’,
’attributename’ => ’schacUserStatus’,
’spmapping’ => $sps_patterns,
),
),
);
7.4. Repaso de filtros en simpleSAMLphp
55
Curso para operadores de Proveedores de Identidad, 1.0
7.5 Alta disponibilidad
7.5.1 Replicación y balanceo de carga
Lo primero que debemos hacer es replicar las instancias tantas veces como queramos. Cuantas mas instancias tengamos
replicadas mayor podra ser el reparto de carga y más dificil será que el sistema quede fuera de servicio.
Lo ideal es que las instancias replicadas se encuentren en máquinas fisicas diferentes para que si se produce un fallo
fisico sigan quedando instancias operativas.
Como balanceador de carga si no se dispone de un balanceador físico recomendamos el balanceador software HA
Proxy. Generalmente los balanceadores de carga para ver si una instancia está operativa o no requieren la inclusión
de un pequeño fichero que es instalado en cada una de las instancias. Dicho fichero es consultado de forma periódica
para tener actualizado el estado de cada instancia. Si una instancia no está operativa el balanceador no lo considera a
la hora de repartir las peticiones que recibe.
7.5.2 Alta disponibilidad en simpleSAMLphp
Configurar un SP o un IdP en alta disponibilidad no es dificil ya que hay muy poco estado que compartir entre los nodos
de un cluster al no necesitar de un almacenamiento persistente como una base de datos relacional. El “nodo bridge”
que generalmente alberga más funcionalidad que los nodos periféricos (consentimiento, descubrimiento, validación,
estadísticas, monitorización, gestión de metadatos) si que requerirá de un poco más de planificación para ponerlo en
alta disponibilidad.
En los IdPs y SPs lo único que es importante compartir entre los nodos de SimpleSAMLPHP es la sesión de los
usuarios. En este sentido es muy cómodo utilizar el soporte para Memcached disponible en SimpleSAMLphp para
que las sesiones entre varias instancias se compartan.
Otra alternativa menos recomendable, es que las sesiones esten almacenadas en una instancia diferente a las instancias
que se quieren poner en alta disponibilidad, por ejemplo en una base de datos. Para lo cual habría que configurar que
el manejador de sesiones de simpleSAMLphp sea del tipo database.
Y por ultimo nos quedaría montar un sistema de ficheros compartido entre las diferentes instancas y que el manejador
de sesiones sea del tipo files.
La ventaja de utilizar memcache es que es un sistema robusto con el que conseguiremos tener un sistema de failover
de las sesiones. A continuación explicamos como se configuraría.
En SimpleSAMLPHP la configuración de los servidores Memcached se realiza por grupos. Cada elemento de
información se almacena en todos los grupos por motivos de redundancia. Cada grupo está compuesto por varios
servidores Memcached pero cada elemento de información se almacena en uno sólo de ellos. En este caso el tener
varios servidores se hace para conseguir un mayor rendimiento.
Lo más importante de todo es que SimpleSAMLPHP se encarga de gestionar todo esto de forma automática. Lo único
que hay que decirle es las direcciones de los servidores Memcached.
7.5.3 Instalación de memcached
Instalamos el servidor de memcached y el cliente para php:
yum install memcached php-pecl-memcache
Y configuramos el servicio:
7.5. Alta disponibilidad
56
Curso para operadores de Proveedores de Identidad, 1.0
# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="512"
OPTIONS=""
# 512MB
A continuación añadimos el servicio de memcache en el arranque del sistema y lo iniciamos:
chkconfig memcached on
service memcached start
Podemos comprobar que el servicio está funcionando ejecutando:
echo stats | nc localhost 11211
A continuación instalamos el cliente php de memcache:
yum install php php-pecl-memcache
Y reiniciamos el servidor apache:
/etc/init.d/httpd restart
7.5.4 Configuración de memcached en simpleSAMLphp
Para conseguir la configuración mostrada en la siguiente figura
7.5. Alta disponibilidad
57
Curso para operadores de Proveedores de Identidad, 1.0
tendríamos que añadir esta información al fichero config/config.php de SimpleSAMLPHP:
’store.type’ => ’memcache’,
’memcache_store.servers’ => array(
array(
array(’hostname’ => ’1A’),
array(’hostname’ => ’1B’),
array(’hostname’ => ’1C’),
),
array(
array(’hostname’ => ’2A’),
array(’hostname’ => ’2B’),
array(’hostname’ => ’2C’),
),
array(
array(’hostname’ => ’3A’),
array(’hostname’ => ’3B’),
array(’hostname’ => ’3C’),
),
),
7.5. Alta disponibilidad
58
Curso para operadores de Proveedores de Identidad, 1.0
Cada grupo de servidores es un array de servidores. Cada servidor es un array con las siguientes claves:
hostname. Nombre del servidor o dirección IP del servidor Memcache. Es la única opción obligatoria.
port. Número del puerto del servidor Memcache. Por defecto es 11211.
weight. Peso de este servidor dentro de su grupo. Influye en la probabilidad de que se elija este servidor en la
tarea de balanceo de carga interna que se realiza para guardar cada sesión.
timeout. Tiempo que se espera a que el servidor responda. Por defecto es 3 segundos.
Con esta configuración se podrían perder los tres servidores del grupo 1, 2 ó 3 sin que se perdiera ninguno dato de
sesión. Si se pierden los tres servidores etiquetados como A, B o C entonces sí habría perdida de información.
7.5. Alta disponibilidad
59
CAPÍTULO
EIGHT
EL IDP COMO SP
8.1 Caso base: IdP y SP
La estructura más básica a la hora de conectar un proveedor de servicio con un proveedor de identidad es, obviamente,
conectarlos de forma directa. Esta es la base de muchas federación en forma de malla o mesh. El principal
inconveniente es que cuando aumenta el número de servicios que el proveedor de identidad quiere soportar o cuando
aumenta el número de proveedores de identidad que el proveedor de servicio quiere soportar, el coste en mantenimiento
es lineal.
Figura 8.1: Caso básico de un SP conectado a un IdP
8.2 Hub & Spoke
En una arquitectura Hub & Spoke ambos tipos de nodos se conectan a un nodo concentrador o hub. De esta forma se
consigue que cada nuevo servicio de la federación está potencialmente disponible a todos los proveedores de identidad
con sólo conectarlo al Hub. Con un nuevo proveedor de servicio se consigue el mismo beneficio.
En este modelo es crucial el nodo central o hub. Este nodo tiene dos interfaces: por el lado al que se conectan los
proveedores de servicio simula ser un proveedor de identidad y por el lado al que se conectan los proveedores de
60
Curso para operadores de Proveedores de Identidad, 1.0
identidad simula ser un proveedor de servicio. Realmente es un puente entre ambos lados haciendo las conversiones
necesarias entre peticiones y respuestas.
En SimpleSAMLphp es sencillo configurar un nodo para que actue de hub. Consulte el apéndice 1 para averiguar
cómo.
Figura 8.2: Federación según modelo Hub & Spoke
8.3 IdP como SP en federación Hub & Spoke
Después de repasar los conceptos y tipos de conexión en federaciones SAML2 procedemos a estudiar el caso de que
un IdP actue como SP en determinadas ocasiones. Como se puede ver en la figura IdP configurado para ser también
un SP al exterior es exactamente el mismo caso que el del hub.
El principal motivo para querer configurar un IdP de esta forma es mejorar la experiencia de usuario de la mayoría
de usuarios de dicho IdP. Es lógico pensar que la mayoría de usuarios de un SP son los miembros de la institución
donde está ubicado el IdP. Así, por ejemplo, es fácil comprender que la mayoría de los usuarios de un LMS de una
Universidad son los propios alumnos de dicha Universidad. Por este motivo, es deseable darles un trato preferente a
dichos usuarios en ese servicio. En lugar de conectar el servicio directamente con el nodo Hub de la federación, se
conectaría con el IdP de dicha institución. Si un usuario llega a dicho IdP (al intentar acceder al SP) y no pertenece a
esa institución, dispondrá de un mecanismo para dar el salto al Hub de la federación y seguir el proceso como hasta
ahora. Por tanto, se está penalizando a lo usuarios externos (haciendo que vean una pantalla más) para poder beneficiar
a los usuarios internos a la institución que, recordemos, suelen ser muchos más.
Además, esta configuración disminuye los costes de mantenimiento de los servicios ofrecidos por la institución. Al
igual que el modelo Hub&Spoke disminuye los costes de mantenimiento frente a un modelo Mesh, el configurar un
IdP como un SP disminuye el coste de conectar un nuevo proveedor de identidad que tenga acceso potencial a todos
los servicios de la instutición ya que sólo es necesario conectarlo al IdP de la institución. Similarmente al conectar un
8.3. IdP como SP en federación Hub & Spoke
61
Curso para operadores de Proveedores de Identidad, 1.0
Figura 8.3: IdP configurado para ser también un SP al exterior
8.3. IdP como SP en federación Hub & Spoke
62
Curso para operadores de Proveedores de Identidad, 1.0
nuevo servicio de la institución al IdP institucional se consigue que todos los IdPs que ya estaban conectados al IdP
institucional disponen de un nuevo servicio sin hacer nada.
Figura 8.4: Pantalla de autenticación de un IdP configurado para ser también un SP al exterior
8.3. IdP como SP en federación Hub & Spoke
63
CAPÍTULO
NINE
REFERENCIAS
9.1 Protocolos
SAML2
PAPI
OpenID
9.2 Iniciativas de federación
Web de OASIS
Web de la iniciativa Kantara
Web de JISC para el tema de acceso e identidad
Web de Switch
Web del proyecto STORK
Web de InCommon
9.3 Federaciones de identidad
Web de la federación andaluza. CONFIA
Web de federación danesa. WAYF
Web del Servicio de Identidad de RedIRIS. SIR
Web de la federacion de UK.
Web de la federación australiana. AFF
Web de la federación nórdica. Kalmar Union
Web de la federación finlandesa. HAKA
Web de la federación holandesa. SURFfederatie
Web de la federación de Suiza. SWITCHaai
Web de la federación noruega. Feide
64
Curso para operadores de Proveedores de Identidad, 1.0
Web de la federación americana. ‘InCommon Federation
Wiki con información extendida de las federaciones existentes
9.4 Especificación SAML
Security Assertion Markup Language
SAML Profiles
SAML Bindings
SAML Metadata
SAML Conformance
SAML Security and Privacity
9.5 Implementaciones de SAML
simpleSAMLphp (doc_ssp) (código_ssp)
Shibboleth (doc_shib) (código_shib)
OpenSSO (doc_opensso) (doc2_opensso) (código_opensso)
OpenAM
pySAML2 (doc_pysaml) (código_pysaml)
djangosaml2
Lasso
OpenSAML
ESOE
9.6 Hub&Spoke
Introducing transparency in hub-and-spoke federation architectures using SAML2 authentication request
scoping elements
Inter-federation
WAYF federation
Federated Identity: Scenarios, Architecture, and Implementation
9.7 WAYF embebido
Documentación sobre WAYF embebidos de Switch
9.4. Especificación SAML
65
Curso para operadores de Proveedores de Identidad, 1.0
9.8 Consentimiento informado
User experience in WAYF federation (info , video)
Withdrawel of consent only withdraws the consent
How Better Attribute Management Helps Federation
User consent can be governed centrally but presented locally
Consentimiento informado en SimpleSAMLphp
9.9 Gestión centralizada de metadatos
Metadata administraition as selfservice
Documentación de Janus
SAML Metadata Management for eduID.cz
Proyecto PEER
Basic Metadata Aggregation Profile
Otras referencias
Gestión de metadatos en SimpleSAMLphp
9.10 Otros conceptos avanzados
Enhancement of the graphical user interface of Where Are You From
Attribute release policies made simple
ARP size matters – and less is more!
Filtros en simpleSAMLphp
SAML V2.0 Identity Assurance Profiles Version 1.0
9.8. Consentimiento informado
66
CAPÍTULO
TEN
ANEXO A. DESPLIEGUE DE ENTORNO
HUB&SPOKE
10.1 Funcionamiento
Figura 10.1: Arquitectura Hub & Spoke
Cuando conectamos un SP con el nodo central, delegamos la funcionalidad de descubrimiento en ese nodo.
1. Cuando tratemos de acceder en una aplicación protegida con el SP, el SP redireccionará al nodo central
2. En el nodo central se le mostrará al usuario una pantalla con el conjunto de IdPs disponibles de la federación.
3. El usuario seleccionara uno de los IdPs y se le redireccionará a ese IdP
4. Al usuario se le muestra el formulario de autenticación del IdP, tras identificarse, los datos viajan al nodo central
5. En el nodo central los datos del usuario son a su vez reenviados al SP y ahí acaba el flujo.
67
Curso para operadores de Proveedores de Identidad, 1.0
10.2 Implementación basada en simpleSAMLphp. “nodo bridge”
El software simpleSAMLphp puede funcionar como un IdP, como un SP o como ambos a la vez (bridge), habilitando
el modelo Hub & Spoke.
El esquema sería:
Figura 10.2: Esquema conexión nodo bridge
Los IdPs se conectarían con el lado SP del “nodo bridge” y los SPs con el lado IdP del “nodo bridge”. Un aspecto
importante a tener en cuenta es el orden de ejecución de los filtros que establezcamos en el “nodo bridge”. Los filtros
del lado SP del “nodo bridge” se ejecutarán antes que los filtros del lado IdP.
10.2.1 Instalación de simpleSAMLphp y dependencias
Lo primero será instalar las dependencias de simplesamlphp. Explicaremos como se realiza la instalación de dependencias en una distribución CentOS 5.6, la cual está disponible para su descarga desde
http://isoredirect.centos.org/centos/5/isos/x86_64/. Supondremos a partir de ahora que el
despliegue será realizado en la ruta /var/www/wayf/.
Una vez se encuentre el sistema operativo instalado, se debe proceder a la instalación de los siguientes paquetes,
requeridos para el correcto funcionamiento de SimpleSAMLphp:
php53
php53-pdo
php53-mysql
php53-mbstring
php55-xml
zlib
pcre
openssl
httpd
libmcrypt
libmcrypt-devel
php53-devel
mhash
mhash-devel
10.2. Implementación basada en simpleSAMLphp. “nodo bridge”
68
Curso para operadores de Proveedores de Identidad, 1.0
mod_ssl
SimpleSAMLphp requiere, además de los anteriores paquetes, de ‘php53-mcrypt’ y ‘php53-memcache’. Por defecto,
estas dependencias no se encuentran en los repositorios oficiales de CentOS 5.6, asi que es necesario compilar dichas
extensiones.
Compilación de php53-mcrypt
Se deben seguir los siguientes pasos para conseguir la extensión de mcrypt:
1. Descargar el código fuente de php-5.3.X y descomprimir el tarball.
2. Acceder al directorio de extensiones llamado ‘ext’:
# cd php-5.3.X/ext
3. Acceder al directorio de la extension ‘mcrypt’:
# cd mcrypt
4. Preparar la extension antes de ser compilada:
# phpize
# aclocal
5. Proceder con la configuración, compilación e instalación:
# ./configure && make && make install
6. La extensión se deberá instalar en el directorio /usr/lib64/php/modules/. Es necesario crear un fichero
de configuración para la nueva extensión de PHP en el directorio /etc/php.d/ con el siguiente contenido:
extension=mcrypt.so
7. Reiniciar el servicio httpd:
# servide httpd restart
8. Es posible comprobar que el nuevo módulo se encuentra activo creando un fichero index.php en el directorio
de publicación de Apache2 con el siguiente código:
<?php phpinfo(); ?>
Compilación de php53-memcache
Se deben seguir los siguientes pasos para conseguir la extensión memcached:
1. Descargar el código de memcached http://pecl.php.net/get/memcache y descomprimir.
2. Preparar el paquete con la utilizar phpize:
# phpize
3. Configurar, compilar e instalar el módulo:
# ./configure && make && make install
4. La nueva extensión deberá haberse instalado en el directorio /usr/lib64/php/modules/. Es necesario
crear un fichero de configuración para la nueva extensión de PHP en el directorio /etc/php.d/ con el
siguiente contenido:
; Enable memcache extension module
extension=memcache.so
10.2. Implementación basada en simpleSAMLphp. “nodo bridge”
69
Curso para operadores de Proveedores de Identidad, 1.0
5. Reiniciar el servicio httpd:
# service httpd restart
6. Es posible comprobar que el nuevo módulo se encuentra activo creando un fichero index.php en el directorio
de publicación de Apache2 con el siguiente código:
<?php phpinfo(); ?>
Una vez instaladas las dependencias, la instalación de SimpleSAMLphp es realmente sencilla, solamente es necesario
descargar el código fuente en un directorio del sistema, por ejemplo en el directorio /var/www/wayf/:
# svn co http://simplesamlphp.googlecode.com/svn/branches/simplesamlphp-1.9 simplesamlphp
10.2.2 Configuración parte Común
El primer fichero a modificar es el fichero config.php. Por tanto, lo mejor es copiar su plantilla correspondiente:
# cp /var/www/wayf/simplesamlphp/config-templates/config.php
/var/www/wayf/simplesamlphp/config/config.php
Como todos los ficheros de configuración de simpleSAMLphp es un fichero PHP con las reglas de sintáxis de este
lenguaje. Un comando útil que debemos ejecutar siempre que hagamos modificaciones a este fichero es php -l ya que
nos dirá si hay fallos de sintaxis y puede ahorrar tiempo y problemas:
# php -l /var/www/wayf/simplesamlphp/config/config.php
No syntax errors detected in /var/www/wayf/simplesamlphp/config/config.php
A continuación se detallan las partes más habituales del fichero config.php que hay que modificar:
Contraseña de administración de simpleSAMLphp:
’auth.adminpassword’ => ’admin’,
Es importante cambiar esta contraseña porque además de ser un problema de seguridad si se deja tal cual,
simpleSAMLphp lo detectará y dará un error.
Sal aleatoria y secreta:
’secretsalt’ => ’defaultsecretsalt’,
Para generar este valor se puede utilizar el siguiente comando:
# tr -c -d ’0123456789abcdefghijklmnopqrstuvwxyz’ </dev/urandom | dd bs=32 count=1 2>/dev/null;
echo 1zpz5ztl1w5hnqhx8969thxab68us5og
Nombre y dirección de correo del administrador de este simpleSAMLphp:
’technicalcontact_name’ => ’Administrator’,
’technicalcontact_email’ => ’na@example.org’,
Zona horaria:
’timezone’ => NULL,
Un valor de ejemplo para este parámetro es ‘Europe/Madrid’
Idioma predeterminado:
10.2. Implementación basada en simpleSAMLphp. “nodo bridge”
70
Curso para operadores de Proveedores de Identidad, 1.0
’language.default’ => ’en’,
Lo más habitual es poner el valor ‘es’ para que la interfaz de simpleSAMLphp salga en español.
Hay muchas más opciones de configuración pero estás son las más básicas y necesarias de modificar. Los comentarios
en el fichero config.php explican bastante bien para qué sirve cada uno de los parámetros de configuración.
Configuración de Apache
Se debe crear un fichero de configuración para el VirtualHost de wayf.example.com.conf en el directorio
/etc/httpd/conf.d/ con el siguiente contenido:
<VirtualHost *:80>
ServerName wayf.example.com
DocumentRoot /var/w/wayf/simplesamlphp/www
SSLProxyEngine On
ProxyPreserveHost On
Alias /simplesaml /var/www/wayf/simplesamlphp/www
<Location />
ProxyPass https://localhost
</Location>
</VirtualHost>
<VirtualHost *:443>
ServerName wayf.example.com
DocumentRoot /var/www/wayf/simplesamlphp/www
Alias /simplesaml /var/www/wayf/simplesamlphp/www
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/wayf.example.com/crt/wayf.example.com.crt
SSLCertificateKeyFile /etc/httpd/ssl/wayf.example.com/key/wayf.example.com.key
</VirtualHost>
Además es necesario crear los certificados (autogenerados) que se han especificado en la configuracion del VirtualHost
para https. Se deberán seguir las siguientes instrucciones:
1. Crear el directorio donde alojar los certificados, en este caso, /etc/httpd/ssl/wayf.example.com/:
# mkdir -p /etc/httpd/ssl/wayf.example.com/crt /etc/httpd/ssl/wayf.example.com/key
2. Cambiar el directorio actual por /etc/httpd/ssl/wayf.example.com/:
# cd /etc/httpd/ssl/wayf.example.com/
3. Creación de la clave sin contraseña y con una encriptación 1024:
# openssl genrsa -out key/wayf.example.com.key 1024
4. Generar el fichero CSR (solicitud de certificado)
# openssl req -new -key key/wayf.example.com.key -out wayf.example.com.csr
5. Generar el certificado autofirmado:
# openssl x509 -req -days 1825 -in wayf.example.com.csr -signkey key/wayf.example.com.key
-out crt/wayf.example.com.crt
Por último, es necesario reiniciar el servicio httpd para que la nueva configuración sea aplicada:
10.2. Implementación basada en simpleSAMLphp. “nodo bridge”
71
Curso para operadores de Proveedores de Identidad, 1.0
# service httpd restart
Certificado (wayf.example.com.crt) y clave (wayf.example.com.key) deberemos también de tenerlos accesibles en la
carpeta cert del simpleSAMLphp para que sean usados en el firmado y cifrado de aserciones. Para ello lo mejor es
crear enlaces simbólicos
# ln -s /etc/httpd/ssl/wayf.example.com/key/wayf.example.com.key
/var/www/wayf/simplesamlphp/cert/wayf.example.com.key
# ln -s /etc/httpd/ssl/wayf.example.com/crt/wayf.example.com.crt
/var/www/wayf/simplesamlphp/cert/wayf.example.com.crt
10.2.3 Configuración parte IdP
Para configurar simpleSAMLphp como SP es necesario habilitar el parámetro ‘enable.saml20-sp’ en el fichero de
configuración config/config.php:
’enable.saml20-idp’ => true,
10.2.4 Configuración de las fuente de autenticación
En este caso no hace falta especificar fuente de autenticación ya que la fuente de autenticación será la parte SP del
“nodo bridge” que posteriormente configuraremos (config/authsourcesphp).
Configuración del metadato del IdP
Los metadatos del IdP deben de definirse dentro de la carpeta metadata en el fichero saml20-idp-hosted.php.
A continuación se presenta un ejemplo:
<?php
/* The index of the array is the entity ID of this WAYF. */
$metadata[’https://wayf.example.com/simplesaml/saml2/wayf/metadata.php’] = array(
’host’ => ’wayf.example.com’,
/* Configuration options. */
/* Organization info */
’OrganizationName’ => array(
’en’ => ’Example organization’,
’es’ => ’Organizacion de ejemplo’,
),
’OrganizationURL’ => array(
’en’ => ’http://wayf.example.com’,
’es’ => ’http://wayf.example.com’,
),
/* The private key and certificate used by this IdP. */
’certificate’ => ’wayf.example.com.crt’,
’privatekey’ => ’wayf.example.com.key’,
/*
* The authentication source for this IdP. Must be one
* from config/authsources.php.
10.2. Implementación basada en simpleSAMLphp. “nodo bridge”
72
Curso para operadores de Proveedores de Identidad, 1.0
*/
’auth’ => ’saml’,
// Logout requests and logout responses sent from this IdP should be signed
’redirect.sign’ => TRUE,
// All communications are encrypted
’assertion.encryption’ => TRUE,
);
?>
Nota: Observamos que la fuente de autenticación es la anteriormente especificada: ‘saml’ (La fuente de
autenticación del IdP será la parte SP del “nodo bridge” en lugar del típico ldap o BD)
La clave del array $metadata es el identificador de entidad (EntityID) y es importante que coincida con la URL
que devuelve los metadatos del propio “nodo bridge” por motivos de interoperabilidad SAML 2.0. Normalmente es
suficiente con modificar el nombre del host y dejar el resto de la URL tal cual se ve en este ejemplo.
A continuación se detallan los principales parámetros que hay que configurar dentro del array de metadatos para una
entidad en concreto:
host Nombre del host de esta máquina que se utiliza en el VirtualHost de Apache correspondiente
certificate y privatekey Son las dos partes (pública y privada) del certificado usado en el IdP. Estos ficheros deben
encontrarse en el directorio cert del directorio raíz de simpleSAMLphp a no ser que se haya cambiado esa
ubicación en el fichero config.php
auth Este parámetro debe tener como valor el nombre de la fuente de autenticación que se desea usar para autenticar
a los usuarios de este “nodo bridge”.
redirect.sign* Este parámetro debe estar a TRUE para que las aserciones se firmen
redirect.validate Este parámetro debe estar a TRUE para que las aserciones se validen
assertion.encryption Este parámetro deben estar a TRUE para que se cifren las aserciones SAML
Configuración de los metadatos de los SPs que se van a conectar al “nodo bridge”
Los metadatos de los SP en los que el “nodo bridge” va a confiar deben de definirse dentro de la carpeta metadata en
el fichero saml20-sp-remote.php. A continuación se presenta un ejemplo:
<?php
/* The index of the array is the entity ID of this SP. */
$metadata[’https://sp.example.com/simplesaml/module.php/saml/sp/metadata.php/saml’] = array (
’AssertionConsumerService’ =>
’https://sp.example.com/simplesaml/module.php/saml/sp/saml2-acs.php/saml’,
’SingleLogoutService’ =>
’https://sp.example.com/simplesaml/module.php/saml/sp/saml2-logout.php/saml’,
’certData’ => ’MIICmTCCAgICCQDHTTCmM3WMCzANBgkqhkiG9w0BAQUFADCBkDELMAkGA1UEBhMCRVMxDjAMBg
NVBAgTBXNwYWluMRAwDgYDVQQHEwdzZXZpbGxlMQ0wCwYDVQQKEwR5YWNvMRcwFQYDVQQLEw5
zcC5leGFtcGxlLmNvbTEXMBUGA1UEAxMOc3AuZXhhbXBsZS5jb20xHjAcBgkqhkiG9w0BCQEW
D3NtYXJ0aW5AeWFjby5lczAeFw0xMTA0MjAwODU1MDBaFw0xNjA0MTgwODU1MDBaMIGQMQswCQ
YDVQQGEwJFUzEOMAwGA1UECBMFc3BhaW4xEDAOBgNVBAcTB3NldmlsbGUxDTALBgNVBAoTBHlh
Y28xFzAVBgNVBAsTDnNwLmV4YW1wbGUuY29tMRcwFQYDVQQDEw5zcC5leGFtcGxlLmNvbTEeM
BwGCSqGSIb3DQEJARYPc21hcnRpbkB5YWNvLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQK
BgQCnhEeto90m5agvGnarL8J/uXTOYoJF5XfMKhUNkB12g3geRFXd/w/xqAfktat0YM9of0f/
W1edLwVW72mZ8enl+jL3eEqwlUUz88GyC4h5t/inZ4WTW8jXc5WSNZYUXvk3F0uAO/PmKBEjFo
UrA8It3JnY9Nuu5f95DL6dRuLIBwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAHAirMjySJpFq4D
grB9Ax8t53uTbtVkXTb/haCwrWDuRywnMjgx7QhpN5RhL5UXPU1n617V2NROVNTH+2ROlhRyP
10.2. Implementación basada en simpleSAMLphp. “nodo bridge”
73
Curso para operadores de Proveedores de Identidad, 1.0
S8l2KpAuVpAI1vznIE14JD3C8giWY3BRm009fKqKH2sC2evQyZk/UDG26Db509bIvcpSA3aXFE
eug2M7gZeK’,
);
?>
10.2.5 Configuración parte SP
A diferencia del IdP en el SP los metadatos propios se configuran en el fichero config/authsources.php. Al
tratarse del “nodo bridge” esta definicion de metadatos del SP va a usarse como fuente de autenticación del “nodo
bridge”.:
<?php
$config = array(
’saml’ => array(
’saml:SP’,
’host’ => ’wayf.example.com’,
’entityID’ =>
’https://wayf.example.com/simplesaml/module.php/saml/sp/metadata.php/saml’,
’idp’ => NULL,
’certificate’ => ’wayf.example.com.crt’,
’privatekey’ => ’wayf.example.com.key’,
// All communications are encrypted and signed
’redirect.sign’ => TRUE,
’redirect.validate’ => TRUE,
’assertion.encryption’ => TRUE,
’OgnizationName’ => array (
’en’ => ’Example organization’,
’es’ => ’Organizacion de ejemplo’,
),
’OrganizationDisplayName’ => array (
’en’ => ’Example organization’,
’es’ => ’Organizacion de ejemplo’,
),
’OrganizationURL’ => array (
’en’ => ’http://wayf.example.com’,
’es’ => ’http://wayf.example.com’,
),
),
);
?>
Nota: Al no especificar IdP el simpleSAMLphp buscara entre los metadatos que tiene registrados en el directorio
metadata los de los IdPs. En este caso el “nodo bridge” realizará un servicio de descubrimiento de los IdPs definidos
en metadata/saml20-idp-remote.php
Para seleccionar el IdP al que conectarnos simpleSAMLphp nos mostrará una lista de IdPs o bien un combobox dependiendo del valor que configuremos en la variable ‘’idpdisco.layout’ => ‘dropdown’,’ del config/config.php.
Las opciones son ‘links’ para el listado o ‘dropdown’ para el combobox.
Es posible hacer que el “nodo bridge” recuerde el IdP que el usuario seleccionó para una posterior petición de login
con las variables del config/config.php:
10.2. Implementación basada en simpleSAMLphp. “nodo bridge”
74
Curso para operadores de Proveedores de Identidad, 1.0
’idpdisco.enableremember’ => TRUE,
’idpdisco.rememberchecked’ => TRUE,
// Para que recuerde la selección y no vuelva a preguntar
// Marcar por defecto que se guarde el IdP seleccionado.
Esta opción de recuerdo es útil siempre que sepamos que los usuarios sólo van a identificarse a través de un sólo IdP,
pero en el caso de que pueda hacerlo desde diferentes fuentes, se desaconseja el establecer “recordar el IdP utilizado”
ya que esa opción se guarda en la cookie y para que se deje de recordar, será necesario limpiar la cookie o bien acceder
al enlace poco accesible ya que se encuentra en la pestaña de federacion de simplesamlphp “Borrar mis opciones de
IdP en los servicios de descubrimiento de IdP”. “Borrar mis opciones de IdP en los servicios de descubrimiento de
IdP”
Personalización de la vista de descubrimiento
Si queremos personalizar la vista de descubrimiento deberemos acceder a la carpeta templates y modificar el
archivo selectidp-links.php o el selectidp-dropdown.php según tengamos configurada una u otra
opción. Realmente lo ideal no es sobreescribir estos archivos sino crear un tema (nuevo módulo de simplesamlphp
en el que se redefinen plantillas y se almacenan imagenes personalizadas). Para crear un módulo tema lo primero que
haremos será crear el módulo dentro de la carpeta modules y lo configuramos para que esté activo por defecto:
mkdir <nombre_modulo_tema>
touch <nombre_modulo_tema>/default-enable
Creamos el tema dentro del módulo en la carpeta themes:
mkdir -p <nombre_modulo_tema>/themes/<nombre_tema>
Creamos las carpeta que albergaran las templates por defecto del módulo
mkdir <nombre_modulo_tema>/themes/<nombre_tema>/default/
Y creamos las carpeta para los ficheros que se incluyen en el resto de ficheros de SSP como son el header.php y el
footer.php:
mkdir <nombre_modulo_tema>/themes/<nombre_tema>/default/includes/
Debemos crear también el directorio que alojare los recursos por defecto, donde copiaríamos por ejemplo la css:
mkdir <nombre_modulo_tema>/resources/<nombre_tema/
Si queremos modificar la plantilla para un módulo concreto tendríamos que crear su carpeta dentro del tema y alojar
ahi el fichero:
mkdir <nombre_modulo_tema>/themes/<nombre_tema>/<nombre_modulo_a_modificar/
cp modules/<nombre_modulo_a_modificar>/<fichero_a_modificar>
<nombre_modulo_tema>/themes/<nombre_tema>/<nombre_modulo_a_modificar/<fichero_a_modificar>
Es una buena práctica copiarnos las templates de que vayamos a modificar del base de simpleSAMLphp y usarlas
como plantillas:
cp templates/includes/header.php
modules/<nombre_modulo_tema>/themes/<nombre_tema>/default/includes/
cp templates/includes/footer.php
modules/<nombre_modulo_tema>/themes/<nombre_tema>/default/includes/
Y ya podríamos hacer una primera modificación, en el header.php modificaríamos:
<link rel="stylesheet" type="text/css"
href="/<?php echo $this->data[’baseurlpath’]; ?>resources/default.css" />
//por :
<link rel="stylesheet" type="text/css"
href="/<?php echo $this->data[’baseurlpath’]; ?>resources/<nombre_module_tema>/default.css" />
10.2. Implementación basada en simpleSAMLphp. “nodo bridge”
75
Curso para operadores de Proveedores de Identidad, 1.0
También es posible redefinir las vistas completamente alojando nuevos archivos en una carpeta www que alojemos en
nuestro tema.
Una vez terminado el modulo del tema, para que simpleSAMLphp lo use únicamente deberemos de registrarlo en el
archivo de configuración de simpleSAMLphp:
’theme.use’ => ’<nombre_modulo_tema>:<nombre_tema>’,
10.3 Migración del modelo de estrella al modelo Hub&Spoke.
Para migrar de un modelo en estrella a un modelo Hub & Spoke habría que:
Desplegar y configurar el nodo central, añadiendole el conjunto de metadatos de los IdPs y de los SPs que
existían en la federación
Añadir en cada IdP el metadato de la parte SP del nodo central
Añadir en cada SP el metadato de la parte IdP del nodo central.
Configurar el config/authsources.php del SP para que su IdP sea el entityID de la parte IdP del nodo central
en lugar de un valor NULL (el IdP estaría auto-descubriendo) o en lugar del entityID de un IdP con el que
previamente lo hubieramos conectado.
Generalmente en las federaciones para permitir conexiones unilaterales sin pasar por el nodo central se guardan en
cada SP los IdPs de la federación y en cada IdP los SPs de la federación
Pero hay que tener en cuenta que si un SP confía en el nodo central y un IdP confían en el nodo central,
automáticamente ese SP y ese IdP estarían bajo un marco de confianza sin necesidad de que el SP y el IdP añadieran
los metadatos del uno y del otro.
Se deja en mano de los operadores/responsables de cada uno de los IdPs y SPs si únicamente quieren añadir los
metadatos del nodo bridge (todas las transmisiones de datos tendrían que pasar por el nodo central) o los metadatos de
los restantes nodos (se permitirían transmisiones directas de un IdP a un SP sin pasar por el nodo central).
10.4 Tareas de mantenimiento.
El mantenimiento de un nodo hub & spoke no difiere del mantenimiento normal que pueda tener un IdP o un SP.
Básicamente habrá que:
Tener los metadatos actualizados de los IdP y SPs que tiene conectados.
Mantener vigente el certificado que utilice.
En una federación grande basada en el modelo Hub & Spoke es necesario disponer de una serie de elementos
comunes (servicio de descubrimiento, servicio de consentimiento, gestor de metadatos) que facilitarán la gestión y
el mantenimiento de la federación.
10.3. Migración del modelo de estrella al modelo Hub&Spoke.
76
CAPÍTULO
ELEVEN
ANEXO B. ASSERTION.ENCRYPTION,
REDIRECT.SIGN Y
REDIRECT.VALIDATE
Estos 3 parametros hacen referencia al cifrado, el firmado y la validación de las aserciones. Dependiendo donde
especifiquemos estos parámetros significarán una cosa u otra.
Si un elemento requiere que la aserción vaya firmada o cifrada no aceptará ninguna aserción que le llegue de un
elemento que no cumpla con esos requisitos.
Dependiendo de los archivos donde definamos esos valores significaran en simpleSAMLphp una determinada cosa.
Estos valores tendrán una traducción en los metadatos que del IdP y SP se exporten. Analicemoslo con detenimiento.
11.1 assertion.encryption
Este valor puede especificarse:
En el IdP en:
En el saml20-idp-hosted. TRUE para que las aserciones que envíe este IdP se cifren. Valor por defecto False
En el saml20-sp-remote. TRUE‘para que la aserción que se envíe a este SP se cifre. Valor por defecto ‘False.
Sobreescribe a lo definido en el saml20-idp-hosted..
En el SP en:
En el authsources. TRUE Si la aserción recibida en este SP proveniente de cualquier IdP debe de ir cifrada. Por
defecto False.
En el saml20-idp-remote. TRUE Si la aserción recibida por este IdP debería de estar cifrada. Por defecto False.
Sobreescribe a lo definido en el authources.
(Se hace uso en modules/saml/lib/IdP/SAML2.php encryptAssertion y modules/saml/lib/Message.php decryptAssertion)
11.2 redirect.sign
Se traduce en los metadatos por un WantAuthnRequestSigned
Este valor puede especificarse:
77
Curso para operadores de Proveedores de Identidad, 1.0
En el IdP en:
En el saml20-idp-hosted. TRUE si se quiere que la petición de autenticación, petición de logout y la respuesta
de logout enviadas por este IdP se cifren. Valor por defecto False
En el saml20-sp-remote. TRUE si se quiere que la la petición de autenticación, petición de logout y la respuesta
de logout que se envíen desde el IdP a este SP se cifren. Valor por defecto False. Sobreescribe a lo definido en
el saml20-idp-hosted..
En el SP en:
En el authsources. TRUE Si la petición de autenticación, petición de log out y respuesta de log out enviadas
desde este SP a cualquier IdP deben de estar firmadas. Por defecto False.
En el saml20-idp-remote. TRUE Si la petición de autenticación, petición de log out y respuesta de log out
enviadas a este IdP deben de estar firmadas. Por defecto False. Sobreescribe a lo definido en el authources.
(Se hace uso en modules/saml/lib/Message.php addRedirectSign , que hará que se incluya la firma . También se incluira
si especificamos sign.logout o sign.authnrequest)
11.3 redirect.validate
Este valor puede especificarse:
En el IdP en:
En el saml20-idp-hosted. TRUE si la petición de autenticación, petición de logout o la respuesta de logout
enviadas desde este IdP deben de ser validadas. Por defecto False
En el saml20-sp-remote. TRUE si la petición de autenticación, petición de logout o la respuesta de logout
recibidas de este SP deben de ser validadas. Por defecto False
En el SP en:
En el authsources. TRUE‘ si la petición de autenticación, petición de logout o la respuesta de logout recibidas
en este SP deben de ser validadaa. Por defecto False
En el saml20-idp-remote. TRUE si la petición de autenticación, petición de logout o la respuesta de logout
recibidas desde este IdP deben de ser validadas. Por defecto False. Sobreescribe a lo definido en el authources.
(Se hace uso en modules/saml/lib/Message.php validateMessage, tambien se validara si especificamos validate.logout
o validate.authnrequest)
Además de lo anterior en el IdP se hace uso de:
saml20.sign.response para firmar la respuesta. Puede definirse tanto en el saml20-idp-hosted como en los
saml20-sp-remote.
saml20.sign.assertion para firmar la aserción. Puede definirse tanto en el saml20-idp-hosted como en los
saml20-sp-remote.
(Se hace uso en modules/saml/lib/IdP/SAML2.php buildResponse, buildAssertion)
11.3. redirect.validate
78
Descargar