Impostazioni LDAP
From LimeSurvey Manual
Informazioni generali
Devi abilitare il supporto LDAP in config.php e configurare i parametri LDAP in config/ldap.php per utilizzare questa funzione.
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.
Query di gruppo combinate con membri UID
Vediamo ora come definire una query di gruppo combinata quando i membri del gruppo sono UID utente e non DN utente.
Come per le query di gruppo con i membri dei DN, queste query utilizzano una prima ricerca LDAP che cerca le voci dei gruppi LDAP e ne ottiene i membri. Questi valori dei membri vengono quindi utilizzati in un filtro di ricerca utente per cercare le voci corrispondenti. Pertanto, è necessario configurare un altro parametro per definire l'attributo utente nella voce dell'utente che dovrebbe corrispondere all'UID del membro trovato nei gruppi.
Rivediamo i parametri richiesti:
- 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']: FALSE;
- $ldap_queries [ $query_id] [ 'useridattr']: nome dell'attributo utente che deve corrispondere all'UID trovato nei membri del gruppo.
A questo punto tutto è impostato per consentire alla prima ricerca LDAP di trovare gli UID degli utenti corrispondenti ai gruppi selezionati e verrà automaticamente compilato un filtro di ricerca degli utenti.
Tuttavia, puoi limitare quale di questi "candidati utente" verrà selezionato completando il filtro utente automatico calcolato dagli UID dei membri. 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.
E Active Directory?
Active Directory (AD) è un registro Microsoft che può essere interrogato utilizzando il protocollo LDAP.
È quindi possibile utilizzare il suo contenuto per le query token LimeSurvey, ma ciò richiede la conoscenza di come è organizzato AD.
- La base radice LDAP è dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1
==> Ad esempio, se la tua azienda possiede il dominio DNS 'my-company.com' e il tuo dominio Windows è 'employees', allora la tua root base è dc=employees,dc=my-company,dc=com
- Gli utenti e i gruppi di utenti sono memorizzati sotto cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (tieni presente che questo non è ou =utenti);
- Gruppi di Active Directory:
- Gli oggetti Gruppi contengono il DN dei membri nel loro attributo 'membro';
- Le appartenenze ai gruppi sono memorizzate anche nell'attributo memberOf di ciascuna voce utente. Questo attributo contiene i DN dei gruppi a cui appartiene l'utente;
- alcuni gruppi sono in CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1:
- Ad esempio: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1;
In alcuni casi non è così facile interrogare una directory attiva, quindi ecco una configurazione di esempio per ottenere alcune informazioni su una directory attiva:
//Connessione al server Active Directory:
$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 maggior parte dei server AD LDAP non avrà la crittografia impostata per impostazione predefinita
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domain\\user";
$ldap_server[$serverId]['bindpw'] = "userpassword";
//$ldap_server[$serverId]['bindd n'] = "CN=utente,OU=gruppo_utenti,DC=xxx,DC=yyy"; questo non funzionerà con la directory attiva, ecco perché è necessario utilizzare "domain\\user"
//Ecco una query di esempio per ottenere tutti gli utenti attivi di una directory attiva:
$query_id=0;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Staff con un account abilitato';
$ldap_ query[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(!(userAccountControl=514)))';
//(!(userAccountControl=514)) non puoi chiedere ad Active Directory per un utente attivo ma puoi chiedere per un utente non inattivo
$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'] = ''; // Lascia vuoto per la generazione di token automatici da parte di phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
//Il filtro di gruppo non era possibile in Active Directory, è necessario aggiungere l'attributo memberOf di un utente. Ecco una query di esempio per ottenere tutti gli utenti attivi che sono membri del gruppo "samplegroup" in Active Directory:
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Tutti i membri di 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'] = ''; // Lascia vuoto per la generazione del token automatico da parte di phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
Un altro esempio Query utente:
$ldap_queries[$query_id]['userfilter'] = '(&('''objectCategory=Person''')(objectClass='''user''')(!('''userAccountControl=514''')))'; // AD non riconosce normalmente gli account abilitati, quindi controlliamo che gli utenti non siano disabilitati
- Come suggerito nel file di configurazione, prendi in considerazione l'aggiunta di (!(email=*)) ai tuoi filtri utente per ignorare gli utenti senza indirizzo email.
Esempio di query di gruppo:
$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass='''group''')(cn=Domain Admins))'; // AD non usa il nome dell'attributo standard per i gruppi, quindi usa invece questo esempio.
Trova ulteriori informazioni sulla struttura LDAP di Active Directory su Architettura di Active Directory e Specifiche tecniche di Active Directory.