Configuración LDAP
From LimeSurvey Manual
Generales
Debe habilitar la compatibilidad con LDAP en config.php y configurar los parámetros de LDAP en config/ldap.php para poder utilizar esta función.
Habilitando LDAP en config.php
- $enableLdap: si desea utilizar funciones LDAP en LimeSurvey, debe configurar este parámetro en verdadero (está configurado en falso de forma predeterminada):
'config'=>array( 'debug'=>0, 'debugsql'=>0, 'enableLdap'=>true, )
Definición de servidores LDAP
Primero defina las opciones de conexión del servidor LDAP en "application/config/ldap.php". Para cada servidor, están disponibles las siguientes opciones:
- $serverId: Un número entero que identifica este servidor LDAP. Se utiliza en definiciones de consultas para vincular un servidor a una consulta específica;
- $ldap_server [ $ID del servidor] [ 'servidor']: La dirección IP o el nombre DNS del servidor LDAP. Si utiliza conexiones seguras SSL (LDAP o LDAP+Start-TLS), este nombre debe corresponder al Certificado CN del servidor (o SubjectAlternativeName);
- $ldap_server [ $ID del servidor] [ 'protoversion']: Puede ser 'ldapv2' o 'ldapv3' dependiendo del protocolo admitido por su servidor. 'ldapv3' es el protocolo preferido. Sin embargo, si desea utilizar conexiones cifradas, tenga en cuenta que LDAP se admite en el modo 'ldapv2', mientras que Start-TLS es el método de cifrado para 'ldapv3';
- $ldap_server [ $ID del servidor] [ 'encrypt']: Define el método de cifrado utilizado. 'ldaps' es compatible con servidores 'ldav2', 'start-tls' para servidores 'ldapv3'. La palabra clave 'none' se utiliza para comunicaciones LDAP de texto sin cifrar;
- No olvide que para el cifrado 'ldaps' o 'start-tls', el servidor web debe poder verificar el certificado del servidor LDAP. Por lo tanto, necesita definir su autoridad de certificación en su biblioteca openldap (generalmente esto se hace en el archivo /etc/openldap/ldap.conf en Linux).
- $ldap_server [ $ID del servidor] [ 'referrals']: Es un parámetro booleano que define si se deben seguir o no las referencias (use false para ActiveDirectory);
- $ldap_server [ $ID del servidor] [ 'codificación']: Es un parámetro opcional que proporciona la codificación utilizada por el directorio LDAP para almacenar cadenas. Por lo general, no es necesario configurar este parámetro ya que la codificación predeterminada asumida, 'utf-8', es la codificación estándar para los directorios LDAP. Sin embargo, si está utilizando Active Directory y tiene problemas para importar cadenas acentuadas, intente configurar este parámetro con la codificación utilizada en su área (por ejemplo, 'cp850' para Europa occidental). Puede consultar la lista desplegable "Conjunto de caracteres del archivo" en la GUI Importar token desde un archivo CSV para obtener la lista completa de codificaciones admitidas.
A continuación, debe definir qué autenticación se necesita para obtener acceso al directorio. Si se permite el acceso 'anónimo', NO configure los dos parámetros siguientes; de lo contrario, configúrelos en consecuencia:
- $ldap_server [ $ID del servidor] [ 'binddn']: DN del usuario 'LDAP' que tiene permiso para leer el directorio;
- $ldap_server [ $ID del servidor] [ 'bindpw']: Contraseña para el usuario LDAP anterior.
Si necesita definir otros servidores LDAP, agregue la siguiente línea para incrementar el ID del servidor y definir nuevos parámetros:
- $serverId++'.
Definición de consultas en config/ldap.php
Precaución: cuando se requiere un nombre de atributo ldap en uno de estos parámetros, use solo nombres en minúsculas: por ejemplo, nombre para mostrar y NO nombre para mostrar.
Consulte el archivo config/ldap.php, ya que contiene ejemplos de configuración.
Consultas simples
Comencemos con consultas simples. Estas consultas solo filtran entradas LDAP según sus propios atributos y ubicación. Generalmente son suficientes para consultar ActiveDirectory.
- $query_id: es el ID de la consulta LDAP;
- $ldap_queries [ $consulta_id] [ 'ldapServerId']: Vincula la consulta a un servidor específico;
- $ldap_queries [ $consulta_id] [ 'nombre']: Cadena que describe la consulta. Se mostrará en la GUI;
- $ldap_queries [ $consulta_id] [ 'userbase']: DN raíz que se utilizará para las búsquedas de usuarios;
- $ldap_queries [ $consulta_id] [ 'userfilter']: Es un filtro utilizado para seleccionar las entradas de los usuarios potenciales. Debe estar entre paréntesis;
- $ldap_queries [ $consulta_id] [ 'userscope']: alcance de la búsqueda LDAP para usuarios ('base', 'one' o 'sub');
- $ldap_queries [ $consulta_id] [ 'firstname_attr']: Atributo Ldap que se asignará al campo Nombre de la entrada del token;
- $ldap_queries [ $consulta_id] [ 'lastname_attr']: Atributo Ldap que se asignará al campo Apellido de la entrada del token;
- $ldap_queries [ $consulta_id] [ 'email_attr']: Atributo Ldap que se asignará al campo de dirección de correo electrónico de la entrada del token.
Opcionalmente, puede recuperar más información del directorio:
- $ldap_queries [ $consulta_id] [ 'token_attr']: Atributo Ldap que se asignará al código del token;
- $ldap_queries [ $consulta_id] [ 'language']: Atributo Ldap que se asignará al código de idioma del usuario;
- $ldap_queries [ $consulta_id] [ 'attr1']: Atributo Ldap que se asignará al campo atributo_1;
- $ldap_queries [ $consulta_id] [ 'attr2']: Atributo Ldap que se asignará al campo atributo_2.
Consultas de grupo combinadas con miembros de DN
Veamos ahora cómo definir una consulta más complicada.
Las siguientes consultas utilizan una primera búsqueda LDAP que busca en grupos LDAP. Un grupo LDAP es una entrada LDAP que contiene referencias a las entradas de los usuarios en forma de:
- ID de usuario (por ejemplo, posixGroups lo hace) ==> Consulte la siguiente sección
- O DN de usuario (por ejemplo, groupofnames y groupofuniquenames hacer) ==> ver más abajo
Aquí tratamos con grupos que contienen DN de usuario:
- define $query_id, $ldap_queries [ $consulta_id] [ 'ldapServerId'], $ldap_queries [ $consulta_id] [ 'nombre'] como se explicó anteriormente.
Luego defina los parámetros del filtro de grupo:
- $ldap_queries [ $consulta_id] [ 'groupbase']: El DN raíz desde el cual desea comenzar a buscar entradas de grupo;
- $ldap_queries [ $consulta_id] [ 'groupfilter']: El filtro LDAP que seleccionará posibles entradas de grupo;
- $ldap_queries [ $consulta_id] [ 'groupscope']: El alcance de la búsqueda LDAP para grupos ('on', 'base' o 'sub');
- $ldap_queries [ $consulta_id] [ 'groupmemberattr']: El nombre del atributo LDAP en la entrada del grupo que contendrá referencias a las entradas de los usuarios;
- $ldap_queries [ $consulta_id] [ 'groupmemberisdn']: VERDADERO.
En este punto, todo está configurado para permitir que la primera búsqueda LDAP encuentre los usuarios correspondientes a los grupos seleccionados. Sin embargo, puede restringir cuáles de estos "usuarios candidatos" serán seleccionados aplicándoles otro filtro. Esto es, por supuesto, opcional:
- $ldap_queries [ $consulta_id] [ 'userbase']: Se seleccionará el DN base para la búsqueda LDAP del usuario (solo el candidato de usuario que coincida con esta base);
- $ldap_queries [ $consulta_id] [ 'userscope']: Se seleccionará el ámbito para la búsqueda LDAP del usuario (solo el candidato de usuario que coincida con la base de usuarios+alcance);
- $ldap_queries [ $consulta_id] [ 'userfilter']: Es un filtro que se aplica a cada entrada de usuario candidato (en sus atributos) para agregar otra selección.
Consultas grupales combinadas con miembros UID
Veamos ahora cómo definir una consulta de grupo combinada cuando los miembros del grupo son UID de usuario y no DN de usuario.
En cuanto a las consultas de grupo con miembros de DN, estas consultas utilizan una primera búsqueda LDAP que busca entradas de grupos LDAP y obtiene sus miembros. Estos valores de miembros se utilizan luego en un filtro de búsqueda de usuarios para buscar las entradas correspondientes. Por lo tanto, se debe configurar otro parámetro para definir el atributo de usuario en la entrada del usuario que debe coincidir con el UID del miembro que se encuentra en los grupos.
Repasemos los parámetros requeridos:
- define $query_id, $ldap_queries [ $consulta_id] [ 'ldapServerId'], $ldap_queries [ $consulta_id] [ 'nombre'] como se explicó anteriormente
Luego defina los parámetros del filtro de grupo:
- $ldap_queries [ $consulta_id] [ 'groupbase']: El DN raíz desde el cual desea comenzar a buscar entradas de grupo;
- $ldap_queries [ $consulta_id] [ 'groupfilter']: El filtro LDAP que seleccionará posibles entradas de grupo;
- $ldap_queries [ $consulta_id] [ 'groupscope']: El alcance de la búsqueda LDAP para grupos ('on', 'base' o 'sub');
- $ldap_queries [ $consulta_id] [ 'groupmemberattr']: El nombre del atributo LDAP en la entrada del grupo que contendrá referencias a las entradas de los usuarios;
- $ldap_queries [ $consulta_id] [ 'groupmemberisdn']: FALSO;
- $ldap_queries [ $consulta_id] [ 'useridattr']: nombre del atributo de usuario que debe coincidir con el UID encontrado en los miembros del grupo.
En este punto, todo está configurado para permitir que la primera búsqueda LDAP encuentre los UID de los usuarios correspondientes a los grupos seleccionados y se completará automáticamente un filtro de búsqueda de usuarios.
Sin embargo, puede restringir cuál de estos 'candidatos de usuario' se seleccionará completando el filtro de usuario automático calculado a partir de los UID de los miembros. Esto es, por supuesto, opcional:
- $ldap_queries [ $consulta_id] [ 'userbase']: Se seleccionará el DN base para la búsqueda LDAP del usuario (solo el candidato de usuario que coincida con esta base);
- $ldap_queries [ $consulta_id] [ 'userscope']: Se seleccionará el ámbito para la búsqueda LDAP del usuario (solo el candidato de usuario que coincida con la base de usuarios+alcance);
- $ldap_queries [ $consulta_id] [ 'userfilter']: Es un filtro que se aplica a cada entrada de usuario candidato (en sus atributos) para agregar otra selección.
¿Qué pasa con Active Directory?
Active Directory (AD) es un registro de Microsoft que se puede consultar mediante el protocolo LDAP.
Luego es posible usar su contenido para consultas de tokens de LimeSurvey, pero esto requiere conocimiento sobre cómo está organizado AD.
- La base raíz de LDAP es dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1
==> Por ejemplo, si su empresa posee el dominio DNS 'mi-empresa.com' y su dominio de Windows es 'empleados', entonces su base raíz es dc=empleados,dc=mi-empresa,dc=com
* Los usuarios y los grupos de usuarios se almacenan debajo de cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (tenga en cuenta que esto no es ou=users);
- Grupos de Active Directory:
- Grupos los objetos contienen el DN de los miembros en su atributo 'miembro';
- Las membresías de grupos también se almacenan en el atributo memberOf de cada entrada de usuario. Este atributo contiene DN de los grupos a los que pertenece el usuario;
- algunos grupos están en CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
- Por ejemplo: cn=Administrador,CN =Integrado,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;
En algunos casos no es tan fácil consultar un directorio activo, por lo que aquí hay una configuración de ejemplo para obtener información de un directorio activo:
//Conexión al servidor del directorio activo:
$serverId=0;
$ldap_server[$serverId]['server'] = "10.10.10.10";
$ldap_server[$serverId] ['port'] = "389";
$ldap_server[$serverId]['protoversion'] = "ldapv2";
$ldap_server[$serverId]['encrypt'] = "none"; // ¡La mayoría de los servidores AD LDAP no tendrán el cifrado configurado de forma predeterminada
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domain\\user ";
$ldap_server[$serverId]['bindpw'] = "contraseña de usuario";
//$ldap_server[$serverId]['binddn'] = "CN=usuario,OU=user_group,DC=xxx ,DC=aaa"; ¡Este no funcionará con el directorio activo, por eso necesita usar "dominio\\usuario"
//Aquí hay una consulta de ejemplo para obtener todos los usuarios activos de un directorio activo:
$query_id=0 ;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Personal con una cuenta habilitada';
$ldap_queries[$query_id] ['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(!(userAccountControl=514) ))';
//(!(userAccountControl=514)) ¡no puede solicitar al directorio activo un usuario activo pero puede solicitar un usuario no inactivo
$ldap_queries[$query_id][ 'userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'correo';
$ldap_queries[$query_id]['token_attr'] = ''; // Déjelo vacío para la generación automática de tokens mediante phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ ldap_queries[$query_id]['attr2'] = '';
//El filtrado de grupos no fue posible en el directorio activo, debe agregar el atributo memberOf de un usuario. Aquí hay una consulta de ejemplo para obtener todos los usuarios activos que son miembros del grupo "samplegroup" en el directorio activo:
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ ldap_queries[$query_id]['name'] = 'Todos los miembros del grupo de muestra';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(memberOf=CN=samplegroup,OU=Group Global,OU=USER_GROUP,DC=xxx,DC=yyy)(!(userAccountControl=514 )))';
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$ query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'correo';
$ldap_queries[$query_id]['token_attr'] = ''; // Déjelo vacío para la generación automática de tokens mediante phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ ldap_queries[$query_id]['attr2'] = '';
Otro ejemplo Consulta de usuario:
$ldap_queries[$query_id]['userfilter'] = '(&('''objectCategory=Persona''')(objectClass='''usuario''')(!(''userAccountControl=514' '')))'; // ¡AD no reconoce las cuentas habilitadas de la manera normal, por lo que verificamos que los usuarios no estén deshabilitados
- Como se sugiere en el archivo de configuración, considere agregar (!(email=*)) a sus filtros de usuario para ignorar a los usuarios sin dirección de correo electrónico.
Consulta de grupo de ejemplo:
$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass='''group''')(cn=Administradores de dominio))'; // AD no usa el nombre de atributo estándar para grupos, así que usa este ejemplo en su lugar.
Encuentre más información sobre la estructura LDAP de Active Directory en Arquitectura de Active Directory y biblioteca/cc223122.aspx Especificación técnica de Active Directory.