Actions

LDAP-instellingen

From LimeSurvey Manual

Revision as of 15:43, 18 November 2013 by Han (talk | contribs)

Algemeen

LDAP wordt nu gebruikt bij de functie "Importeren toegangscodes uit LDAP query", maar mogelijk wordt in de toekomst ook LDAP authenticatie ondersteunt. 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

First define the ldap server connections options in application/config/ldap.php. For each server, the following options are available:

  • $serverId: an integer that identifies this LDAP server. It is used in query definitions to bind a server to a specific query
  • $ldap_server[$serverId]['server']: the IP address or DNS name of the LDAP server. If you use SSL secured connections (LDAPs or LDAP+Start-TLS) this name must correspond to the server's Certificate CN (or SubjectAlternativeName)
  • $ldap_server[$serverId]['protoversion']: can be 'ldapv2' or 'ldapv3' depending on the protocol supported by your server. 'ldapv3' is the preferred protocol. However, if you want to use encrypted connections, note that LDAPs is supported in 'ldapv2' mode whereas Start-TLS is the encryption method for 'ldapv3'
  • $ldap_server[$serverId]['encrypt']: defines the encryption method used. 'ldaps' is supported for 'ldav2' servers, 'start-tls' for 'ldapv3' servers. The 'none' keyword is used for cleartext LDAP communications
    • Don't forget that for 'ldaps' or 'start-tls' encryption, the webserver must be able to check the LDAP server's certificate. Thus you need to define your Certificate Authority in your openldap library (usually this is done in the /etc/openldap/ldap.conf file under linux)
  • $ldap_server[$serverId]['referrals']: boolean parameter defining if referrals must be followed (use false for ActiveDirectory)
  • $ldap_server[$serverId]['encoding']: optional parameter which gives the encoding used by the Ldap directory to store strings. You usually do not need to setup this parameter as the default assumed encoding, 'utf-8', is the standard encoding for LDAP directories. However, if you're using Active Directory and are having problems importing accentuated strings, then try to setup this parameter to the encoding used in you area (for instance 'cp850' for West Europe). You can refer to the 'Character set of the file' dropdown list in the 'Import Token from CSV file' GUI, to have the full list of supported encodings.

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++;

Defining 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.

Please refer to the config/ldap.php file as it contains samples configuration.

Simpele queries

Let's begin with simples queries. These queries only filter LDAP entries based on their own attributes and location. They are usually enough for querying ActiveDirectory.

  • $query_id: is the id of the LDAP query
  • $ldap_queries[$query_id]['ldapServerId']: bind the query to a specific server
  • $ldap_queries[$query_id]['name']: String describing the query. It will be displayed in the GUI
  • $ldap_queries[$query_id]['userbase']: Root DN to use for user searches
  • $ldap_queries[$query_id]['userfilter']: filter used to select potential users' entries. It must be enclosed in parenthesis
  • $ldap_queries[$query_id]['userscope']: scope of the LDAP search for users ('base', 'one' or 'sub')
  • $ldap_queries[$query_id]['firstname_attr']: Ldap attribute that will be mapped to the Firstname field of the token entry
  • $ldap_queries[$query_id]['lastname_attr']: Ldap attribute that will be mapped to the Lastname field of the token entry
  • $ldap_queries[$query_id]['email_attr']: Ldap attribute that will be mapped to the email address field of the token entry

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

At this point everything is setup to let the first LDAP search find users corresponding to selected groups. However, you can restrict which of these 'user candidates' will be selected by applying another filter on them. 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

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

Definieer dan de groep filter parameters:

  • $ldap_queries[$query_id]['groupbase']: de root DN waarvandaan je met zoeken naar groep entries wilt beginnen
  • $ldap_queries[$query_id]['groupfilter']: het LDAP filter om de mogelijke groep entries te selecteren
  • $ldap_queries[$query_id]['groupscope']: de scope van het zoeken naar groepen ('on', 'base' of 'sub')
  • $ldap_queries[$query_id]['groupmemberattr']: naam van het LDAP attribuut in de groep entry die de referenties naar de gebruikers bevat
  • $ldap_queries[$query_id]['groupmemberisdn']: FALSE
  • $ldap_queries[$query_id]['useridattr']: naam van het attribuut van de gebruiker die moet overeenkomen met het UID in de groepsleden

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

Je kunt echter nog wel beperken welke van de gevonden gebruikers geselecteerd zal worden, door het automatische filter nog aan te vullen. Dit is natuurlijk optioneel:

  • $ldap_queries[$query_id]['userbase']: Base DN van het LDAP zoeken (alleen gebruikers behorend bij deze base selecteren)
  • $ldap_queries[$query_id]['userscope']: Scope voor het zoeken (alleen gebruikers met deze userbase+scope selecteren)
  • $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

En hoe zit het met Active Directory?

Active Directory (AD) is een Microsoft registry die gelezen kan worden met het LDAP protocol.

Het is dan mogelijk om de inhoud te gebruiken voor LimeSurvey token queries, maar dat vereist kennis over hoe Active Directory is georganiseerd.

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

==> Voorbeeld: als je bedrijf een DNS domein 'my-company.com' heeft en je Windows domein is 'employees', dan is je root base dc=employees,dc=my-company,dc=com

  • Gebruikers en gebruikersgroepen worden opgeslagen onder cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (dit is niet ou=users)
  • Active Directory groepen
    • Groeps objecten bevatten DN of leden in hun 'member' attribuut.
    • Groepslidmaatschap wordt ook opgeslagen in het memberOf attribuut per gebruiker. Dit attribuut bevat DNs van groepen waartoe een gebruiker behoort
    • Enkele groepen staan in CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1
      • Voorbeeld: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1

Het is soms lastig om een query te gebruiken op een active directory. Hier een mogelijke configuratie voor het verkrijgen van informatie uit een 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.

Voorbeeld groep 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.

Meer informatie over Active Directory LDAP.

Werkende configuraties

MS Active Directory 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