Actions

LDAP-Einstellungen

From LimeSurvey Manual

Revision as of 16:38, 20 July 2023 by Maren.fritz (talk | contribs) (Created page with "<u>Hier beschäftigen wir uns mit Gruppen, die Benutzer-DNs enthalten:</u> *define $query_id, $ldap_queries<nowiki> [</nowiki> $query_id]<nowiki> [</nowiki> 'ldapServerId'],...")
  Achtung : Mit dieser Funktion können LimeSurvey-Umfrageadministratoren Token über LDAP importieren. Wenn Sie eine LDAP-Authentifizierung benötigen, lesen Sie bitte AuthLDAP-Plugin.


Generelles

Um diese Funktion nutzen zu können, müssen Sie die LDAP-Unterstützung in config.php aktivieren und LDAP-Parameter in config/ldap.php konfigurieren.

  Um LDAP verwenden zu können, müssen Sie überprüfen, ob das LDAP-Modul in Ihrem PHP installiert ist. Informationen zur Installation dieser Erweiterung finden Sie in der Dokumentation zum PHP-LDAP-Modul.


LDAP in config.php aktivieren

  • $enableLdap: Wenn Sie LDAP-Funktionen in LimeSurvey verwenden möchten, müssen Sie diesen Parameter auf true setzen (standardmäßig ist er auf false gesetzt):
'config'=>array(
 'debug'=>0,
 'debugsql'=>0,
 'enableLdap'=>true,
 )

LDAP-Server definieren

Definieren Sie zunächst die LDAP-Serververbindungsoptionen in „application/config/ldap.php“. Für jeden Server stehen die folgenden Optionen zur Verfügung:

  • '$serverId: Eine Ganzzahl, die diesen LDAP-Server identifiziert. Es wird in Abfragedefinitionen verwendet, um einen Server an eine bestimmte Abfrage zu binden;
  • '$ldap_server [ $serverId] [ 'server']: Die IP-Adresse oder der DNS-Name des LDAP-Servers. Wenn Sie SSL-gesicherte Verbindungen (LDAPs oder LDAP+Start-TLS) verwenden, muss dieser Name dem Zertifikat-CN (oder SubjectAlternativeName) des Servers entsprechen;
  • '$ldap_server [ $serverId] [ 'protoversion']: Kann je nach dem von Ihrem Server unterstützten Protokoll 'ldapv2' oder 'ldapv3' sein. „ldapv3“ ist das bevorzugte Protokoll. Wenn Sie jedoch verschlüsselte Verbindungen verwenden möchten, beachten Sie, dass LDAPs im Modus „ldapv2“ unterstützt wird, während Start-TLS die Verschlüsselungsmethode für „ldapv3“;
  • '$ldap_server ist [ $serverId] [ 'encrypt']: Definiert die verwendete Verschlüsselungsmethode. „ldaps“ wird für „ldav2“-Server unterstützt, „start-tls“ für „ldapv3“-Server. Das Schlüsselwort „none“ wird für Klartext-LDAP-Kommunikation verwendet;
    • Vergessen Sie nicht, dass der Webserver für die Verschlüsselung „ldaps“ oder „start-tls“ in der Lage sein muss, das Zertifikat des LDAP-Servers zu überprüfen. Daher müssen Sie Ihre Zertifizierungsstelle in Ihrer openldap-Bibliothek definieren (normalerweise erfolgt dies in der Datei /etc/openldap/ldap.conf unter Linux).
  • $ldap_server [ $serverId] [ 'referrals']: Es handelt sich um einen booleschen Parameter, der definiert, ob Verweisen gefolgt werden muss oder nicht (verwenden Sie false für ActiveDirectory);
  • $ldap_server [ $serverId] [ 'encoding']: Dies ist ein optionaler Parameter, der die vom LDAP-Verzeichnis zum Speichern von Zeichenfolgen verwendete Codierung angibt. Normalerweise müssen Sie diesen Parameter nicht einrichten, da die standardmäßig angenommene Kodierung „utf-8“ die Standardkodierung für LDAP-Verzeichnisse ist. Wenn Sie jedoch Active Directory verwenden und Probleme beim Importieren von akzentuierten Zeichenfolgen haben, versuchen Sie, diesen Parameter auf die in Ihrer Region verwendete Codierung einzustellen (z. B. „cp850“ für Westeuropa). Die vollständige Liste der unterstützten Kodierungen finden Sie in der Dropdown-Liste „Zeichensatz der Datei“ in der GUI Import Token from CSV file.

Als Nächstes müssen Sie definieren, welche Authentifizierung erforderlich ist, um Zugriff auf das Verzeichnis zu erhalten. Wenn „anonymer“ Zugriff erlaubt ist, legen Sie die beiden folgenden Parameter NICHT fest, andernfalls legen Sie sie entsprechend fest:

  • $ldap_server [ $serverId] [ 'binddn']: DN des 'LDAP'-Benutzers, der das Verzeichnis lesen darf;
  • '$ldap_server [ $serverId] [ 'bindpw']: Passwort für den oben genannten LDAP-Benutzer.

Wenn Sie andere LDAP-Server definieren müssen, fügen Sie die folgende Zeile hinzu, um die Server-ID zu erhöhen und neue Parameter zu definieren:

  • $serverId++.

Definieren von Abfragen in config/ldap.php

Achtung: Wenn in einem dieser Parameter ein „LDAP-Attributname“ erforderlich ist, „verwenden Sie nur Namen in Kleinbuchstaben“, zum Beispiel „displayname“ und NICHT „displayName“.

Bitte beachten Sie die Datei config/ldap.php, da sie Beispielkonfigurationen enthält.

Einfache Abfragen

Beginnen wir mit einfachen Abfragen. Diese Abfragen filtern LDAP-Einträge nur basierend auf ihren eigenen Attributen und ihrem Standort. Sie reichen normalerweise aus, um ActiveDirectory abzufragen.

  • $query_id: ist die ID der LDAP-Abfrage;
  • $ldap_queries [ $query_id] [ 'ldapServerId']: Bindet die Abfrage an einen bestimmten Server;
  • '$ldap_queries [ $query_id] [ 'name']: String, der die Abfrage beschreibt. Es wird in der GUI angezeigt;
  • $ldap_queries [ $query_id] [ 'userbase']: Root-DN zur Verwendung für Benutzersuchen;
  • $ldap_queries [ $query_id] [ 'userfilter']: Dies ist ein Filter, der zur Auswahl potenzieller Benutzereinträge verwendet wird. Es muss in Klammern eingeschlossen werden;
  • $ldap_queries [ $query_id] [ 'userscope']: Umfang der LDAP-Suche nach Benutzern ('base', 'one' oder 'sub');
  • $ldap_queries [ $query_id] [ 'firstname_attr']: Ldap-Attribut, das dem Firstname-Feld des Token-Eintrags zugeordnet wird;
  • $ldap_queries [ $query_id] [ 'lastname_attr']: Ldap-Attribut, das dem Feld Nachname des Token-Eintrags zugeordnet wird;
  • $ldap_queries [ $query_id] [ 'email_attr']: Ldap-Attribut, das dem E-Mail-Adressfeld des Token-Eintrags zugeordnet wird.

Optional können Sie weitere Informationen aus dem Verzeichnis abrufen:

  • $ldap_queries [ $query_id] [ 'token_attr']: Ldap-Attribut, das dem Token-Code zugeordnet wird;
  • $ldap_queries [ $query_id] [ 'Sprache']: Ldap-Attribut, das dem Benutzersprachencode zugeordnet wird;
  • $ldap_queries [ $query_id] [ 'attr1']: Ldap-Attribut, das dem Feld attribute_1 zugeordnet wird;
  • $ldap_queries [ $query_id] [ 'attr2']: Ldap-Attribut, das dem Feld attribute_2 zugeordnet wird.

Kombinierte Gruppenabfragen mit DN-Mitgliedern

Sehen wir uns nun an, wie eine kompliziertere Abfrage definiert wird.

Die folgenden Abfragen verwenden eine erste LDAP-Suche, die in LDAP-Gruppen sucht. Eine LDAP-Gruppe ist ein LDAP-Eintrag, der Verweise auf Benutzereinträge in der Form enthält:

  • Benutzer-IDs (z. B. posixGroups) ==> Siehe nächsten Abschnitt
  • Oder Benutzer-DNs (z. B. groupofnames und groupofuniquenames). tun) ==> siehe unten

Hier beschäftigen wir uns mit Gruppen, die Benutzer-DNs enthalten:

  • define $query_id, $ldap_queries [ $query_id] [ 'ldapServerId'], $ldap_queries [ $query_id] [ 'Name'] wie oben erläutert.

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']: TRUE.

At this point, everything is set up to let the first LDAP search find users corresponding to the 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']: It is a filter that applies to each user candidate entry (on its attributes) to add another selection.

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.