Actions

Impostazioni LDAP

From LimeSurvey Manual

Revision as of 17:51, 25 July 2023 by Maren.fritz (talk | contribs) (Created page with "A questo punto tutto è predisposto per consentire alla prima ricerca LDAP di trovare gli utenti corrispondenti ai gruppi selezionati. Tuttavia, puoi limitare quali di questi...")
  Attenzione : Questa funzione consente agli amministratori dei sondaggi di LimeSurvey di importare i token tramite LDAP. Se hai bisogno di un'autenticazione LDAP, fai riferimento a AuthLDAP plugin.


Informazioni generali

Devi abilitare il supporto LDAP in config.php e configurare i parametri LDAP in config/ldap.php per utilizzare questa funzione.

Template:Avviso

Abilitazione di LDAP in config.php

  • $enableLdap: se si desidera utilizzare le funzioni LDAP in LimeSurvey, è necessario impostare questo parametro su true (è impostato su false per impostazione predefinita):
'config'=>array(
 'debug'=>0,
 'debugsql'=>0,
 'enableLdap'=>true,
 )

Definizione dei server LDAP

Per prima cosa definire le opzioni di connessione al server LDAP in "application/config/ldap.php". Per ogni server sono disponibili le seguenti opzioni:

  • $serverId: Un numero intero che identifica questo server LDAP. Viene utilizzato nelle definizioni delle query per associare un server a una query specifica;
  • $ldap_server [ $idserver] [ 'server']: L'indirizzo IP o il nome DNS del server LDAP. Se utilizzi connessioni protette SSL (LDAP o LDAP+Start-TLS), questo nome deve corrispondere al CN certificato del server (o SubjectAlternativeName);
  • $ldap_server [ $idserver] [ 'protoversion']: Può essere 'ldapv2' o 'ldapv3' a seconda del protocollo supportato dal tuo server. 'ldapv3' è il protocollo preferito. Tuttavia, se desideri utilizzare connessioni crittografate, tieni presente che LDAP è supportato in modalità 'ldapv2' mentre Start-TLS è il metodo di crittografia per 'ldapv3';
  • $ldap_server [ $idserver] [ 'encrypt']: Definisce il metodo di crittografia utilizzato. 'ldaps' è supportato per i server 'ldav2', 'start-tls' per i server 'ldapv3'. La parola chiave 'none' viene utilizzata per le comunicazioni LDAP in chiaro;
    • Non dimenticare che per la crittografia 'ldaps' o 'start-tls', il server web deve essere in grado di controllare il certificato del server LDAP. Quindi, devi definire la tua Autorità di Certificazione nella tua libreria openldap (di solito questo viene fatto nel file /etc/openldap/ldap.conf sotto linux).
  • $ldap_server [ $idserver] [ 'referrals']: È un parametro booleano che definisce se i referral devono essere seguiti o meno (usa false per ActiveDirectory);
  • $ldap_server [ $idserver] [ 'encoding']: È un parametro opzionale che fornisce la codifica utilizzata dalla directory LDAP per memorizzare le stringhe. Di solito non è necessario impostare questo parametro poiché la codifica presunta predefinita, 'utf-8', è la codifica standard per le directory LDAP. Tuttavia, se utilizzi Active Directory e riscontri problemi nell'importazione di stringhe accentuate, prova a impostare questo parametro sulla codifica utilizzata nella tua zona (ad esempio "cp850" per l'Europa occidentale). Puoi fare riferimento all'elenco a discesa "Set di caratteri del file" nella GUI Importa token da file CSV per avere l'elenco completo delle codifiche supportate.

Successivamente, è necessario definire quale autenticazione è necessaria per ottenere l'accesso alla directory. Se è consentito l'accesso 'anonimo', NON impostare i due seguenti parametri, altrimenti impostarli di conseguenza:

  • $ldap_server [ $idserver] [ 'binddn']: DN dell'utente 'LDAP' a cui è consentito leggere la directory;
  • $ldap_server [ $idserver] [ 'bindpw']: Password per l'utente LDAP di cui sopra.

Se è necessario definire altri server LDAP, aggiungere la seguente riga per incrementare il serverID e definire nuovi parametri:

  • $serverId++.

Definizione delle query in config/ldap.php

Attenzione: quando un nome attributo ldap è richiesto in uno di questi parametri, usa solo nomi minuscoli: ad esempio displayname e NON displayName.

Fare riferimento al file config/ldap.php in quanto contiene esempi di configurazione.

Query semplici

Iniziamo con query semplici. Queste query filtrano solo le voci LDAP in base ai propri attributi e posizione. Di solito sono sufficienti per interrogare ActiveDirectory.

  • $query_id: è l'id della query LDAP;
  • $ldap_queries [ $query_id] [ 'ldapServerId']: Associa la query a un server specifico;
  • $ldap_queries [ $query_id] [ 'name']: Stringa che descrive la query. Verrà visualizzato nella GUI;
  • $ldap_queries [ $query_id] [ 'userbase']: Root DN da utilizzare per le ricerche degli utenti;
  • $ldap_queries [ $query_id] [ 'userfilter']: E' un filtro utilizzato per selezionare le voci dei potenziali utenti. Deve essere racchiuso tra parentesi;
  • $ldap_queries [ $query_id] [ 'userscope']: ambito della ricerca LDAP per gli utenti ('base', 'one' o 'sub');
  • $ldap_queries [ $query_id] [ 'firstname_attr']: Attributo Ldap che verrà mappato al campo Firstname della voce del token;
  • $ldap_queries [ $query_id] [ 'lastname_attr']: Attributo Ldap che verrà mappato al campo Cognome della voce del token;
  • $ldap_queries [ $query_id] [ 'email_attr']: attributo Ldap che verrà mappato al campo dell'indirizzo email della voce del token.

Facoltativamente, è possibile recuperare ulteriori informazioni dalla directory:

  • $ldap_queries [ $query_id] [ 'token_attr']: attributo Ldap che verrà mappato al codice del token;
  • $ldap_queries [ $query_id] [ 'language']: attributo Ldap che verrà mappato al codice della lingua dell'utente;
  • $ldap_queries [ $query_id] [ 'attr1']: attributo Ldap che verrà mappato al campo attribute_1;
  • $ldap_queries [ $query_id] [ 'attr2']: attributo Ldap che verrà mappato al campo attribute_2.

Query di gruppo combinate con membri DN

Vediamo ora come definire una query più complicata.

Le query seguenti utilizzano una prima ricerca LDAP che esamina i gruppi LDAP. Un gruppo LDAP è una voce LDAP contenente riferimenti alle voci degli utenti sotto forma di:

  • ID utente (ad esempio posixGroups do) ==> Vedere la sezione successiva
  • O DN utente (ad esempio groupofnames e groupofuniquenames do) ==> vedere di seguito

Qui ci occupiamo di gruppi contenenti DN utente:

  • define $query_id, $ldap_queries [ $query_id] [ 'ldapServerId'], $ldap_queries [ $query_id] [ 'nome'] come spiegato sopra.

Quindi definire i parametri del filtro di gruppo:

  • $ldap_queries [ $query_id] [ 'groupbase']: Il Root DN da cui vuoi iniziare la ricerca delle voci di gruppo;
  • $ldap_queries [ $query_id] [ 'groupfilter']: Il filtro LDAP che selezionerà potenziali voci di gruppo;
  • $ldap_queries [ $query_id] [ 'groupscope']: L'ambito della ricerca LDAP per i gruppi ('on', 'base' o 'sub');
  • $ldap_queries [ $query_id] [ 'groupmemberattr']: Il nome dell'attributo LDAP nella voce di gruppo che conterrà i riferimenti alle voci degli utenti;
  • $ldap_queries [ $query_id] [ 'groupmemberisdn']: TRUE.

A questo punto tutto è predisposto per consentire alla prima ricerca LDAP di trovare gli utenti corrispondenti ai gruppi selezionati. Tuttavia, puoi limitare quali di questi "candidati utenti" verranno selezionati applicando loro un altro filtro. Questo è, ovviamente, facoltativo:

  • $ldap_queries [ $query_id] [ 'userbase']: Base DN per la ricerca LDAP dell'utente (solo l'utente candidato corrispondente a questa base) sarà selezionato;
  • $ldap_queries [ $query_id] [ 'userscope']: Verrà selezionato l'ambito per la ricerca LDAP dell'utente (solo l'utente candidato corrispondente a base utente+ambito);
  • $ldap_queries [ $query_id] [ 'userfilter']: E' un filtro che si applica ad ogni voce candidata dell'utente (sui suoi attributi) per aggiungere un'altra selezione.

Combined Group Queries with UID members

Let's now see how to define a combined Group query when group members are user UIDs and not User DNs.

As for the Group queries with DNs members, these queries use a first LDAP search that looks for LDAP groups entries and get their members. These members values are then used in a user search filter to search for corresponding entries. Thus another parameter must be configured to define the user attribute in the user's entry that should match the member UID found in the groups.

Let's review the required parameters:

  • define $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] as explained above

Then define the group filter parameters:

  • $ldap_queries[$query_id]['groupbase']: The Root DN from which you want to start searching for group entries;
  • $ldap_queries[$query_id]['groupfilter']: The LDAP filter that will select potential group entries;
  • $ldap_queries[$query_id]['groupscope']: The scope of the LDAP search for groups ('on', 'base' or 'sub');
  • $ldap_queries[$query_id]['groupmemberattr']: The name of the LDAP attribute in the group entry that will contain references to users' entries;
  • $ldap_queries[$query_id]['groupmemberisdn']: FALSE;
  • $ldap_queries[$query_id]['useridattr']: name of the user attribute that must match the UID found in the group members.

At this point everything is set up to let the first LDAP search find users UIDs corresponding to selected groups and a user search filter will be automatically filled.

However, you can restrict which of these 'user candidates' will be selected by completing the automatic user filter computed from member UIDs. This is, of course, optional:

  • $ldap_queries[$query_id]['userbase']: Base DN for the user LDAP search (only user candidate matching this base) will be selected;
  • $ldap_queries[$query_id]['userscope']: Scope for the user LDAP search (only user candidate matching the userbase+scope) will be selected;
  • $ldap_queries[$query_id]['userfilter']: It is a filter that applies to each user candidate entry (on its attributes) to add another selection.

What about Active Directory?

Active Directory (AD) is a Microsoft registry that can be queried by using the LDAP protocol.

It is then possible to use its content for LimeSurvey token queries, but this requires knowledge on how AD is organized.

  • The LDAP root base is dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1

==> For instance, if your company owns the DNS domain 'my-company.com' and your Windows domain is 'employees', then your root base is dc=employees,dc=my-company,dc=com

  • Users and users-groups are stored below the cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (please note this is not ou=users);
  • Active Directory Groups:
    • Groups objects contain DN of members in their 'member' attribute;
    • Group memberships are also stored in the memberOf attribute of each user entry. This attribute contains DNs of groups the user belongs to;
    • some groups are in CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
      • For instance: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;

In some cases it is not as easy to query an active directory so here is a sample configuration for getting some infomations of an active directory:

//Connection to the active directory Server:
$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"; // Most AD LDAP servers will not have encryption set by default
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domain\\user";
$ldap_server[$serverId]['bindpw'] = "userpassword";
//$ldap_server[$serverId]['binddn'] = "CN=user,OU=user_group,DC=xxx,DC=yyy"; this one will not work with active directory, that´s why you need to use "domain\\user"
//Here is a sample query for getting all active users of an active directory:
$query_id=0;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Staff with an enabled account';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(!(userAccountControl=514)))';
//(!(userAccountControl=514)) you are not able to ask active directory for an active user but you are able to ask for a non inactive user
$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'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
//Group filtering was not possible in active directory, you need to add the memberOf attribute of an user. Here is a sample query for getting all active users that are member of the group "samplegroup" in active directory:
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'All members of samplegroup';
$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'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Leave empty for Auto Token generation by phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';

Another example User query:

$ldap_queries[$query_id]['userfilter'] = '(&('''objectCategory=Person''')(objectClass='''user''')(!('''userAccountControl=514''')))'; // AD doesn't recognise enabled accounts in the normal way, so instead, we check users are not disabled
  • As suggested in the config file, consider adding (!(email=*)) to your user filters to ignore users with no email address.

Example group query:

$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass='''group''')(cn=Domain Admins))'; // AD doesn't use the standard attribute name for groups, so use this example instead.

Find more information about the Active Directory LDAP structure on Active Directory Architecture and Active Directory Technical Specification.