Page tree
Skip to end of metadata
Go to start of metadata

Conexión del IdP con repositorio de identidad LDAP

Para que el IdP pueda autenticar usuarios contra un repositorio LDAP hay que editar el archivo simpleSAMLphp/config/authsources.php (se proporciona el path relativo a la instalación del IdP de referencia).

Si has usado el instalador del IdP de referencia, seleccionando configurar LDAP, este archivo sólo contendrá los parámetros básicos de configuración del LDAP (no contiene otros específicos para autenticar contra otras "fuentes de autorización": bases de datos, .htaccess, ...), y tendrá un contenido  similar a éste:

<?php
$config = array(
	'admin' => array(
		0 => 'core:AdminPassword',
	) ,
	'default-sp' => array(
		0 => 'saml:SP',
		'entityID' => NULL,
		'idp' => NULL,
		'discoURL' => NULL,
	) ,
	'ldap_datasource' => array(
		0 => 'ldap:LDAP',
		'hostname' => 'ldap.example.org', //Inicializado
		'enable_tls' => false, //Inicializado
		'referrals' => true, //Inicializado
		'timeout' => 30,
		'debug' => false,
		'attributes' => NULL,
		'dnpattern' => , //Obligatorio cambiar
		'search.enable' => false, //Susceptible de cambio
		'search.base' => , //Susceptible de cambio
		'search.attributes' => array() , //Susceptible de cambio
		'search.username' => NULL, //Susceptible de cambio
		'search.password' => NULL, //Susceptible de cambio
		'priv.read' => false,
		'priv.username' => NULL,
		'priv.password' => NULL,
		'authority' => 'urn:mace:xxxxx.example.org', //Inicializado
	) ,
); ?>

Se puede observar que algunos de los atributos tienen un comentario al lado. Este comentario indica el tratamiento que debe hacerse tras seguir los pasos del instalador.

NOTA: para una explicación del significado de cada uno de los parámetros puedes acudir al archivo simpleSAMLphp/config-templates/authsources.php. Para una explicación detallada y ver ejemplos puedes acceder a la documentación específica de simpleSAMLphp para el módulo LDAP.

Explicamos estos parámetros a continuación:

  • dnpattern: el DN del usuario que se está autenticando en el LDAP, por ejemplo: 'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org'. El literal %username% se sustituye por el login o identificador usado por el usuario para autenticarse. En la mayoría de configuraciones bastaría con inicializar el dnpattern, pero si queremos aislar el IdP de cambios en la estructura de nuestro LDAP, es mejor autenticar a los usuarios haciendo un "doble bind", para ello necesitaremos:
    1.  un usuario "privilegiado" del LDAP que nos permita buscar DNs de usuarios normales (hay que crearlo en el LDAP)
    2.  inicializar más parámetros del authsources.php (los que tienen el comentario de "Susceptible de cambio").
  • search.enable: si lo ponemos a true desactivamos el uso de dnpattern y activamos la autenticación de usuarios mediante "doble bind"
  • search.base: base de búsqueda (DN) a partir del cual el usuario privilegiado busca al usuario que se está autenticando. Por ejemplo: 'search.base' => 'ou=people,dc=example,dc=org'
  • search.attributes: atributos que el usuario privilegiado va a usar para buscar al usuario que se está autenticando. Por ejemplo: 'search.attributes' => array('uid', 'mail'). En este caso el usuario privilegiado intentará localizar en el LDAP el DN de un usuario que haya metido su uid o su email en el formulario de autenticación
  • search.username: el DN del usuario privilegiado. Por ejemplo: 'search.username' => 'cn=usupriv,ou=management,dc=example,dc=org'. Este usuario privilegiado hay que crearlo (o usar uno que ya exista) y debe tener permisos para buscar usuarios debajo de  search.base
  • search.password: la contraseña del usuario privilegiado definido en search.username. Por ejemplo: 'search.password' => 'cl@vesecr3tís1ma'. En este sentido el uso del doble bind es más ineguro que el uso de dnpattern, pues nos obliga a meter una clave en claro en la configuración del IdP ...

El proceso de autenticación de un usuario local en el IdP mediante doble bind es el habitual:

  1. el usuario introduce sus credenciales en el formulario de autenticación. Por ejemplo su email = fulanico@rediris.es y su clave = X
  2. usupriv hace bind al LDAP con el DN = search.username*yclave = *search.password y lanza una búsqueda bajo search.base con filter="(|(uid=fulanico@rediris.es)(mail=fulanico@rediris.es))"
  3. si no encuentra un DN con ese filtro devuelve un fallo de autenticación
  4. si lo encuentra vuelve a hacer un bind al LDAP con ese DN y la clave X proporcionada en el paso 1
  5. si el bind tiene éxito lo usa para recuperar los atributos LDAP (perfil del usuario) y devuelve un OK
  6. si el bind no tiene éxito devuelve un fallo de autenticación

En el caso de que el LDAP limite la recuperación de atributos propios al usuario que se autentica, podemos hacer uso de tres parámetros del authsources.php:

  • priv.read: si lo ponemos a true, permite el uso de un usuario privilegiado (adicional o el mismo que se definió en search.username) para  recuperar los atributos del usuario autenticado
  • priv.username: el DN del usuario privilegiado que va a poder recuperar los atributos del usuario autenticado
  • priv.password: la contraseña del usuario privilegiado definido en priv.username

En cualquier momento un usuario puede probar su autenticación en el IdP instalado en el enlace: https://baseurlpath/module.php/core/authenticate.php (sustituye baseurlpath por la URL donde se ubique tu IdP).

A continuación mostramos un ejemplo de authsources.php con LDAP y usando doble bind:

<?php
$config = array(
	'admin' => array(
		0 => 'core:AdminPassword',
	) ,
	'default-sp' => array(
		0 => 'saml:SP',
		'entityID' => NULL,
		'idp' => NULL,
		'discoURL' => NULL,
	) ,
	'ldap_datasource' => array(
		0 => 'ldap:LDAP',
		'hostname' => 'ldap.example.org',
		'enable_tls' => false,
		'referrals' => true,
		'timeout' => 30,
		'debug' => false,
		'attributes' => NULL,

		// no se usa si search.enable = true (doble bind)

		'dnpattern' => 'uid=%username%,ou=people,dc=example,dc=org',

		// forzamos doble bind

		'search.enable' => true,

		// base de búsqueda de usuarios para el doble bind

		'search.base' => 'ou=people,dc=example,dc=org',

		// la búsqueda del doble bind se efectúa por uid o email

		'search.attributes' => array(
			'uid',
			'mail'
		) ,

		// DN y clave del usuario privilegiado que efectúa el primer bind para
		// buscar el DN del usuario que quiere autenticarse mediante el segundo bind

		'search.username' => 'cn=usupriv,ou=management,dc=example,dc=org',
		'search.password' => 'cl@ves3cretís1ma',

		// no lo necesitamos pues eel LDAP permite que un usuario recupere sus propios atributos

		'priv.read' => false,
		'priv.username' => NULL,
		'priv.password' => NULL,
		'authority' => 'example.org',
	) ,
); ?>




  • No labels