Ustawienia LDAP
From LimeSurvey Manual
Ogólne
Aby skorzystać z tej funkcji, musisz włączyć obsługę LDAP w config.php i skonfigurować parametry LDAP w config/ldap.php.
Włączanie LDAP w config.php
- $enableLdap: jeśli chcesz używać funkcji LDAP w LimeSurvey, musisz ustawić ten parametr na true (domyślnie jest ustawiony na false):
'config'=>array( 'debug'=>0, 'debugsql'=>0, 'enableLdap'=>true, )
Definiowanie serwerów LDAP
Najpierw zdefiniuj opcje połączeń z serwerem LDAP w pliku „application/config/ldap.php”. Dla każdego serwera dostępne są następujące opcje:
- $serverId: Liczba całkowita identyfikująca ten serwer LDAP. Jest używany w definicjach zapytań do powiązania serwera z określonym zapytaniem;
- $ldap_server [ $Idserwera] [ 'serwer']: Adres IP lub nazwa DNS serwera LDAP. Jeśli korzystasz z połączeń zabezpieczonych SSL (LDAP lub LDAP+Start-TLS), nazwa ta musi odpowiadać CN certyfikatu serwera (lub alternatywna nazwa podmiotu);
- $ldap_server [ $Idserwera] [ 'protoversion']: Może mieć wartość 'ldapv2' lub 'ldapv3' w zależności od protokołu obsługiwanego przez twój serwer. Preferowanym protokołem jest „ldapv3”. Jeśli jednak chcesz używać połączeń szyfrowanych, pamiętaj, że protokoły LDAP są obsługiwane w trybie „ldapv2”, podczas gdy Start-TLS to metoda szyfrowania dla „ldapv3”;
- $ldap_server [ $Idserwera] [ 'encrypt']: Określa zastosowaną metodę szyfrowania. Opcja „ldaps” jest obsługiwana w przypadku serwerów „ldav2”, a opcja „start-tls” w przypadku serwerów „ldapv3”. Słowo kluczowe „none” jest używane w komunikacji LDAP w postaci zwykłego tekstu;
- Nie zapominaj, że w przypadku szyfrowania „ldaps” lub „start-tls” serwer WWW musi mieć możliwość sprawdzenia certyfikatu serwera LDAP. Dlatego musisz zdefiniować urząd certyfikacji w swojej bibliotece openldap (zwykle robi się to w pliku /etc/openldap/ldap.conf pod Linuksem).
- $ldap_server [ $Idserwera] [ 'referrals']: Jest to parametr logiczny, który określa, czy należy przestrzegać poleceń, czy nie (w przypadku ActiveDirectory użyj wartości false);
- $ldap_server [ $Idserwera] [ 'encoding']: Jest to opcjonalny parametr określający kodowanie używane przez katalog LDAP do przechowywania ciągów znaków. Zwykle nie ma potrzeby konfigurowania tego parametru, ponieważ domyślne kodowanie „utf-8” jest standardowym kodowaniem katalogów LDAP. Jeśli jednak korzystasz z Active Directory i masz problemy z importowaniem akcentowanych ciągów znaków, spróbuj ustawić ten parametr zgodnie z kodowaniem używanym w Twoim regionie (na przykład „cp850” dla Europy Zachodniej). Możesz skorzystać z listy rozwijanej „Zestaw znaków pliku” w graficznym interfejsie użytkownika Importuj token z pliku CSV, aby uzyskać pełną listę obsługiwanych kodowań.
Następnie musisz zdefiniować, jakie uwierzytelnienie jest potrzebne, aby uzyskać dostęp do katalogu. Jeśli dozwolony jest dostęp „anonimowy”, NIE ustawiaj dwóch poniższych parametrów, w przeciwnym razie ustaw je odpowiednio:
- $ldap_server [ $Idserwera] [ 'binddn']: Nazwa wyróżniająca użytkownika 'LDAP', który może czytać katalog;
- $ldap_server [ $Idserwera] [ 'bindpw']: Hasło dla powyższego użytkownika LDAP.
Jeśli chcesz zdefiniować inne serwery LDAP, dodaj następujący wiersz, aby zwiększyć identyfikator serwera i zdefiniować nowe parametry:
- $serverId++.
Definiowanie zapytań w config/ldap.php
Uwaga: jeśli w jednym z tych parametrów wymagana jest „nazwa atrybutu ldap”, „używaj tylko nazw małych liter”: na przykład nazwa wyświetlana, a NIE nazwa wyświetlana.
Proszę zapoznać się z plikiem config/ldap.php, ponieważ zawiera on przykładową konfigurację.
Proste zapytania
Zacznijmy od prostych zapytań. Te zapytania filtrują jedynie wpisy LDAP na podstawie ich własnych atrybutów i lokalizacji. Zwykle wystarczą do wykonania zapytania do ActiveDirectory.
- $query_id: to identyfikator zapytania LDAP;
- $ldap_queries [ $identyfikator_zapytania] [ 'ldapServerId']: Wiąże zapytanie z określonym serwerem;
- $ldap_queries [ $identyfikator_zapytania] [ 'name']: Ciąg znaków opisujący zapytanie. Zostanie wyświetlony w GUI;
- $ldap_queries [ $identyfikator_zapytania] [ 'userbase']: Główna nazwa wyróżniająca używana do wyszukiwania użytkowników;
- $ldap_queries [ $identyfikator_zapytania] [ 'userfilter']: Jest to filtr służący do selekcji wpisów potencjalnych użytkowników. Musi być ujęte w nawiasy;
- $ldap_queries [ $identyfikator_zapytania] [ 'userscope']: zakres wyszukiwania LDAP dla użytkowników („podstawowy”, „jeden” lub „podrzędny”);
- $ldap_queries [ $identyfikator_zapytania] [ 'firstname_attr']: Atrybut Ldap, który zostanie zamapowany na pole Firstname wpisu tokena;
- $ldap_queries [ $identyfikator_zapytania] [ 'lastname_attr']: Atrybut Ldap, który zostanie zmapowany do pola Nazwisko wpisu tokena;
- $ldap_queries [ $identyfikator_zapytania] [ 'email_attr']: Atrybut Ldap, który zostanie zamapowany na pole adresu e-mail wpisu tokena.
Opcjonalnie możesz pobrać więcej informacji z katalogu:
- $ldap_queries [ $identyfikator_zapytania] [ 'token_attr']: Atrybut Ldap, który zostanie zmapowany na kod tokena;
- $ldap_queries [ $identyfikator_zapytania] [ 'language']: Atrybut Ldap, który zostanie zmapowany na kod języka użytkownika;
- $ldap_queries [ $identyfikator_zapytania] [ 'attr1']: Atrybut Ldap, który zostanie odwzorowany na pole atrybut_1;
- $ldap_queries [ $identyfikator_zapytania] [ 'attr2']: Atrybut Ldap, który zostanie odwzorowany na pole atrybut_2.
Połączone zapytania grupowe z członkami nazwy wyróżniającej
Zobaczmy teraz jak zdefiniować bardziej skomplikowane zapytanie.
Poniższe zapytania korzystają z pierwszego wyszukiwania LDAP, które sprawdza grupy LDAP. Grupa LDAP to wpis LDAP zawierający odniesienia do wpisów użytkowników w postaci:
- identyfikatorów użytkowników (na przykład posixGroups do) ==> Zobacz następną sekcję
- Lub nazw wyróżniających użytkowników (na przykład groupofnames i groupofuniquenames zrobić) ==> patrz poniżej
Tutaj mamy do czynienia z grupami zawierającymi nazwy wyróżniające użytkowników:
- define $query_id, $ldap_queries [ $identyfikator_zapytania] [ „ldapServerId”], $ldap_queries [ $identyfikator_zapytania] [ „nazwa”], jak wyjaśniono powyżej.
Następnie zdefiniuj parametry filtra grupowego:
- $ldap_queries [ $identyfikator_zapytania] [ 'groupbase']: Główna nazwa wyróżniająca, od której chcesz rozpocząć wyszukiwanie wpisów grupowych;
- $ldap_queries [ $identyfikator_zapytania] [ 'groupfilter']: Filtr LDAP, który wybierze potencjalne wpisy grupowe;
- $ldap_queries [ $identyfikator_zapytania] [ 'groupscope']: Zakres wyszukiwania grup LDAP („on”, „base” lub „sub”);
- $ldap_queries [ $identyfikator_zapytania] [ 'groupmemberattr']: Nazwa atrybutu LDAP we wpisie grupy, który będzie zawierał odniesienia do wpisów użytkowników;
- $ldap_queries [ $identyfikator_zapytania] [ 'członekgrupy']: TRUE.
W tym momencie wszystko jest ustawione tak, aby pierwsze wyszukiwanie LDAP pozwoliło znaleźć użytkowników odpowiadających wybranym grupom. Możesz jednak ograniczyć wybór tych „kandydatów użytkowników”, stosując do nich inny filtr. Jest to oczywiście opcjonalne:
- $ldap_queries [ $identyfikator_zapytania] [ 'userbase']: Wybrana zostanie podstawowa nazwa wyróżniająca dla wyszukiwania LDAP użytkownika (tylko kandydaci na użytkownika pasujący do tej bazy);
- $ldap_queries [ $identyfikator_zapytania] [ 'userscope']: Wybrany zostanie zakres wyszukiwania LDAP użytkownika (tylko kandydaci na użytkownika pasujący do +zakresu bazy użytkowników);
- $ldap_queries [ $identyfikator_zapytania] [ 'userfilter']: Jest to filtr stosowany do każdego wpisu potencjalnego użytkownika (według jego atrybutów) w celu dodania kolejnego wyboru.
Połączone zapytania grupowe z członkami UID
Zobaczmy teraz, jak zdefiniować połączone zapytanie grupowe, gdy członkami grupy są identyfikatory UID użytkowników, a nie nazwy wyróżniające użytkowników.
Jeśli chodzi o zapytania grupowe z członkami nazw wyróżniających, zapytania te korzystają z pierwszego wyszukiwania LDAP, które wyszukuje wpisy grup LDAP i pobiera ich członków. Te wartości elementów są następnie używane w filtrze wyszukiwania użytkownika w celu wyszukiwania odpowiednich wpisów. Dlatego należy skonfigurować inny parametr, aby zdefiniować atrybut użytkownika we wpisie użytkownika, który powinien odpowiadać identyfikatorowi UID członka znalezionego w grupach.
Przyjrzyjmy się wymaganym parametrom:
- define $query_id, $ldap_queries [ $identyfikator_zapytania] [ „ldapServerId”], $ldap_queries [ $identyfikator_zapytania] [ „nazwa”], jak wyjaśniono powyżej
Następnie zdefiniuj parametry filtra grupowego:
- $ldap_queries [ $identyfikator_zapytania] [ 'groupbase']: Główna nazwa wyróżniająca, od której chcesz rozpocząć wyszukiwanie wpisów grupowych;
- $ldap_queries [ $identyfikator_zapytania] [ 'groupfilter']: Filtr LDAP, który wybierze potencjalne wpisy grupowe;
- $ldap_queries [ $identyfikator_zapytania] [ 'groupscope']: Zakres wyszukiwania grup LDAP („on”, „base” lub „sub”);
- $ldap_queries [ $identyfikator_zapytania] [ 'groupmemberattr']: Nazwa atrybutu LDAP we wpisie grupy, który będzie zawierał odniesienia do wpisów użytkowników;
- $ldap_queries [ $identyfikator_zapytania] [ 'członekgrupy']: FALSE;
- $ldap_queries [ $identyfikator_zapytania] [ 'useridattr']: nazwa atrybutu użytkownika, który musi pasować do UID znalezionego w członkach grupy.
W tym momencie wszystko jest skonfigurowane tak, aby pierwsze wyszukiwanie LDAP znalazło identyfikatory UID użytkowników odpowiadające wybranym grupom, a filtr wyszukiwania użytkowników zostanie automatycznie wypełniony.
Można jednak ograniczyć wybór tych „kandydatów użytkowników”, wypełniając automatyczny filtr użytkowników obliczany na podstawie identyfikatorów UID członków. Jest to oczywiście opcjonalne:
- $ldap_queries [ $identyfikator_zapytania] [ 'userbase']: Wybrana zostanie podstawowa nazwa wyróżniająca dla wyszukiwania LDAP użytkownika (tylko kandydaci na użytkownika pasujący do tej bazy);
- $ldap_queries [ $identyfikator_zapytania] [ 'userscope']: Wybrany zostanie zakres wyszukiwania LDAP użytkownika (tylko kandydaci na użytkownika pasujący do +zakresu bazy użytkowników);
- $ldap_queries [ $identyfikator_zapytania] [ 'userfilter']: Jest to filtr stosowany do każdego wpisu potencjalnego użytkownika (według jego atrybutów) w celu dodania kolejnego wyboru.
A co z Active Directory?
Active Directory (AD) to rejestr firmy Microsoft, do którego można wysyłać zapytania przy użyciu protokołu LDAP.
Można wówczas wykorzystać jego zawartość do zapytań o token LimeSurvey, ale wymaga to wiedzy na temat organizacji AD.
- Baza główna LDAP to dc=nazwa_domeny_mojego_windows,dc=sufiks_dns2,dc=sufiks_dns1
==> Na przykład, jeśli Twoja firma jest właścicielem domeny DNS „moja-firma.com”, a Twoja domena systemu Windows to „pracownicy”, wówczas baza główna to dc=employees,dc=moja-firma,dc=com
* Użytkownicy i grupy użytkowników są przechowywane poniżej cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 (pamiętaj, że to nie jest ou=users);
- Grupy Active Directory:
- Grupy obiekty zawierają nazwę wyróżniającą członków w atrybucie „member”;
- Członkostwa w grupach są również przechowywane w atrybucie memberOf każdego wpisu użytkownika. Ten atrybut zawiera nazwy wyróżniające grup, do których należy użytkownik;
- niektóre grupy znajdują się w CN=Builtin,dc=moja_nazwa_domeny_windows,dc=dns_suffix2,dc=dns_suffix1:
- Na przykład: cn=Administrator,CN =Wbudowany,dc=nazwa_domeny_mojego_windows,dc=sufiks_dns2,dc=sufiks_dns1;
W niektórych przypadkach zapytanie do aktywnego katalogu nie jest tak proste, dlatego oto przykładowa konfiguracja pozwalająca uzyskać informacje o aktywnym katalogu:
//Połączenie z serwerem 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'] = "brak"; // Większość serwerów AD LDAP nie ma domyślnie ustawionego szyfrowania
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domena\\użytkownik ";
$ldap_server[$serverId]['bindpw'] = "hasło użytkownika";
//$ldap_server[$serverId]['binddn'] = "CN=użytkownik,OU=grupa_użytkowników,DC=xxx ,DC=rrrr"; to nie będzie działać z Active Directory, dlatego musisz użyć "domena\\użytkownik"
//Oto przykładowe zapytanie, aby uzyskać wszystkich aktywnych użytkowników aktywnego katalogu:
$query_id=0 ;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Personel z włączonym kontem';
$ldap_queries[$query_id] ['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=użytkownik)(!(userAccountControl=514) ))';
//(!(userAccountControl=514)) nie możesz zapytać Active Directory o aktywnego użytkownika, ale możesz poprosić o nieaktywnego użytkownika
$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'] = 'poczta';
$ldap_queries[$query_id]['token_attr'] = ''; // Pozostaw puste dla automatycznego generowania tokenu przez phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ ldap_queries[$query_id]['attr2'] = '';
//Filtrowanie grup nie było możliwe w Active Directory, należy dodać atrybut memberOf użytkownika. Oto przykładowe zapytanie umożliwiające pobranie wszystkich aktywnych użytkowników będących członkami grupy „samplegroup” w aktywnym katalogu:
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ ldap_queries[$query_id]['name'] = 'Wszyscy członkowie grupy próbnej';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=użytkownik)(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'] = 'nadane imię';
$ldap_queries[$ query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // Pozostaw puste dla automatycznego generowania tokenu przez phpsv
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ ldap_queries[$query_id]['attr2'] = '';
Inny przykład zapytania użytkownika:
$ldap_queries[$query_id]['userfilter'] = '(&('''objectCategory=Person''')(objectClass='''użytkownik'')(!('''userAccountControl=514' '')))'; // AD w normalny sposób nie rozpoznaje włączonych kont, więc zamiast tego sprawdzamy, czy użytkownicy nie są wyłączeni
- Zgodnie z sugestią w pliku konfiguracyjnym rozważ dodanie (!(email=*)) do filtrów użytkownika, aby ignorować użytkowników bez adresu e-mail.
Przykładowe zapytanie grupowe:
$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass='''grupa''')(cn=administratorzy domeny))'; // AD nie używa standardowej nazwy atrybutu dla grup, więc zamiast tego użyj tego przykładu.
Więcej informacji na temat struktury LDAP usługi Active Directory znajdziesz na Architektura Active Directory i Library/cc223122.aspx Specyfikacja techniczna usługi Active Directory.