Академический Документы
Профессиональный Документы
Культура Документы
de Servicio
1.0
Sixto Martin
1. Introduccin 2
1.1. Que es federar/domesticar una aplicacin? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Autenticacin y autorizacin (AuthN & AuthZ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Arquitecturas de las federaciones de indentidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4. Tcnicas de federacin de aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
I
7.4. Aplicaciones Java (SpringSecurity OIOSAML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
7.5. Librerias para otros lenguajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
8. Referencias 72
8.1. Especificacin SAML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
8.2. Implementaciones de SAML SP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
8.3. Documentacin de inters sobre domesticaciones de aplicaciones . . . . . . . . . . . . . . . . . . 72
8.4. Gestin centralizada de metadatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
8.5. Otros conceptos avanzados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
II
Curso para operadores de Proveedores de Servicio, 1.0
Esta documentacin pertenece al curso para operadores de Proveedores de Servicio que se celebra en Sevilla el X de
X y en Granada el Y de Y de 2012.
NDICE GENERAL 1
CAPTULO
ONE
INTRODUCCIN
Federar/domesticar una aplicacin es una expresin coloquial que utilizamos para referirnos a la accin de integrar
una aplicacin en un entorno de federacin de identidades. Existen diferentes grados de fedderar una aplicacin, siendo
el de mayor grado aquel que consigue que una aplicacin posea:
Funcionalidad de SSO y SLO globales (con opcin de conservar logout local).
Que los usuarios se creen/actualicen/inhabiliten/eliminen en funcin de la informacin que llega de la asercin
SAML.
Que los permisos locales de la aplicacin se configuren segn los datos de la asercin SAML.
2
Curso para operadores de Proveedores de Servicio, 1.0
Existen varios modelos atendiendo a como se conectan cada uno de los elementos que forman una federacin de
identidades. Cada mdelo tiene sus ventajas y desventajas por lo que dependiendo del entorno y contexto optaremos
por uno u otro modelo.
Los SP se conectan a un nico nodo IdP cuyas fuentes de autenticacin (auth backends) son Ldaps, BDs, etc de
diferentes instituciones.
Si el IdP tiene soporte los SP podran comunicarse en los diferentes protocolos de autenticacin actualmente
existentes: SAML2, sHibboleth, OpenId, PAPI
Los proveedores de identidad delegaran la peticin del consentimiento en el nico nodo posible: el IdP central.
Cada SP est directamente conectado con el IdP (no habra descubrimiento de IdP) siendo necesario especificar
de alguna forma contra que backend de autenticacin actuar.
El SP podra pasarle un parmetro al IdP o ser el IdP directamente el que decidiera a donde ir dependiendo de
donde le llegue la peticin, del username del usuario, etc.
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 comunicacin puedan comunicarse haciendo
uso del nodo central que har de puente (bridging) y traduzca las aserciones de un protocolo a otro.
Los IdPs delegaran la peticin del consentimiento en el nodo central (aunque tambin puede haber un doble
consentimiento y requerirse el consentimiento tanto en el IdP como en el nodo central).
El descubrimiento se realizara en el nodo central. (Aunque existen federaciones con esta arquitectura que
realizan un wayf embebido en la aplicacin federada).
Ventajas del modelo Hub & Spoke
Desacople de los diferentes elementos, desacople tecnolgico (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 federacin: consentimiento, descubrimiento (wayf), filtros
de atributos, validacin de atributos, monitorizacin, estadsticas. Reduciendo costes y facilitando el
mantenimiento.
Posibilidad de inter-federacin. Conectando el nodo central con otro nodo central de otra federacin
conseguimos que los nodos de ambas federaciones queden conectados.
Esta federacin es posible cuando el software del SP y el software de la aplicacin que se quiere federar utilizan la
misma tecnologa y lenguaje. Desde la aplicacin que se quiere federar se har uso directo de las librerias del SP.
Se basa en que el software de la aplicacin a federar posea un webservice con una serie de funciones de acceso y
registro (login, provisin, logout). Desde el SP se va haciendo uso de este webservice.
Cuando el software del SP y el software de la aplicacin a federar son de diferentes lenguajes y no puede realizarse
una integracin nativa puede optarse por esta opcin.
Consiste en que el SP almacene en el memcache datos del usuario que son leidos con el mdulo Auth memCookie de
Apache que protege la aplicacin a federar.
Una solucin alternativa es no usar el mdulo de Apache y directamente leer en la aplicacin a federar los datos de
memcache.
Cuando el software del SP y el software de la aplicacin a federar son de diferentes lenguajes y no puede realizarse
una integracin nativa puede optarse por esta opcin.
Se basa en que el Apache proteja la aplicacin a federar con la autenticacin shibboleth (Shibboleth SP) habilitando
el mod_shib. El Apache le hara llegar los datos del usuario a la aplicacin que queremos federar. El Apache utilizara
las cabeceras HTTP para hacerle llegar los datos del usuario a la aplicacin que queremos federar.
TWO
DESCRIPCIN DE LA ARQUITECTURA
DESPLEGADA EN CONFA
La federacin Confa est desplegada con una arquitectura Hub & Spoke.
8
Curso para operadores de Proveedores de Servicio, 1.0
En Confa 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 harn nuevos desarrollos o se validaran nuevas versiones del software.
4. Se Conectar el IdP o el Servicio con el entorno de produccin. 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 produccin nicamente habr instancias de IdPs y SPS oficiales.
En el entorno de pre-produccin 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 prcticos dar de alta en un determinado entorno no es ms que registrar el correspondiente metadato de la
entidad en el gestor de metadatos de dicho entorno.
THREE
La gestin 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 federacin: la descripcin de las entidades, sus responsables y sobre todo las url donde ofrecen las
funcionalidades y las claves pblicas.
Dentro de los metadatos se incluyen 2 atributos opcionales que hay que tener muy en cuenta a la hora de realizar la
gestin de los metadatos:
validUntil: Indica en tiempo absoluto cuando caducan los metadatos
cacheDuration: Indica el mximo periodo de tiempo en el que las entidades deberan 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).
Tambin 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 gestin de los metadatos.
La arquitectura de agregacin permite actualizar los metadatos en el lado de la entidad que los va a consumir y debido
al simple modelo de confianza, los metadatos sern considerados vlidos siempre que estos sean descargados de una
fuente fiable (URL pre-acordada y los metadatos convenientemente firmados con una clave pblica del publicador)
En la arquitectura distribuida cada entidad es responsable de la gestin y publicacin de sus propios metadatos. Con
este modelo los metadatos de un determinado punto pueden ser obtenidos bajo demanda sin la necesidad de la descarga
peridica de una coleccin de gran tamao de metadatos. (Se realiza el descubrimiento dinmico de metadatos en
funcin de las necesidades). Es un modelo que puede acarrear problemas ya que se relaja el concepto de confianza.
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
federacin.
11
Curso para operadores de Proveedores de Servicio, 1.0
Los metadatos de la federacin son agregados peridicamente, almacenados y publicados como un archivo XML
convenientemente firmado.
El sistema deber de disponer de mecanismos para poder delegar las responsabilidades de gestin de un determinado
metadato al administrador de la entidad a la que describe.
En el fichero config/config se especifica con el parmetro metadata.sources donde simpleSAMLphp va a buscar los
ficheros que contienen las fuentes de los diferentes metadatos.
Si queremos que adems 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),
),
Adems 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.
3.2.2 Metarefresh
Para conectar un proveedor de identidad (IdP) o un proveedor de servicio (SP) a una federacin, es necesario especificar
los metadatos de las fuentes en las que se confa. En muchas federaciones es normal configurar una distribucin
automatizada de los metadatos utilizando el formato de metadatos XML SAML 2.0. Generalmente una administracin
o autoridad central proporciona una URL con un documento SAML 2.0 que incluye los metadatos de todas las
entidades de la federacin.
Mediante el mdulo metarefresh de simpleSAMLphp es posible obtener los metadatos remotos de una URL y
almacenarlos en un archivo.
El mdulo metarefresh existe en la instalacin bsica de simpleSAMLphp por lo que nicamente tendremos que
habilitarlo:
touch <ruta hasta simplesamlphp>/simplesamlphp/modules/metarefresh/enable
Puesto que el mdulo utiliza wget para realizar las descargas de los metadatos deberemos tener este software instalado
en la mquina:
yum install wget
El mdulo tiene un archivo de configuracin 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 sera el siguiente:
<?php
$config = array(
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 intrprete de PHP). En el caso de mquinas con RedHat? o Centos este usuario se llama apache, en el
caso de mquinas 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 mdulo sanitycheck para lo cual simplemente
copiamos a la carpeta config de simpleSAMLphp la plantilla config-sanitycheck.php y configuramos los
cron_tag que queramos.
*/
$config = array (
key => secret,
allowed_tags => array(daily, hourly, frequent),
debug_message => TRUE,
sendemail => TRUE,
);
?>
Alternativamente, se puede desactivar el envo 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 mdulos.
En nuestro caso, metarefresh lo hace con hourly.
Estas tags no son ms 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 peridicamente los metadatos, hay que colocar un fichero crontab en /etc/cron.d con una lnea para cada
tag definida. En nuestro caso, necesitamos una lnea 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"
Por ltimo, es necesario configurar simpleSAMLphp para que, adems de utilizar los ficheros de metadatos generales
(los ficheros de metadata/), utilice tambin los que Metarefresh dejar en el directorio metadata/federation/. Para ello
hay que editar el fichero config/config.php, concretamente la opcin metadata.sources, para aadirle nuestra nueva
fuente de metadatos:
metadata.sources => array(
array(type => flatfile),
array(type => flatfile, directory => metadata/federation),
),
En simpleSAMLphp existe un mdulo 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).
3.3.1 Instalacin
JANUS no es ms que un mdulo de simpleSAMLphp. En una federacin 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 desplegara en una nueva instancia.
Al servicio Janus lo protegeremos con una fuente de autenticacin local en la que habilitemos los diferentes
administradores que van a gestionar los metadatos. Lo ideal sera 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 travs 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 cdigo 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.
Configuracin de Apache
<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>
Adems es necesario crear los certificados (autogenerados) que se han especificado en la configuracion del VirtualHost
para https. Se debern 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
Por ltimo, es necesario reiniciar el servicio httpd para que la nueva configuracin sea aplicada
service httpd restart
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
Y editaremos el archivo convenientemente con la configuracin que ms nos interese. A continuacin vamos a ir
detallando los diferentes parmetros y el valor que recomendamos darles.
Configuracin de datos del administrador:
// Nombre del administrador de Janus
admin.name => JANUS admin,
Configuracin de cron:
/* Habilita un cron que se ejecutar y refrescar los metadatos de cada una de
las entidades */
metadata_refresh_cron_tags => array(janus),
/* 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,
Configuracin de uso:
// Lo habitual en una federacin 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,
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.shib13-
sp
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
Configuracin de ARPs:
/* Cuando asociamos una ARP a un SP, se aadiran 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 tomarn esos atributos definidos en el ARP
para filtrar los atributos que se liberan desde el IdP */
/* Permite configurar una lista con los atributos que conformarn 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,
),
/* Este atributo define un conjunto de opciones por defecto con el que se publicarn
los metadatos de las entidades */
mdexport.default_options => array(
entitiesDescriptorName => Federation, // Nombre del set de entidades
mime => application/xml, // Formato de salida
// Este feed publica bajo firma todas los proveedores de identidad del tipo SAML 2.0
/* 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, /* Permite habilitar listas blancas o negras a que IdPs se les
entity.usewhitelist => false, ESTA o NO ESTA permitido conectar con un SP */
Existe una wiki en la web de Janus donde viene ms informacin sobre documentacin de cada uno de estos atributos.
Importante. El cron que vamos a asociar al Janus para que automticamente actualice los metadatos de
las entidades haciendo uso de la URL donde dichos metadatos estn publicados por la entidad (atributo
metadata_refresh_cron_tags del archivo de configuracin Janus) debe de estr dado de alta como tag vlido en el
module_cron.php. Adems tenemos que crear una entrada en el servicio de cron para que se ejecute con la periocidad
que deseemos.
3.3.2 Funcionamiento
A continuacin se describen las principales vistas del software Janus. Tambin puede consultar una serie de videos en
la web de Janus para entender su funcionamiento.
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 opcin que la de borrarlo en el caso de que tengamos dudas sobre la cuenta.
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.
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 configuracin de Janus).
Adems 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 configuracin de
janus, en el atributo mdexport.feeds
Edicin de ARPs
En esta vista podremos administrar las diferentes ARPs de Janus. Por cada ARP se le asigna un nombre, una
descripcin y el conjunto de atributos que la componen. Adems 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, adems de editarla se nos mostrar el conjunto de entidades que la estn
utilizando en ese momento.
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.
Desde esta vista podremos comprobar los metadatos que se estn publicando de una determinada entidad. Se muestran
varios formatos: XML, flatfile
3.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 trs la verificacin 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.
3.4. PEER 26
CAPTULO
FOUR
PROTOCOLO DE RESOLUCIN DE
INCIDENCIAS EN UN ENTORNO DE
FEDERACIN DE IDENTIDADES
Si el problema se ocasiona en el nodo Hub y se debe a que los atributos necesarios no estn 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 excepcin y entre
otras cosas el sistema no sabe qu IdP debe indicarle para solucionar el problema. En este caso se enva un correo a
los operadores de la federacin con los atributos del usuario de los que se dispone. Los operadores examinan estos
atributos para ver si es posible averiguar el IdP de orgen de dicho usuario para informar a su administrador. Si el
27
Curso para operadores de Proveedores de Servicio, 1.0
usuario est utilizando la direccin de correo institucional, la tarea de obtener su IdP de orgen suele ser fcil. 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 direccin de correo.
4.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 enva al operador de la federacin en el caso de que
se produzca en el nodo hub (y si est bien configurado el IdP tambin debe llegar al administrador del proveedor de
identidad).
FIVE
DESPLEGAR UN SP CON
SIMPLESAMLPHP
Vamos a explicar como instalar SimpleSAMLphp en una distribucin CentOS 6.3, la cual est disponible para su
descarga desde http://isoredirect.centos.org/centos/6/isos/x86_64/
Una vez se encuentre el sistema operativo instalado, se debe proceder a la instalacin de las dependencias de
simpleSAMLphp:
yum install php pcre httpd zlib openssl mod_ssl php-mbstring php-mcrypt php-pdo
Es posible comprobar que los mdulos se encuentra activos creando un fichero index.php en el directorio de
publicacin de Apache2 con el siguiente cdigo:
<?php phpinfo(); ?>
Una vez resueltas todas las dependencias, la instalacin de SimpleSAMLphp es realmente sencilla, solamente es
necesario descargar el cdigo fuente en un directorio del sistema, por ejemplo en el directorio /var/www/sp/
yum install subversion
mkdir /var/www/sp
svn co http://simplesamlphp.googlecode.com/svn/branches/simplesamlphp-1.10 simplesamlphp /var/www/sp/
29
Curso para operadores de Proveedores de Servicio, 1.0
Estructura general
|--cert Directorio donde alojar el certificado y la clave que sern usados para firmar
|--config Directorio con los ficheros de configuracin de simpleSAMLphp
|--config-templates Directorio con plantillas de los ficheros de configuracin
|--metadata Directorio donde alojar ficheros con los metadatos de los IdPs remotos en los
|--metadata-templates Directorio con plantillas de los ficheros de metadatos
|--modules Directorio con los diferentes mdulos de simpleSAMLphp
|--lib Directorio con las librerias de simpleSAMLphp
|--www Directorio con la lgica web de simpleSAMLphp
|--templates Directorio con las plantillas web de simpleSAMLphp
|--dictionaries Directorio con las traducciones de simpleSAMLphp
|--docs Directorio con dcd ocumentacin
|--log Directorio donde alojar los logs de simpleSAMLphp (Requiere configurar el conf
|--attributemap Directorio con ficheros con lgica para realizar el mapeo de atributos
|--schemas Directorio con esquemas xsd.
|--bin Directorio con herramientas de scripts
Hay que asegurarse que el servidor Apache tenga acceso de escritura a los directorios logs y metadata.
Configuracin general
Los ficheros de configuracin 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 configuracin 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 configuracin correspondiente desde cero, lo cul suele ser
mucho ms propenso a errores.
El primer fichero a modificar es el fichero config.php. Por tanto, lo mejor es copiar su plantilla correspondiente
cp /var/www/sp/simplesamlphp/config-templates/config.php /var/www/sp/simplesamlphp/config/config.php
Como todos los ficheros de configuracin de simpleSAMLphp es un fichero PHP con las reglas de sintxis 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/sp/simplesamlphp/config/config.php
# No syntax errors detected in /var/www/sp/simplesamlphp/config/config.php
A continuacin se detallan las partes ms habituales del fichero config.php que hay que modificar:
Contrasea de administracin de simpleSAMLphp
auth.adminpassword => admin,
Es importante cambiar esta contrasea porque adems de ser un problema de seguridad si se deja tal cual,
simpleSAMLphp lo detectar y dar un error.
Sal aleatoria y secreta:
secretsalt => defaultsecretsalt,
Zona horaria:
timezone => NULL,
Configuracin como SP
$config = array(
saml => array(
saml:SP,
host => sp.example.com,
entityID => https://sp.example.com/simplesaml/module.php/saml/sp/metadata.php/saml,
idp => https://idp.example.com/simplesaml/saml2/idp/metadata.php,
certificate => sp.example.com.crt,
privatekey => sp.example.com.key,
),
);
?>
entityId Identificador de identidad. Debe corresponderse con la URL que obtiene los metadatos de este SP
idp El IdP que debe utilizar este SP para autenticarse. Debe aparecer el entityId de un nodo IdP (o WAYF).
certificate y privatekey Son las dos partes (pblica y privada) del certificado usado en el SP. Estos ficheros deben
encontrarse en el directorio cert del directorio raz de simpleSAMLphp a no ser que se haya cambiado esa
ubicacin en el fichero config.php
redirect.sign TRUE Si la peticin de autenticacin, peticin de log out y respuesta de log out enviadas desde este SP
a cualquier IdP deben de estar firmadas. Por defecto False.
redirect.validate TRUE si la peticin de autenticacin, peticin de logout o la respuesta de logout recibidas en este
SP deben de ser validadas. Por defecto False
assertion.encryption Este parmetro deben estar a TRUE si obligamos a que las aserciones recibidas en este SP
provenientes de cualquier IdP esten cifradas. Por defecto False.
Los metadatos de los IdPs en los que el SP va a confiar deben de definirse dentro de la carpeta metadata en el fichero
saml20-idp-remote.php. A continuacin se presenta un ejemplo
<?php
$metadata[https://idp.example.com/simplesaml/saml2/idp/metadata.php] = array (
metadata-set => saml20-idp-remote,
entityid => https://idp.example.com/simplesaml/saml2/idp/metadata.php,
SingleSignOnService => https://idp.example.com/simplesaml/saml2/idp/SSOService.php,
SingleLogoutService => https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php,
certData => MIICQTCCAaoCCQCOMxLGB244ZzANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQ
pc3RlbWFzMRgwFgYDVQQDEw9pZHAuZXhhbXBsZS5jb20wHhcNMTEwNDE4MDg1NDQ2WhcNMTYwNDE2MD
YDVQQHEwdTZXZpbGxhMRYwFAYDVQQKEw1ZYWNvIFNpc3RlbWFzMRgwFgYDVQQDEw9pZHAuZXhhbXBsZ
zoSgahBggvVPhmKROi0ajlAfVQ1YPwjpDstkK19Dhi99diw+ipJ6q44AEanpc8x/h0f1r2FJfBlF1HY
XbFtvbyngJTvZt91AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAYdYYFxKibC32nm4E9RZCVk74Xcx6Lah
s9zXNPgyweSujcP54IVBH0qBSFJCmPdZc+0uasi4KClwOMjVIq3WpVvycA/sHl7kH1jYTtNea8rr1vS
NameIDFormat => urn:oasis:names:tc:SAML:2.0:nameid-format:transient,
OrganizationName =>
array (
en => Example organization,
es => Organizacion de ejemplo,
),
OrganizationDisplayName =>
array (
en => Example organization,
es => Organizacion de ejemplo,
),
OrganizationURL =>
array (
en => http://idp.example.com,
es => http://idp.example.com,
),
);
?>
.. _sp_configuracion_apache:
<VirtualHost *:443>
ServerName sp.example.com
DocumentRoot /var/demo-federation/sp/simplesamlphp/www
Alias /simplesaml /var/demo-federation/sp/simplesamlphp/www
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/sp.example.com/crt/sp.example.com.crt
SSLCertificateKeyFile /etc/httpd/ssl/sp.example.com/key/sp.example.com.key
</VirtualHost>
Adems es necesario crear los certificados (autogenerados) que se han especificado en la configuracion del VirtualHost
para https. Se debern seguir las siguientes instrucciones:
1. Crear el directorio donde alojar los certificados, en este caso, /etc/httpd/ssl/sp.example.com/
mkdir -p /etc/httpd/ssl/sp.example.com/crt /etc/httpd/ssl/sp.example.com/key
En este punto ya es posible realizar una prueba de autenticacin con alguno de los IdP registrados en los metadatos
de este SP. Para ello hay que ir a la pestaa Autenticacin de la interfaz web de simpleSAMLphp y pinchar
en el enlace Probar las fuentes para la autentificacin ya configuradas. Despus hay que
seleccionar el nombre de la fuente en la que se ha configurado el SP. En el ejemplo anterior sera saml.
Si todo funciona correctamente, debera aparecer un listado de IdPs y tras seleccionar uno de ellos y autenticarse
correctamente en l debera aparecer una pantalla con el los atributos que este IdP ha enviado de vuelta al SP.
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 parmetros:
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 nmero del ndice del array
(los nmeros ms bajos se ejeutan antes).
Existe documentacin detallada sobre los filtros de atributos implementados en simpleSAMLphp.
Generacin de atributos
10 => array(
Comprobacin de atributos
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;
}
}
}
,
),
Eliminacin de atributos
Fitro limitador de atributos (slo 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,
),
$scope_university = "university.es";
$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:personalUniqueID:es
$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";
}
,
),
AttributeValueFilter
El filtro AttributeValueFilter elimina determinados valores de los atributos basndose en patrones definidos.
Parmetros:
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 <> patrn 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.sp => array(
60 => array(
class => attributevaluefilter:AttributeValueFilter,
attributename => schacUserStatus,
spmapping => $sps_patterns,
),
),
);
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 ms funcionalidad que los nodos perifricos (consentimiento, descubrimiento, validacin,
estadsticas, monitorizacin, gestin de metadatos) si que requerir de un poco ms de planificacin para ponerlo en
alta disponibilidad.
En los IdPs y SPs lo nico que es importante compartir entre los nodos de SimpleSAMLPHP es la sesin de los
usuarios. En este sentido es muy cmodo 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 habra que configurar que
el manejador de sesiones de simpleSAMLphp sea del tipo database.
Y por ultimo nos quedara 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 continuacin explicamos como se configurara.
En SimpleSAMLPHP la configuracin de los servidores Memcached se realiza por grupos. Cada elemento de
informacin se almacena en todos los grupos por motivos de redundancia. Cada grupo est compuesto por varios
servidores Memcached pero cada elemento de informacin se almacena en uno slo de ellos. En este caso el tener
varios servidores se hace para conseguir un mayor rendimiento.
Lo ms importante de todo es que SimpleSAMLPHP se encarga de gestionar todo esto de forma automtica. Lo nico
que hay que decirle es las direcciones de los servidores Memcached.
Instalacin de memcached
Y configuramos el servicio:
vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="512" # 512MB
OPTIONS=""
Cada grupo de servidores es un array de servidores. Cada servidor es un array con las siguientes claves:
hostname. Nombre del servidor o direccin IP del servidor Memcache. Es la nica opcin obligatoria.
port. Nmero 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 sesin.
timeout. Tiempo que se espera a que el servidor responda. Por defecto es 3 segundos.
Con esta configuracin se podran perder los tres servidores del grupo 1, 2 3 sin que se perdiera ninguno dato de
sesin. Si se pierden los tres servidores etiquetados como A, B o C entonces s habra perdida de informacin.
SIX
DOMESTICACIN DE APLICACIONES
CON SIMPLESAMLPHP
En el apartado anterior hemos visto como Desplegar un SP con SimpleSAMLphp En este apartado veremos como se
federara una aplicacin php haciendo uso de esa instancia SP.
Bsicamente la aplicacin php a la que llamaremos a partir de ahora aplicacin local cargar las libreras de la API
de simpleSAMLphp para iniciar el proceso de login, obtener los atributos del usuario, cerrar sesin, etc.
Existe documentacin sobre como utilizar la librera de simpleSAMLphp desde una aplicacin php
En resumen las funciones a utilizar son:
Inicializacin de la instancia de simpleSAMLphp
$as = new SimpleSAML_Auth_Simple(default-sp);
Desloguear al usuario
$as->logout();
A la hora de domesticar una aplicacin lo podemos hacer con mayor o menor profundidad.
41
Curso para operadores de Proveedores de Servicio, 1.0
La domesticacin bsica consistira en aadir soporte a la aplicacin local para permitir autenticar usuarios que ya
existieran en la aplicacin local a travs de un IdP haciendo uso del protocolo SAML, con lo que se conseguira a la
vez la funcionalidad del SSO.
Adicionalmente al SSO podra implementarse o no la funcionalidad de SLO (Single Log Out) que podra a su vez
cohabitar o no con el logout local de la aplicacin (Ojo con la usabilidad).
La domesticacin media consistira en aadir soporte de SSO y de provisin automtica del usuario. Se
implementara la lgica necesaria para que con los datos que llegan en la asercin SAML fuera posible
crear/modificar/desactivar/eliminar una cuenta de usuario.
En este escenario adems de autenticacin y provisionamiento se implementa toda la lgica necesaria para que la
autorizacin en la aplicacin a domesticar dependa de los atributos que le llegan de la asercin SAML. Aqu entrara
todo el tema de manejo de roles, permisos y grupos.
<?php
$saml_lib_path = /var/www/sp/simplesamlphp/lib/_autoload.php;
require_once($saml_lib_path);
$aplication_base_url = https://sp.cursosaml.org/example-php/;
?>
Definimos donde se encuentra el archivo que carga las libreras de simpleSAMLphp Cargamos la librera Definimos
la url base de nuestra aplicacin Definimos la fuente de autenticacin SAML que queremos utilizar y que tenemos
definida en el config/authsources.php del SP simpleSAMLphp.
<html>
<head>
<title>Aplicacin PHP de ejemplo federada usando simpleSAMLphp</title>
<link href="resources/css/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
<?php
require_once(config.php);
if(!$as->isAuthenticated()) {
echo <p><a class="btn" href="login.php">Login</a></p>;
}
else {
echo <h4>Atributos del usuario:</h4>;
$attributes = $as->getAttributes();
if(empty($attributes)) {
echo No se obtuvieron atributos del usuario;
}
else {
echo <table class="table table-bordered table-striped">;
?>
</body>
</html>
En esta vista si el usuario no se ha autenticado an, le ofrecemos el enlace para hacerlo, a la vista login.php. En caso
de que ya se haya autenticado, le mostramos sus atributos si se ha recibido alguno y le damos opcin a que cierre la
sesin.
En el cdigo vemos que primero cargamos el fichero de configuracin para disponer de las variables alli definidas.
Luego instanciamos la clase de la fuente simpleSAMLphp pasandole como parmetro la fuente que queremos. Luego
comprobamos si el usuario est o no autenticado con la funcin isAuthenticated() y en caso de que lo est
obtenemos sus datos con la funcin getAttributes().
<?php
require_once(config.php);
$login_params = array(
ReturnTo => $aplication_base_url . index.php,
);
$as->requireAuth($login_params);
?>
En esta vista la novedad es que redirigimos al usuario para que inicie el login en el IdP, y le pasamos como parametro
(ReturnTo) la url de la vista principal para que una vez autenticado el usuario se le redirija a ella.
<?php
require_once(config.php);
En esta vista se comprueba si el usuario est autenticado en el sistema y si lo est se le fuerza a desloguear en el IdP.
Al final redirijimos al usuario a la vista principal ya sea porque no estuviera identificado que se ejecutara el header
Location, o si lo est porque le pasamos una url a la que redirigir como parametro del logout.
Lo ltimo que hay que hacer es servir la aplicacin en el apache, lo haremos bajo HTTPs por lo que lo meteremos en
el mismo virtualhost donde tengamos desplegado el simpleSAMLphp:
Alias /example-php /var/www/apps/example_php
Y reiniciar el apache:
service httpd restart
Identificar las funciones para el manejo de login/logout y de cuenta de usuario. Existe una API documentada?
Est la aplicacin preparada para trabajar sin la necesidad de que un usuario no posea password?
Analizar el Workflow de creacin de una cuenta de usuario. Tambin el de acceso del usuario y el termino de la
sesin.
Posee panel de administracin para poder configurar parametros va web? Posee fichero de configuracin?
Existe una API de autenticacin? Existn plugins de autenticacin o toda la lgica de autenticacin se realiza
en un mismo fichero?
Ver como maneja las sesiones
Analizar la vista de login y ver como integrar la autenticacin SAML
Tiki Wiki es un software open source que es tiene un batiburrillo de aplicaciones: Wiki/CMS/Groupware/Forum/etc.
Analisis pre-federacin:
Existe panel de administracin.
Posee el concepto de plugin de autenticacin aunque no hay ninguna clase base definida.
Existe una clase usuario que se encuentra en el fichero lib/userslib.php. En dicha clase se definen las
funciones de autenticacin.
Existe una plantilla para el formulario de login templates/modules/mod-login_box.tpl y hay un
fichero que se carga al inicio que puede ser utilizado para forzar el login SAML tiki-setup_base.php
Para habilitar el panel para introducir los parmetros SAML identificamos los ficheros necesarios:
lib/prefs/auth.php En el que creamos un nuevo tipo de autenticacin
lib/prefs/ssp.php En el que definimos los parmetros que hay que configurar
En este commit se puede apreciar los cambios que fueron necesarios realizar para dar soporte SAML a dicha
aplicacin:
https://github.com/pitbulk/tiki-saml/commit/01df62e2613b4a7f2e4ea83b721f5043bfa0c447
Owncloud es un software que surgio para cubrir la necesidad del alojamiento y transferencia de ficheros pero que
ahora es mucho ms: Reproductor/Visualizador/Gestor de calendario/etc.
Analisis pre-federacin:
Existe panel de administracin.
Posee el concepto de plugin de autenticacin y en general, cada componente (lo llaman app) que se integra
lo hace en forma de plugin. Adems cada app debe de cumplir una estructura. Y todas las aplicaciones se
encuentran en la carpeta apps. No hay una clase base de autenticacin.
Posee una clase base de usuario que puede ser extendida
Al igual que en el caso de Tiki Wiki, las funciones relacionadas con la autenticacin forman parte de la
Posee una serie de hooks que fueron utilizados para aadir el soporte SAML
Analisis pre-federacin:
Existe panel de administracin.
Posee el concepto de plugin de autenticacin, existe una clase base definida lib/authlib.php. Todos los plugin de
autenticacin se encuentran en la carpeta auth
No existe clase base de usuario pero si varias funciones para manejarlos en lib/moodlelib.php
El fichero que renderiza la vista de login no permite interaccin desde el plugin de autenticacin
Permite multiples maneras de almacenar sesiones (fichero, base de datos, etc). Posee su propia librera para
manejar las sesiones lib/sessionlib.php
Plugin disponible en: https://forja.rediris.es/svn/confia/moodle/trunk/v2.2.3/auth/saml/
En el la aplicacin ejemplo example-php que mostramos anteriormente podemos ver que no existe una sesin local en
la que se guarde si el usuario est logado o no, sino que unicamente se trabaja con la sesin SAML.
En el mundo real, las aplicaciones que vayamos a domesticar dispondrn de su propia sesin local en la que se
guarde entre otras cosas, la informacin del usuario, informacin de acceso, etc. Tendremos que prevenir que la sesin
local y la sesin SAML no entren en conflicto y que la carga de libreras o las llamadas a funciones de la aplicacin
local o de la aplicacin SAML no provocan efectos colaterales en las sesiones.
La forma rpida de prevenir posibles colisiones con las sesiones es la de hacer que el tipo de almacenamiento de las
sesin local y de la sesin SAML sea siempre diferente. Esto se consigue configurando diferentes manejadores de
sesin. Existe files (por defecto), sqlite, memcached pero tambin es posible definir tu propio manejador.
El tipo de manejador que se utiliza en la aplicacin local puede definirse en el propio cdigo de la aplicacin con
la funcin session_set_save_handler pero si no se define se utilizar el que venga declarado en el php.ini en el valor
session.save_handler http://www.php.net/manual/en/session.configuration.php#ini.session.save-handler.
En simpleSAMLphp el tipo de manejador de sesiones que va a ser utilizado depende del valor del parmetro
store.type del archivo de configuracin config.php. Los valores posibles son sql, memcache o phpsession (lo
que estuviera definido en el php.ini).
La otra alternativa es estudiar muy bien el cdigo de la aplicacin local, ver que cdigo hace falta aadir para
implementar el soporte SAML, encontrar los puntos de conflicto y tratar de eliminarlos por ejemplo cambiando el
orden en el que se cargan y llaman las libreras de uno y otro (siempre que esto no afecte a la lgica inicial y el
resultado vaya a ser el mismo)
Si en el ejemplo anterior modificamos un poco el index.php para que simule la carga de librerias locales de la aplicacin
que provoquen conflictos con las sesiones de simpleSAMLphp.
<html>
<head>
<title>Aplicacin PHP de ejemplo federada usando simpleSAMLphp con problemas con las sesiones</title>
<link href="resources/css/bootstrap.min.css" rel="stylesheet" media="screen">
</head>
<body>
<?php
require_once(config.php);
echo <h3>Aplicacin PHP de ejemplo federada usando simpleSAMLphp con problemas con las sesiones</h
if(!$as->isAuthenticated()) {
echo <p><a class="btn" href="login.php">Login</a></p>;
}
else {
echo <h4>Atributos del usuario:</h4>;
$attributes = $as->getAttributes();
if(empty($attributes)) {
echo No se obtuvieron atributos del usuario;
}
else {
echo <table class="table table-bordered table-striped">;
?>
</body>
</html>
<?php
function broke_session() {
// initialize session
session_start();
?>
Y reiniciar el apache:
service httpd restart
Si accedemos a la aplicacin, veremos que la federacin deja de funcionar debido a un conflicto con las sesiones
Otro problema relacionado con las sesiones ocurre cuando no tenemos acceso desde la aplicacin final a la sesin
del simpleSAMLphp por estar est relacionada con un dominio diferente, y por tanto inalcanzable. En el archivo
/config/config.php hay varios parametros importantes relacionados con la sesin que hay que tener en consideracin:
session.cookie.name => SimpleSAMLSessionID, # Nombre para la cookie de sesin
session.cookie.path => /, # Sirve para limitar las cookies para un subdirector
session.cookie.domain => , # Para especificar un dominio concreto para la sesi
session.cookie.secure => FALSE, # TRUE si el usuario nicamente va a acceder va HTT
enable.http_post => FALSE, # Activado, permite evitar que el navegador muestre
# pero el IdP deber ser accesible tanto va HTTP c
session.phpsession.cookiename => null,
session.phpsession.savepath => null,
session.phpsession.httponly => FALSE,
Si tras la domesticacin, la autenticacin SAML es la nica que queremos dejar habilitada para nuestros usuarios,
Que pasa si la federacin falla o si hemos configurado mal los parametros?.
Es siempre recomendable dejar una autenticacin alternativa para los usuarios administradores.
Cuando un usuario accede por primera vez a una plataforma haciendo uso de la autenticacin SAML, a la hora de
crear la cuenta no disponemos del password de dicho usuario y por tanto no puede almacenarse un valor vlido en
la aplicacin local, por tanto ese usuario, a menos que exista la funcionalidad de resetear contrasea o que en el
proceso de registro automtico se le pida una clave, no podr acceder a la aplicacin a travs de las autenticaciones
tradicionales de user/pass (base de datos, ldap, fichero de claves, AuthBasic) que hubiera habilitadas en la aplicacin.
Es importante que si tenemos habilitadas en una aplicacin diferentes fuentes de autenticacin con la capacidad de
crear automaticamente cuentas, todas ellas devuelvan el mismo valor para el identificador de usuario que se utiliza en
la aplicacin a domesticar. De lo contrario se estaran creando varias cuentas para el mismo usuario.
Cuando habilitamos en un sitema multiples fuentes de datos, para evitar conflictos, es muy importante unificar el
espacio de nombres, compatibilizar los valores, priorizar las fuentes de datos, etc
Si tenemos habilitadas en una aplicacin diferentes fuentes de autenticacin con la capacidad de crear/modificar
automaticamente cuentas de usuario podemos encontrarnos con conflictos graves como el que se describe a
continuacin:
Imaginemos que permitimos el acceso a nuestra aplicacin a travs de Gmail y que tenemos la cuenta de
de la aplicacin a travs del email. Si en el IdP tenemos almacenado otro valor para el atributo emai
provisionamiento automatico el valor del email se actualizara y dejaramos de poder acceder a la apl
O nos podemos encontrar en que fuentes menos fiables sobreescriban en la aplicacin final valores que una fuente ms
fiable haba registrado.
SEVEN
DOMESTICACIN DE APLICACIONES
EN OTROS LENGUAJES DIFERENTES
A PHP
Cuando el lenguaje de la aplicacin que queremos federar no es php no podemos realizar una federacin nativa con
simpleSAMLphp (SP en php).
La solucin pasa por:
Recurrir a diferentes mecanismos de federacin como la basada en webservice, la basada en el REMOTE_USER
o en la basada en authmemcookie)
Utilizar un SP implementado en el lenguaje nativo de la aplicacin: python (pySAML2), en java (OIOSAML,
SprintSecurity), etc.
7.1 SimpleSAMLphp+AuthMemCookie
Cuando el software del SP y el software de la aplicacin a federar son de diferentes lenguajes y no puede realizarse
una integracin nativa puede optarse por est situacin.
Consiste en que el SP almacene en el memcache datos del usuario que son leidos en el mdulo Auth memCookie de
Apache que protege la aplicacin a federar.
Existe una documentacin sobre configuracin de autenticacin basada en authmemcookie disponible en simple-
SAMLphp
En Debian existe el paquete libapache2-mod-auth-memcookie por lo que es muy fcil instalar el mdulo
authmemcookie.
En CentOS no existe paquete y hay que compilar varias librerias obsoletas, que suelen dar problemas segn
las versiones. En lugar del mod_authmemcookie recomendamos hacer uso de mod_perl y de la libreria
Apache::Auth::AuthMemCookie que dan el mismo rendimiento.
A continuacin vamos a explicar como se desplegara y configurara este modulo mod_perl, el Apache y el
simpleSAMLphp para que todo funcione:
Instalamos las librerias necesarias desde el repositorio:
yum install libevent memcached php-pecl-memcache python-memcached
yum install mod_perl perl-CPAN
50
Curso para operadores de Proveedores de Servicio, 1.0
E instalamos el modulo:
install Apache::Auth::AuthMemCookie
Lo siguiente que hay que hacer es habilitar en simpleSAMLphp el uso de AuthMemCookie, para ello lo primero es
editar el archivo de configuracin global de simpleSAMLphp config/config.php:
enable.authmemcookie => true,
$config = array(
loginmethod => authsource,
authsource => authmemcookie,
cookiename => AuthMemCookie,
username => eduPersonPrincipalName,
groups => NULL,
memcache.host => 127.0.0.1,
memcache.port => 11211,
);
Con ello ya podramos crear nuestra aplicacin a federar que leyera los datos de las cabeceras que le enva el servidor
Apache
A continuacin vamos a ensear 2 ejemplos de aplicaciones federadas haciendo uso de sta tcnica.
Las alojaremos en una carpeta contenedora en /var/www/apps/authmemcookie/
7.1. SimpleSAMLphp+AuthMemCookie 51
Curso para operadores de Proveedores de Servicio, 1.0
7.1.1 Ejemplo de como federar una aplicacin PHP con esta tcnica
include_once("lib.php");
$attributes = get_attributes_from_apache();
if(empty($attributes)) {
echo No se obtuvieron atributos del usuario;
}
else {
echo <table class="table table-bordered table-striped">;
?>
</table>
7.1. SimpleSAMLphp+AuthMemCookie 52
Curso para operadores de Proveedores de Servicio, 1.0
<p>
<a class="btn" href="https://sp.cursosaml.org/simplesaml/module.php/core/as_logout.php?AuthId=authm
</p>
</body></html>
[lib.php]
<?php
function get_attributes_from_apache() {
$attributes = array();
if(isset($_SERVER[HTTP_ATTR_UID]))
$attributes[uid] = $_SERVER[HTTP_ATTR_UID];
if(isset($_SERVER[HTTP_ATTR_EDUPERSONPRINCIPALNAME]))
$attributes[eduPersonPrincipalName] = $_SERVER[HTTP_ATTR_EDUPERSONPRINCIPALNAME];
if(isset($_SERVER[HTTP_ATTR_EDUPERSONAFFILIATION]))
$attributes[eduPersonAffiliation] = $_SERVER[HTTP_ATTR_EDUPERSONAFFILIATION];
if(isset($_SERVER[HTTP_ATTR_MAIL]))
$attributes[mail] = $_SERVER[HTTP_ATTR_MAIL];
if(isset($_SERVER[HTTP_ATTR_SN]))
$attributes[sn] = $_SERVER[HTTP_ATTR_SN];
if(isset($_SERVER[HTTP_ATTR_CN]))
$attributes[cn] = $_SERVER[HTTP_ATTR_CN];
if(isset($_SERVER[HTTP_ATTR_PREFERREDLANGUAGE]))
$attributes[preferredLanguage] = $_SERVER[HTTP_ATTR_PREFERREDLANGUAGE];
if(isset($_SERVER[HTTP_ATTR_OBJECTCLASS]))
$attributes[objectClass] = $_SERVER[HTTP_ATTR_OBJECTCLASS];
if(isset($_SERVER[HTTP_ATTR_GROUPS]))
$attributes[groups] = $_SERVER[HTTP_ATTR_GROUPS];
return $attributes;
}
?>
Por ltimo configuramos el apache para que proteja dicha aplicacin y enve los datos del usuario en la cabecera:
perlModule Apache::Auth::AuthMemCookie
PerlAuthenHandler Apache::Auth::AuthMemCookie::authen_handler
PerlSetVar AuthMemCookie "AuthMemCookie"
PerlSetVar AuthMemServers "127.0.0.1:11211"
# if you want to debug set to 1
PerlSetVar AuthMemDebug 0
# use headers instead of ENV vars
PerlSetVar AuthMemAttrsInHeaders 1
7.1. SimpleSAMLphp+AuthMemCookie 53
Curso para operadores de Proveedores de Servicio, 1.0
<Directory /var/www/apps/authmemcookie/example_php>
AuthType Cookie
AuthName "Auth Memcookie - PHP"
Require valid-user
ErrorDocument 401 "/simplesaml/authmemcookie.php"
</Directory>
Nota: Si habilitamos esta proteccin y no tenemos el servidor memcached corriendo, al tratar de acceder al recurso
entraremos en un blucle de redirecciones infinito.
Y reiniciamos el apache
service httpd restart
Si tuvieramos la instancia de simpleSAMLphp en una mquina y quisieramos federar un software php que est en otra
mquina, podramos hacerlo haciendo uso de Authmemcookie.
Lo que haramos es configurar un servidor de memcached (accesible desde la otra mquina) en la mquina que tuviera
el simpleSAMLphp.
Se crea un archivo php que est protegido por el apache y cuyo contenido sea redirigir a la aplicacin que tenemos en
la otra mquina.
En otra mquina, en la aplicacin php a federar lo que deberemos de hacer es leer los datos del usuario del servidor
memcache, conociendo el cookiename y el sessionID. De no existir reenviaramos a la anterior vista protegida.
7.1.2 Ejemplo de como federar una aplicacin Python con esta tcnica
Lo primero es crear el proyecto django que llamaremos example_django y que incluiremos dentro de
/var/www/apps/authmemcookie:
django-admin.py startproject example_django
Nota: Si an no disponemos del entorno para trabajar con python/django ver como desplegar el entorno
Configuramos el proyecto demo en /var/www/apps/authmemcookie/example_django/example_django/settings.p
from os import path # Aadimos esto en la cabecera del fichero
BASEDIR = path.dirname(path.abspath(__file__))
DATABASES = {
default: {
ENGINE: django.db.backends.sqlite3, # Add postgresql_psycopg2, postgresql, mysql,
NAME: /var/www/apps/authmemcookie/example_django/example_django/example_django.sql3, # O
USER: , # Not used with sqlite3.
PASSWORD: , # Not used with sqlite3.
HOST: , # Set to empty string for localhost. Not used with sqlite3.
PORT: , # Set to empty string for default. Not used with sqlite3.
}
}
7.1. SimpleSAMLphp+AuthMemCookie 54
Curso para operadores de Proveedores de Servicio, 1.0
TEMPLATE_DIRS = (
path.join(BASEDIR, templates),
)
Creamos el fichero que contendr la vista en la que mostremos los atributos que hemos obtenido del servidor Apache
www/apps/authmemcookie/example_django/example_django/views.py:
import string
def echo_attributes(request,
template=echo_attributes.html):
"""Example view that echo the attributes of an user server
by Apache (AuthMemCookie)"""
def parse_attributes(request):
attributes = {}
attributes[uid] = request.META.get(HTTP_ATTR_UID, )
attributes[eduPersonPrincipalName] = request.META.get(HTTP_ATTR_EDUPERSONPRINCIPALNAME, )
attributes[eduPersonAffiliation] = request.META.get(HTTP_ATTR_EDUPERSONAFFILIATION, )
attributes[mail] = request.META.get(HTTP_ATTR_MAIL, )
attributes[sn] = request.META.get(HTTP_ATTR_SN, )
attributes[cn] = request.META.get(HTTP_ATTR_CN, )
attributes[preferredLanguage] = request.META.get(HTTP_ATTR_PREFERREDLANGUAGE, )
attributes[objectClass] = request.META.get(HTTP_ATTR_OBJECTCLASS, )
attributes[groups] = request.META.get(HTTP_ATTR_GROUPS, )
return attributes
7.1. SimpleSAMLphp+AuthMemCookie 55
Curso para operadores de Proveedores de Servicio, 1.0
Ahora aadimos la siguiente entrada en el apache, como la queremos servir por HTTPs lo colocamos en el mismo
Virtualhost que ya utilizamos anteriormente para servir el simpleSAMLphp
WSGIScriptAlias /example-authmemcookie-django /var/www/apps/authmemcookie/example_django/example_djan
Y tenemos que colocar fuera del virtualhost la siguiente instruccin para que se utilice el PythonPath adecuado:
WSGIPythonPath /var/www/apps/authmemcookie/example_django
Y reiniciamos el apache
service httpd restart
Cuando el software del SP y el software de la aplicacin a federar son de diferentes lenguajes y no puede realizarse
una integracin nativa puede optarse por est opcin.
Se basa en que el Apache proteja la aplicacin a federar con la autenticacin shibboleth (Shibboleth SP) habilitando
el mod_shib. El Apache le hara llegar los datos del usuario a la aplicacin que queremos federar. El Apache utilizara
las cabeceras HTTP para hacerle llegar los datos del usuario a la aplicacin que queremos federar.
Existe una documentacin sobre instalacin y configuracin de autenticacin shibboleth basada en RemoteUser.
Lo primero que hace falta es instalar shibboleth y sus dependencias por lo que tenemos que aadir el repositorio al
yum.
cd /etc/yum.repos.d
wget http://download.opensuse.org/repositories/security://shibboleth/CentOS_CentOS-6/security:shibbol
yum update
yum install shibboleth
Lo siguiente que haremos sera descargarnos los metadatos del IdP en el que los shibboleth SP van a confiar.
wget --no-check-certificate https://idp.cursosaml.org/simplesaml/saml2/idp/metadata.php -O /etc/shibb
Lo siguiente que hay que hacer es editar el archivo de configuracin de shibboleth, shibboleth2.xml en el que
se configuran parmetros globales pero tambin los parmetros de cada SP que se quiera desplegar. Veamos ahora los
parmetros globales, y luego explcaremos como configurar cada uno de los SPs en los apartados posteriores.
Entityid
<ApplicationDefaults entityID="https://shib.cursosaml.org/Shibboleth.sso/Metadata"
REMOTE_USER="uid persistent-id targeted-id"
authType="TLS" id="default">
<Logout>SAML2 Local</Logout>
Vista de estado:
<Handler type="Status" Location="/Status" />
Nota: En entornos de produccin deberemos de aadirle un acl=127.0.0.1 si queremos que slo se pueda consultar
el estado desde la mquina local
Contacto:
<Errors supportContact="root@cursosaml.org"
helpLocation="/about.html"
styleSheet="/shibboleth-sp/main.css"/>
</Protocols>
Lo siguiente que hay que hacer es configuar el mapper de atributos de simpleSAMLphp a shibboleth, editamos el
archivo /etc/shiboleth/attribute-map.xml:
<Attribute name="uid" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" id="uid"/>
<Attribute name="cn" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" id="cn"/>
<Attribute name="sn" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" id="sn"/>
<Attribute name="mail" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" id="mail"/>
<Attribute name="eduPersonPrincipalName" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basi
<Attribute name="eduPersonAffiliation" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
<Attribute name="displayName" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" id="disp
<Attribute name="givenName" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" id="givenN
<Attribute name="schacSn1" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" id="schacSn
<Attribute name="schacSn2" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" id="schacSn
<Attribute name="irisMailMainAddress" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
<Attribute name="schacUserStatus" nameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" id="
Cuando lo tengamos todo listo habra que iniciar el demonio de shibboleth y aadirlo para que se inicie en el arranque.
service shibd start
chkconfig shibd on
Reiniciamos el server:
service httpd start
7.2.1 Ejemplo de como federar una aplicacin PHP con esta tcnica
include_once("lib.php");
$attributes = get_attributes_from_remote_user();
if(empty($attributes)) {
echo No se obtuvieron atributos del usuario;
}
else {
echo <table class="table table-bordered table-striped">;
?>
</table>
</body></html>
[lib.php]
<?php
function get_attributes_from_remote_user() {
$attributes = array();
if(isset($_SERVER[uid])) {
$attributes[uid] = $_SERVER[uid];
}
if(isset($_SERVER[eduPersonPrincipalName])) {
$attributes[eduPersonPrincipalName] = $_SERVER[eduPersonPrincipalName];
}
if(isset($_SERVER[eduPersonAffiliation])) {
$attributes[eduPersonAffiliation] = $_SERVER[eduPersonAffiliation];
}
if(isset($_SERVER[mail])) {
$attributes[mail] = $_SERVER[mail];
}
if(isset($_SERVER[sn])) {
$attributes[sn] = $_SERVER[sn];
}
if(isset($_SERVER[cn])) {
$attributes[cn] = $_SERVER[cn];
}
if(isset($_SERVER[preferredLanguage])) {
$attributes[preferredLanguage] = $_SERVER[preferredLanguage];
}
if(isset($_SERVER[objectClass])) {
$attributes[objectClass] = $_SERVER[objectClass];
}
if(isset($_SERVER[groups])) {
$attributes[groups] = $_SERVER[groups];
}
return $attributes;
}
Por ltimo configuramos el apache para que proteja dicha aplicacin y enve los datos del usuario en la cabecera:
Alias /php /var/www/apps/shibboleth/example_php
<Location /php>
AuthType shibboleth
ShibRequestSetting applicationId default
ShibRequestSetting requireSession 1
require valid-user
</Location>
Y lo reiniciamos:
service httpd restart
7.2.2 Ejemplo de como federar una aplicacin Python/Django con esta tcnica
Lo primero es crear el proyecto django que llamaremos example_django_shib y que incluiremos dentro de
/var/www/apps/shibboleth:
django-admin.py startproject example_django_shib
Nota: Si an no disponemos del entorno para trabajar con python/django ver como desplegar el entorno
Configuramos el proyecto demo en /var/www/apps/authmemcookie/example_django/example_django_shib/setti
from os import path # Aadimos esto en la cabecera del fichero
BASEDIR = path.dirname(path.abspath(__file__))
DATABASES = {
default: {
ENGINE: django.db.backends.sqlite3, # Add postgresql_psycopg2, postgresql, mysql,
NAME: /var/www/apps/shibboleth/example_django/example_django_shib/example_django_shib.sql3
USER: , # Not used with sqlite3.
PASSWORD: , # Not used with sqlite3.
HOST: , # Set to empty string for localhost. Not used with sqlite3.
PORT: , # Set to empty string for default. Not used with sqlite3.
}
}
TEMPLATE_DIRS = (
path.join(BASEDIR, templates),
)
Creamos el fichero que contendr la vista en la que mostremos los atributos que hemos obtenido del servidor Apache
www/apps/shibboleth/example_django_shib/example_django_shib/views.py:
import string
def echo_attributes(request,
template=echo_attributes.html):
"""Example view that echo the attributes of an user server
by Apache (Shibboleth)"""
def parse_attributes(request):
attributes = {}
attributes[uid] = request.META.get(uid, )
attributes[eduPersonPrincipalName] = request.META.get(eduPersonPrincipalName, )
attributes[eduPersonAffiliation] = request.META.get(eduPersonAffiliation, )
attributes[mail] = request.META.get(mail, )
attributes[sn] = request.META.get(sn, )
attributes[cn] = request.META.get(cn, )
attributes[preferredLanguage] = request.META.get(preferredLanguage, )
attributes[objectClass] = request.META.get(objectClass, )
attributes[groups] = request.META.get(groups, )
return attributes
urlpatterns = patterns(
(r^$, example_django_shib.views.echo_attributes), # Vista basica de prueba.
)
Ahora aadimos la siguiente entrada en el apache, como la queremos servir por HTTPs lo colocamos en el mismo
Virtualhost que ya utilizamos anteriormente para servir el simpleSAMLphp
WSGIScriptAlias /django /var/www/apps/shibboleth/example_django_shib/example_django_shib/wsgi.py
Y tenemos que colocar fuera del virtualhost la siguiente instruccin para que se utilice el PythonPath adecuado:
WSGIPythonPath /var/www/apps/shibboleth/example_django_shib
7.3.1 El entorno
Imaginemos que queremos desplegar una aplicacin django en el sistema a la que queremos aadir soporte SAML.
Lo primero que haremos ser comprobar que disponemos en el sistema de python. Posteriormente instalamos una
utilidad que facilita la instalacin de paquetes de python
yum install python-setuptools
Instalamos el modulo mod_wsgi para desplegar la aplicacin django con el servidor apache
yum install mod_wsgi
Y la libreria djangosaml2
easy_install djangosaml2
DATABASES = {
default: {
ENGINE: django.db.backends.sqlite3, # Add postgresql_psycopg2, postgresql, mysql,
NAME: /var/www/apps/django_saml2_demo/django_saml2_demo/djangosaml2demo.sql3, # Or path
USER: , # Not used with sqlite3.
PASSWORD: , # Not used with sqlite3.
HOST: , # Set to empty string for localhost. Not used with sqlite3.
PORT: , # Set to empty string for default. Not used with sqlite3.
}
}
TEMPLATE_LOADERS = (
django.template.loaders.filesystem.Loader,
django.template.loaders.app_directories.Loader,
django.template.loaders.eggs.Loader, # Debe de estar descomentado!
)
TEMPLATE_DIRS = (
path.join(BASEDIR, templates),
)
AUTHENTICATION_BACKENDS = (
django.contrib.auth.backends.ModelBackend,
djangosaml2.backends.Saml2Backend,
)
INSTALLED_APPS = (
django.contrib.auth,
django.contrib.contenttypes,
django.contrib.sessions,
django.contrib.sites,
django.contrib.messages,
django.contrib.staticfiles,
djangosaml2, # Insertamos esta aplicacion
)
# ...
(r^saml2/, include(djangosaml2.urls)),
# ...
)
BASEDIR = path.dirname(path.abspath(__file__))
SAML_DJANGO_USER_MAIN_ATTRIBUTE = username
SAML_CREATE_UNKNOWN_USER = True
SAML_ATTRIBUTE_MAPPING = {
uid: (username, ),
mail: (email, ),
cn: (first_name, ),
sn: (last_name, ),
}
SAML_CONFIG = {
# full path to the xmlsec1 binary programm
xmlsec_binary: /usr/bin/xmlsec1,
# your entity id, usually your subdomain plus the url to the metadata view
entityid: https://sp.cursosaml.org/example-django/saml2/metadata/,
# directory with attribute mapping
attribute_map_dir: path.join(BASEDIR, saml2/attributemaps),
email_address: admin@confia.es,
contact_type: technical},
],
# you can set multilanguage information here
organization: {
name: [(CONFIA, es)],
display_name: [(CONFIA, es)],
url: [(http://www.confia.aupa.info, es)],
},
valid_for: 24, # how long is our metadata valid
}
Ahora aadimos la siguiente entrada en el apache, como la queremos servir por HTTPs lo colocamos en el mismo
Virtualhost que ya utilizamos anteriormente para servir el simpleSAMLphp
WSGIScriptAlias /django-example /var/www/apps/django_saml2_demo/django_saml2_demo/wsgi.py
Y tenemos que colocar fuera del virtualhost la siguiente instruccin para que se utilice el PythonPath adecuado:
WSGIPythonPath /var/www/apps/django_saml2_demo/
Y reiniciamos el apache
service httpd restart
4. Y aadimos a la variable PATH la ruta donde se encuentre el bin de java, por ejemplo: /usr/lib/jvm/java/bin
export PATH=$PATH:/usr/lib/jvm/java/bin
Nota: Estas variables conviene definirlas para que se carguen siempre al arrancar la maquina (pueden definirse en el
/etc/enviroment)
JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.9.x86_64/jre
JAVA_OPTS="-Xmx768m -XX:PermSize=256m -XX:MaxPermSize=512m"
M2_HOME=/usr/local/apache-maven
M2=/usr/local/apache-maven/bin
MAVEN_OPTS="-Xms256m -Xmx512m"
PATH=/usr/local/bin:/bin:/root/bin:/usr/bin:/usr/local/apache-maven/bin:/usr/lib/jvm/java-1.7.0-openj
Vamos a analizar el ejemplo de federacin usando SpringSecutiry. Para ello descargamos el repositorio git la extensin
SAML de Spring Security
yum install git
cd /var/www/apps/
git clone https://github.com/SpringSource/spring-security-saml.git
Pero cambiamos el valor del java.io.File del SP por sp.xml y guardamos el xml con los metadatos en
/var/www/apps/spring-security-saml/saml2-sample/src/main/resources/security/sp.xml
Y configurar el bean del IdP:
<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
<constructor-arg>
<bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider">
<constructor-arg>
<value type="java.io.File">classpath:security/idp.xml</value>
</constructor-arg>
<property name="parserPool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
</bean>
</constructor-arg>
</bean>
<!-- OPTIONAL used when one of the metadata files contains information about this service provider --
<property name="hostedSPName" value="springsecurity"/>
<!-- OPTIONAL property: can tell the system which IDP should be used for authenticating user by defau
<property name="defaultIDP" value="https://idp.cursosaml.org/simplesaml/saml2/idp/metadata.php"/>
Redespliegue la aplicacin para que los cambios tengan efecto ejecutando en /opt/federation-demo/aplications/spring-
security-saml/saml2-sample:
cd /var/www/apps/spring-security-saml/saml2-sample
mvn tomcat:redeploy
7.4.3 OIOSAML.JAVA
OIOSAML.JAVA es otra libreria que podemos utilizar para aadir soporte SAML a nuestras aplicaciones Java.
Podemos descargarnos la ultima versin en este enlace http://digitaliser.dk/resource/2298008/artefact/oiosaml.java-
9918.zip
Est basada en OpenSAML2.0. En el siguiente enlace encontrareis toda la informacin de como instalarlo y
configurarlo
LASSO Java SP
OIOSAML.NET
ComponentSpace SAML (Comercial)
ASP.NET SAML COmponent (Comercial)
En Nordunet
saml2ruby
saml-sp
OmniAuth SAML
Onelogin ruby-saml (Comercial)
Lasso C SP
OpenSAML
EIGHT
REFERENCIAS
SimpleSAMLphp SP API
Authmemcookie + simpleSAMLphp
mod_perl + simpleSAMLphp
72
Curso para operadores de Proveedores de Servicio, 1.0
Filtros en simpleSAMLphp
NINE
Una federacin de identidades es un grupo o conjunto de entidades que comparten la tcnologa, estandares y casos
de uso que permiten transmitir informacin de identidad de un usuario de manera segura facilitando la autenticacin y
autorizacin entre diferentes dominios.
En una federacin de identidades se establece un crculo de confianza que permite que un usuario autenticado en un
organismo de la federacin acceda a recursos de otro organismo de la misma federacin. La idetificacin se realiza en
los Proveedores de Identidad (abrev. ingl. IdP). El Proveedor de Servicio (abrev. ingl. SP) al que accede el usuario
confa en los datos del usuario que le son suministrados por el IdP y en funcin de los mismos autoriza al usuario a
hacer uso de los recursos.
En una federacin de identidades los servicios perciben al usuario como una entidad homogenea y no como un conjunto
de porciones de informacin sin relacin entre ellas. Se denomina identificador opaco al identificador nico que
mantiene la privacidad del usuario y que representa la asociacin entre la cuenta del usuario en un Proveedor de
Servicio y la que posee en el Proveedor de Identidad.
74
Curso para operadores de Proveedores de Servicio, 1.0
Decidir y gestionar la integracin de los miembros (tanto proveedores de identidad como de servicio) a la
federacin.
Gestionar las polticas de liberacin de atributos (ARPs) y velar porque ests 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 cesin de datos para servicio que
accede el usuario.
Velar por el correcto funcionamiento de la federacin.
Gestionar la interoperabilidad con otras federaciones formando confederaciones de identidades.
No europeas:
En Australia tienen la AFF
En USA tienen la InCommon Federation
En Brasil tienen la federacin CAFe
En Canada tienen la federacin CAF-CANARIE
En China tienen federacin CARSI
En Japn tienen la federacin GakuNin
IdP Proveedor de Identidad. Organizacin que provee la autenticacin 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 institucin registrado en la federacin que provee acceso al usuario
final a algn servicio y recurso basandose en una serie de atributos que satisfacen sus requerimientos de autorizacin.
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.
9.5.1 SAML
Security Assertion Markup Language. Est basado en XML y es un estandar abierto para el intercambio de informacin
de autorizacin y autenticacin entre dominios de forma segura. Fue creado por la empresa OASIS
Bsicamente define como debe de hacerse de forma segura la trnsmisin 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
9.5.2 PAPI
PAPI es un sistema de SSO desarrollado por RedIRIS desde el ao 2001. Permite desplegar una infraestructura de
autenticacin y autorizacin y un sistema de Single Sign-On fcilmente.
Los componentes principales del sistema son: El servidor de autenticacin (AS) y los puntos de acceso (PoA).
Un PoA se encarga de interceptar los accesos a recursos o servicios forzando la auntenticacin del usuario en un
AS (cada PoA puede estar conectado a uno o varios AS),La autenticacin se produce contra alguno de los backends
configurados en el AS (Ldap, BD, etc) y tras producirse se genera una asercin 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 relacin de confianza con ellos y suya a su vez con el AS.
Si el PoA no puede integrarse con la aplicacin 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 asercin es transmitida
mediante el mtodo POST de HTTP desde un proveedor de autenticacin hasta los proveedores de servicio, solo que
dicha asercin no es SAML (ni siquiera XML).
Puede obtener ms informacin sobre el protocolo en la wiki del proyecto PAPI
9.5.3 OpenID
OpenID es un sistema de identificacin digital descentralizado, con el que un usuario puede identificarse en una
aplicacin web a travs de una URL (o un XRI en la versin 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.
TEN
Dentro del abanico de software que implemetan federaciones de identidades nos centraremos en aquellas que
implementan el estandar SAML2 y son software libre.
10.1 Shibboleth
10.1.1 IdP
10.1.2 SP
Funciona en Apache, IIS y NSAPI. Entornos que pueden ser utilizados detras de un proxy en Java y otros
servidores web.
Puede funcionar automticamente o bajo demanda.
Permite proteger el mismo los recursos o delegar en las aplicaciones para que manejen la autorizacin.
(Clusterizable)
82
Curso para operadores de Proveedores de Servicio, 1.0
10.1.3 Ventajas
10.1.4 Desventajas
Sus archivos de configuracin son de gran tamao y a veces es fcil perderse en ellos.
La implementacin del SLO global no est soportada de forma oficial.
10.2 simpleSAMLphp
10.2.1 Ventajas
10.2.2 Desventajas
10.3 PySAML2
pySAML2 es una librera desarrollada en python que implementa IdPs y SPs basados en protocolo SAML2.
Existe una librera llamada djangosaml2 que hace uso de la librera pySAML2 y sirve para federar fcilmente
aplicaciones desarrolladas con el framework django.
10.2. simpleSAMLphp 83
Curso para operadores de Proveedores de Servicio, 1.0
10.3.1 Ventajas
10.3.2 Desventajas
OpenSSO es un producto Java de federacin de identidad que desde el 2010 se conoce con el nombre de OpenAM y
est soportado por la empresa ForgeRock.
10.5 Lasso
Lasso es una librera C que implementa los estandars de la Liberty Alliance. Utiliza SWIG para que se pueda usar la
libreria desde python, perl, java y .net en multiples plataformas. Soporta tanto funcionalidad de SP como de IdP.
No existe una solucin ideal genrica. Dependiendo del tipo de integracin que se haya elegido utilizaremos un
software u otro.
Lo que si recomendamos es que en la medida de lo posible el software elegido para los diferentes componentes que
formen la federacin de sistemas sea lo ms homogeneo posible para facilitar el mantenimiento. Hay que evaluar
siempre que se vaya a integrar una aplicacin en la federacin de sistemas si el ahorro de esfuerzo de federar una
aplicacin con un determinado software diferente al utilizado en la federacin luego no va a conllevar un coste elevado
de mantenimiento.
Por lo general nosotros recomendamos que la infraestructura de la federacin se realice basandose en el software
simpleSAMLphp debido a que es muy flexible, dispone de todos los componentes que podremos necesitar, tiene una
gran comunidad detrs que lo soporta y est escrito en php por lo que podremos realizar una integracin de lenguaje
nativo para la gran variedad de aplicaciones escritas en php. Y utilizar authmemcookie para domesticar aplicaciones
desarrolladas en otros lenguajes.
ELEVEN
Junto con la documentacin se va a facilitar una mquina virtual con las aplicaciones de ejemplo federadas que se han
ido explicando durante el curso.
11.1 Descarga
11.2.2 HOSTS
85
Curso para operadores de Proveedores de Servicio, 1.0
11.2.3 CREDENCIALES
Se ha utilizado la misma contrasera para acceder a la mquina como root y en general para cada uno de los
componentes: cursosaml
Para acceder al phpldapadmin hay que usar el usuario: cn=admin,dc=ldap,dc=cursosaml,dc=org
Recordar que para crear usuarios en el IdP podemos hacerlo desde la interfaz del phpldapadmin o desde el modulo
gestor de cuentas del IdP
Documentacion: /var/www/docs
Configuracin servidor Apache: /etc/httpd/conf.d/cursosaml.conf
Proveedor de identidad: /var/www/idp/simpleSAMLphp
PHPldapadmin: /etc/phpldapadmin/
Openldap: /etc/openldap
Proveedor de servicio:
SimpleSAMLphp /var/www/sp/simplesamlphp
Shibboleth /etc/shibboleth
Aplicaciones de ejemplo:
Nativas:
php: /var/www/apps/example_php
python/django: /var/www/apps/django_saml2_demo
java: /var/www/apps/spring-security-saml
Authmemcookie: /var/www/apps/authmemcookie
Shibboleth: /var/www/apps/shibboleth
11.4 URLS
11.4.1 Documentacin
http://docs.cursosaml.org
SimpleSAMLphp: https://idp.cursosaml.org/simplesaml
phpLdapAdmin: https://idp.cursosaml.org/phpldapadmin/
Mdulo gestor de cuentas: https://idp.cursosaml.org/simplesaml/module.php/userregistration/index.php
SimpleSAMLphp: https://sp.cursosaml.org/simplesaml
Shibboleth: https://shib.cursosaml.org/Shibboleth.sso/Status
Nativas:
Con SpringSecurity: http://sp.cursosaml.org:8080/spring-security-saml2-sample/
Con Pysaml2/Django: https://sp.cursosaml.org/example-django
Con simpleSAMLphp:
https://sp.cursosaml.org/example-php
https://sp.cursosaml.org/example-php-session-fail
Authmemcookie:
https://sp.cursosaml.org/example-authmemcookie
PHP: https://sp.cursosaml.org/example-authmemcookie-php
Python/Django: https://sp.cursosaml.org/example-authmemcookie-django
Shibboleth:
https://shib.cursosaml.org/
PHP: https://shib.cursosaml.org/php
Python/Django: https://shib.cursosaml.org/django
11.4. URLS 87