Actions

LDAP settings/nl: Difference between revisions

From LimeSurvey Manual

No edit summary
No edit summary
Line 39: Line 39:
===Simpele queries===
===Simpele queries===


Een simpele query filtert alleen LDAP entries op grond van hun attributen en de plaats. Dit normaal gesproken voor ActiveDirectory genoeg.
Een simpele query filtert alleen LDAP entries op grond van hun attributen en de plaats. Dit is normaal gesproken voor ActiveDirectory genoeg.
*'''$query_id:''' is het ID van de LDAP query
*'''$query_id:''' is het ID van de LDAP query
*'''$ldap_queries<nowiki>[</nowiki>$query_id]<nowiki>[</nowiki>'ldapServerId']:''' verbind de query met een specifieke server
*'''$ldap_queries<nowiki>[</nowiki>$query_id]<nowiki>[</nowiki>'ldapServerId']:''' verbind de query met een specifieke server

Revision as of 14:23, 19 August 2013

Algemeen

LDAP wordt nu gebruikt bij de functie "Importeren toegangscodes uit LDAP query", maar mogelijk wordt in de toekomst ook LDAP authenticatie ondersteunt. Er is nu een niet ondersteunde manier voor authenticatie met LDAP. Workarounds: Authenticating Against LDAP Cheap and Dirty. Om deze functie te gebruiken, moet je LDAP support in config.php inschakelen en de parameters in config/ldap.php instellen.

! Attentie !

Om LDAP te kunnen gebruiken, moet de LDAP module in je PHP geïnstalleerd zijn. Extensie installeren: PHP LDAP module documentation.

TIP: Als je wilt dat beheerders authenticatie via LDAP gaat, controleer dan de informatie over authenticatie in de optionele instellingen.

Inschakelen LDAP

  • $enableLdap: als je LDAP functie wilt gebruiken, dan moet je deze parameter in config.php op "true" zetten (standaard: "false")

Definiëren LDAP servers

Definieer eerst de ldap server connectie opties in application/config/ldap.php. Voor elke server zijn er de volgende opties:

  • $serverId: een integer die de LDAP-server identificeert. Het wordt gebruikt in query definities om de server aan een specifieke query te koppelen (bind).
  • $ldap_server[$serverId]['server']: het IP adres of DNS naam van de LDAP server. Als je SSL secured connections (LDAPs of LDAP+Start-TLS) gebruikt dan moet deze naam overeenkomen met het server Certificaat CN (of SubjectAlternativeName)
  • $ldap_server[$serverId]['protoversion']: kan zijn 'ldapv2' of 'ldapv3' afhankelijk van het door je server ondersteunde protocol. Voorkeur: 'ldapv3'. Als je encrypted connections wilt gebruiken, dan is LDAP ondersteunt in de 'ldapv2' mode terwijl Start-TLS is de encryption methode voor 'ldapv3'
  • $ldap_server[$serverId]['encrypt']: definieert de gebruikte encryption methode. 'ldaps' wordt ondersteunt voor 'ldav2' servers, 'start-tls' voor 'ldapv3' servers. Het 'none' keyword wordt gebruikt voor cleartext LDAP communications
    • Vergeet niet dat voor 'ldaps' of 'start-tls' encryption, de server het LDAP server certificaat moet kunnen controleren. Dus je moet de Certificate Authority in je openldap library definiëren (meestal wordt dit voor linux gedaan in het bestand /etc/openldap/ldap.conf)
  • $ldap_server[$serverId]['referrals']: boolean parameter definieert of doorverwijzingen moeten worden gevolgd (gebruik "false" voor ActiveDirectory)
  • $ldap_server[$serverId]['encoding']: optionele parameter die de gebruikte encoding aangeeft die gebruikt wordt in de ldap directory om strings op te slaan. Dit hoef je meestal niet te doen, omdat de standaard voor encoding 'utf-8' is. Als je echter Active Directory gebruikt en je hebt problemen met het importeren van strings met accenten, probeer dan deze parameter in te stellen op de door jou gebruikte encoding (bijvoorbeeld 'cp850' voor West Europa). Je ziet een lijst met ondersteunde encodings als je kijkt in de dropdown lijst 'karakterset van het bestand' bij de functie 'Importeer toegangscodes uit CSV-bestand'.

Daarna moet je aangeven welke authenticatie nodig is om toegang te krijgen tot de map. Als anonieme toegang is toegestaan, dan moet je de volgende twee parameters niet zetten en anders dus wel:

  • $ldap_server[$serverId]['binddn']: DN van de 'LDAP' gebruiker die de map mag lezen
  • $ldap_server[$serverId]['bindpw']: Password van de bovenstaande LDAP gebruiker

Als je meerdere LDAP servers definieert, voeg dan de volgende regel toe:

  • $serverId++;

Definiëren queries in config/ldap.php

LET OP: wanneer er een ldap attribuutnaam wordt gebruikt in een van deze parameters, gebruik dan alleen kleine letters: dus displayname en NIET displayName.

Bekijk het bestand config/ldap.php, het bevat voorbeelden van de configuratie.

Simpele queries

Een simpele query filtert alleen LDAP entries op grond van hun attributen en de plaats. Dit is normaal gesproken voor ActiveDirectory genoeg.

  • $query_id: is het ID van de LDAP query
  • $ldap_queries[$query_id]['ldapServerId']: verbind de query met een specifieke server
  • $ldap_queries[$query_id]['name']: Tekst die de query beschrijft. Het wordt in de GUI getoond
  • $ldap_queries[$query_id]['userbase']: Root DN voor zoeken gebruiker
  • $ldap_queries[$query_id]['userfilter']: filter dat gebruikt wordt om mogelijke gebruikers te selecteren. Het moet tussen haakjes staan
  • $ldap_queries[$query_id]['userscope']: scope van de LDAP zoeken naar gebruikers ('base', 'one' or 'sub')
  • $ldap_queries[$query_id]['firstname_attr']: Ldap attribuut gekoppeld met de voornaam van de toegangscode
  • $ldap_queries[$query_id]['lastname_attr']: Ldap attribuut gekoppeld met de achternaam van de toegangscode
  • $ldap_queries[$query_id]['email_attr']: Ldap attribuut gekoppeld met het e-mailadres van de toegangscode

Optioneel kun je meer informatie ophalen uit de directory:

  • $ldap_queries[$query_id]['token_attr']: Ldap attribuut gekoppeld met de toegangscode
  • $ldap_queries[$query_id]['language']: Ldap attribuut gekoppeld met de taalcode van de gebruiker
  • $ldap_queries[$query_id]['attr1']: Ldap attribuut gekoppeld met het attribuut_1 veld
  • $ldap_queries[$query_id]['attr2']: Ldap attribuut gekoppeld met het attribuut_2 veld

Gecombineerde groep Queries met DN leden

Nu gaan we een moeilijkere query maken.

De volgende queries gebruiken eerst een LDAP zoek naar de LDAP groepen. Een LDAP groep is een LDAP entry die referenties naar gebruikers bevat in de vorm van:

  • ID's van gebruikers (bijvoorbeeld posixGroups)  ==> Lees de volgende paragraaf
  • Of user DNs (bijvoorbeeld groupofnames en groupofuniquenames) ==> zie hieronder

We hebben hier groepen die user DNs bevatten:

  • definieer $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] zoals hierboven uitgelegd

Definieer dan de filter parameters van de groep:

  • $ldap_queries[$query_id]['groupbase']: de Root DN waarvandaan je wilt beginnen met zoeken naar groepen
  • $ldap_queries[$query_id]['groupfilter']: de LDAP filter die de mogelijke groepen zal selecteren
  • $ldap_queries[$query_id]['groupscope']: de scope van het LDAP zoeken naar groepen ('on', 'base' of 'sub')
  • $ldap_queries[$query_id]['groupmemberattr']: naam van het LDAP attribuut in de groep dat referenties naar gebruikers zal bevatten
  • $ldap_queries[$query_id]['groupmemberisdn']: TRUE

Nu is alles ingesteld om de eerste LDAP zoekopdracht naar gebruikers behorend tot geselecteerde groepen te doen. Je kunt echter nog wel beperken welke van de gevonden gebruikers geselecteerd zal worden, door nog een filter te gebruiken. Dit is natuurlijk optioneel:

  • $ldap_queries[$query_id]['userbase']: Base DN voor het LDAP zoeken naar gebruikers (alleen gevonden gebruikers behorend met deze base)
  • $ldap_queries[$query_id]['userscope']: Scope voor het zoeken (alleen gevonden gebruikers met deze userbase+scope)
  • $ldap_queries[$query_id]['userfilter']: filter op elke gevonden gebruiker te gebruiken (op de attributen van die gebruiker) om een andere selectie toe te voegen

Gecombineerde Groep Queries met UID leden

We laten nu zien hoe je een gecombineerde groep query met groepsleden kunt maken, de leden zijn user UIDs en niet User DNs.

Net als bij groep queries met DNs leden, gebruiken deze queries een eerste LDAP zoek naar LDAP groepen en haalt de leden op. Deze leden worden dan gefilterd. Er moet een parameter worden ingesteld om het gebruikersattribuut te definiëren die overeen moet komen met het UID van het lid/member gevonden in de groepen.

We bekijken de verplichte parameters:

  • defineer $query_id, $ldap_queries[$query_id]['ldapServerId'], $ldap_queries[$query_id]['name'] zoals hierboven uitgelegd

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']: 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 setup to let the fist 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']: filter to apply to each user candidate entry (on its attributes) to add another selection

En hoe zit het met Active Directory?

Active Directory (AD) is een Microsoft registry die gelezen kan worden met het 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&acute;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 bu 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 bu phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';

Another example User query:

$ldap_queries<nowiki>[</nowiki>$query_id]]<nowiki>[</nowiki>'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.

Voorbeeld groep query:

$ldap_queries<nowiki>[</nowiki>$query_id]]<nowiki>[</nowiki>'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 this page.

Werkende configuraties

MS AD 2003

Apache vhost code:

<Location /admin>
 AuthBasicProvider ldap
 AuthType Basic
 AuthzLDAPAuthoritative off
 AuthName "Computer login use"
 AuthLDAPURL "ldap://ldaphost.domain.tld:389/DC=domain,DC=tld?sAMAccountName?sub?(objectClass=*)" [<div class="simplebox">] NONE
 AuthLDAPBindDN "DOMAIN\\ldapuser"
 AuthLDAPBindPassword "ldappass"
 require valid-user
</Location>

LimeSurvey config.php code:

$useWebserverAuth = true;
$userArrayMap = Array ('Administrator' => 'admin');
$WebserverAuth_autocreateUser = true;
function hook_get_autouserprofile($user_name) {
       $SearchFor=$user_name;
       $SearchField="samaccountname";
       $LDAPHost = "ldaphost.domain.tld";
       $dn = "OU=User,OU=Company,DC=domain,DC=tld";
       $LDAPUserDomain = "@domain.tld";
       $LDAPUser = "ldapuser";
       $LDAPUserPassword = "ldappass";
       $LDAPFieldsToFind = array("cn", "samaccountname", "mail");
       $cnx = ldap_connect($LDAPHost) or die("Could not connect to LDAP");
       ldap_set_option($cnx, LDAP_OPT_PROTOCOL_VERSION, 3);
       ldap_set_option($cnx, LDAP_OPT_REFERRALS, 0);
       ldap_bind($cnx,$LDAPUser.$LDAPUserDomain,$LDAPUserPassword) or die("Could not bind to LDAP");
       error_reporting (E_ALL </div> E_NOTICE);
       $filter="($SearchField=$SearchFor*)";
       $sr=ldap_search($cnx, $dn, $filter, $LDAPFieldsToFind);
       $info = ldap_get_entries($cnx, $sr);
       for ($x=0; $x<$info["count"]; $x++) {
               $sam=$info[$x]['samaccountname'][0];
               $email=$info[$x]['mail'][0];
               $nam=$info[$x]['cn'][0];
               if (stristr($sam, "$SearchFor")) {
                       $user_name_from_backend = $nam;
                       $user_email_from_backend = $email;
               }
       }
       if ($x==0) {
               return Array();
       }
       return Array(
               'full_name' => "$user_name_from_backend",
               'email' => "$user_email_from_backend",
               'lang' => "nl",
               'htmleditormode' => 'inline',
               'templatelist' => 'default',
               'create_survey' => 1,
               'create_user' => 0,
               'delete_user' => 0,
               'superadmin' => 0,
               'configurator' =>0,
               'manage_template' => 0,
               'manage_label' => 0);
}

Forum link : http://www.limesurvey.org/forum/german-forum/75992-ldap-auth-und-auto-benutzer-anlegen?lang=en#75992