Jerzy Szymański
Uczelniane Centrum Informatyczne UMK
Jerzy.Szymanski@uni.torun.pl

Temat zadania:

Uwierzytelnianie i autoryzacja w serwisie WWW za pomocą informacji pobieranej z zasobów LDAP

(opracowanie przygotowane w ramach realizacji zadań projektu KBN)

Data opracowania: 30.12.2002

Spis treści
  1. Wprowadzenie
  2. Przygotowanie bazy danych
  3. Konfiguracja modułów
    1. mod_auth_ldap v. 0.5.1
    2. mod_auth_ldap v. 2.4
    3. mod_ldap v. 1.8
    4. auth_ldap
    5. mod_authz_ldap
  4. Uwagi / konkluzje

  5. Bibliografia
    Polecane linki
1. Wprowadzenie

Do zagadnienia autentykacji i autoryzacji w serwisie WWW, która ma wykorzystywać LDAP podejść można na dwa sposoby. Po pierwsze, możemy zdecydować się na korzystanie z metod oferowanych pośrednio przez sam serwer, a więc sięgnąć po dynamiczne i statyczne moduły serwera, które wzbogacają standardową procedurę uwierzytelniania serwera (Basic) chociażby o możliwość korzystania z zasobów LDAP do przechowywania identyfikatorów i haseł osób uprawnionych do logowania. Drugim, alternatywnym podejściem, jest ominięcie metod serwera i zaprojektowanie własnego systemu autoryzacji dostępu do określonych serwisów WWW np. w języku PHP, bądź też w HTML-u z użyciem skryptów CGI.

W niniejszym opracowaniu przyjrzymy się modułom serwera Apache służącym do autentykacji i autoryzacji w serwisie WWW. W dalszym ciągu opracowania często świadomie używać będziemy zamiennie pojęć autoryzacja i autentykacja ponieważ moduły zwykle obie te operacje wykonują prawie jednocześnie a czasem autoryzacja jest równoznaczna z poprawną autentykacją.

Przegląd obejmuje 5 różnych modułów korzystających z LDAP:

1 mod_auth_ldap v. 0.5.1 http://nona.net/software/ldap
2 mod_auth_ldap v. 2.4 http://www.muquit.com/muquit/software/mod_auth_ldap/mod_auth_ldap.html
3 mod_ldap v. 1.8 http://kie.berkeley.edu/people/jmorrow/mod_ldap/
4 auth_ldap http://www.rudedog.org/auth_ldap/
5 mod_authz_ldap http://authzldap.othello.ch/

Dla celów przeglądu został wykorzystany system Linux RedHat v . 7.2 wraz z oprogramowaniem OpenLDAP w wersji 2.0.23, Apache wersja 1.3.24 z dynamicznym modułem PHP v. 4.1.2 . Serwer OpenLDAP został zainstalowany w katalogu /usr/local/openldap a serwer Apache w katalogu /usr/local/apache.

2. Przygotowanie bazy danych

Ogólnie, przygotowanie bazy danych wymaganej przez dany moduł sprowadza się do utworzenia bazy użytkowników o spójnej strukturze. Oznacza to, że dobrze jest zadbać o to, aby dane użytkowników (identyfikatory, hasła) przechowywane były w jednym poddrzewie bazy. Ułatwia to poźniejszą konfigurację, gdyż moduły autoryzacji często nie pozwalają na przeszukiwanie wielu poddrzew. Zwykle w poszukiwaniu użytkowników przeszukują one bazę LDAP w dół od podanego RDN-u (nie można podawać wielu RDN-ów). Dodatkowo można utworzyć poddrzewo zawierające nazwy grup, w przypadku chęci korzystania z autoryzacji opartej na przynależności użytkownika do danej grupy.

Dla celów niniejszego przeglądu przygotowana została baza o następującej strukturze:

dc=poczta,dc=umk,dc=pl - główny DN
ou=Osoby,dc=poczta,dc=umk,dc=pl - drzewo zawierające dane użytkowników (dla celów autentykacji)
ou=Grupy,dc=poczta,dc=umk,dc=pl - drzewo zawierające definicje grup

Przedstawimy definicję powyższych obiektów:

dn: dc=poczta,dc=umk,dc=pl
objectClass: top
objectClass: dcObject
objectClass: organization
o: Baza autoryzacji przez moduly Apache
dc: BA

dn: ou=Osoby,dc=poczta,dc=umk,dc=pl
ou: Osoby
objectClass: top
objectClass: organizationalUnit

dn: ou=Grupy,dc=poczta,dc=umk,dc=pl
ou: Grupy
objectClass: top
objectClass: organizationalUnit

Wpisy na poziomie ou=Osoby,dc=poczta,dc=umk,dc=pl są postaci:

dn: cn=jerzy,ou=Osoby,dc=poczta,dc=umk,dc=pl
objectclass: inetOrgPerson
cn: Jerzy Szymanski
sn: Szymanski
uid: jerzy
userPassword: {SSHA}rMk1TdWR8r1oiZllHFNQkApUBi+HUMOS
title: ml. programista
organizationName: PSU
streetAddress: Chopina 12/18
l: Torun
st: kujawsko-pomorskie
postalCode: 87-100
mail: Jerzy.Szymanski@umk.pl
telephoneNumber: +48566113372
roomNumber: 412

dn: cn=search,ou=Osoby,dc=poczta,dc=umk,dc=pl
objectclass: inetOrgPerson
cn: Search user
sn: Search
uid: search
userPassword: {SSHA}PBUXxVj+4cx4uncBDW5agCRexwVZCVSm

zaś na poziomie ou=Grupy,dc=poczta,dc=umk,dc=pl postaci

dn: cn=grupa1,ou=Grupy,dc=poczta,dc=umk,dc=pl
objectclass: top
objectclass: groupOfUniqueNames
cn: grupa1
description: Grupa Uczestnikow Projektu LDAP
uniquemember: cn=jerzy,ou=Osoby,dc=poczta,dc=umk,dc=pl

3. Konfiguracja modułów

a. mod_auth_ldap v. 0.5.1

Kompilacja

Rozpakowujemy pakiet mod_auth_ldap-0.5.1.tar.gz do podkatalogu src/modules w drzewie źródeł Apache.
Moduł rozpakuje się nam do podkatalogu mod_auth_ldap. W katalogu tym należy skonfigurować moduł używając polecenia configure .
Ustawiamy w systemie potrzebne zmienne środowiskowe:

export LDFLAGS="-L/usr/local/openldap/lib -L/usr/local/ssl/lib"
export INCLUDES="-I/usr/local/openldap/include -I/usr/local/ssl/include"

LDFLAGS - powinna wskazywać na miejsce, w którym w systemie przechowywane są biblioteki OpenLDAP
INCLUDES - powinna wskazywać na miejsce przechowywania plików nagłówkowych dla biblioteki

Opcjonalnie dodaliśmy analogiczne wskazania także dla bibliotek i plików nagłówkowych pakietu SSL, gdyż zamierzamy skompilować Apache z obsługą SSL.

Poniższe komendy wykonane w katalogu ze źródłami Apache skonfigurują nam i statycznie skompilują serwer WWW wraz z modułem mod_auth_ldap.

./configure --prefix=/usr/local/apache --enable-module=so -enable-module=ssl --activate-module=src/modules/mod_auth_ldap/mod_auth_ldap.c

make

Z naszego punktu widzenia istotna jest opcja --activate-module=src/modules/mod_auth_ldap/mod_auth_ldap.c dołączająca nasz moduł do kompilacji Apache.

Konfiguracja

Gdy mamy już skompilowany serwer Apache wraz z modułem możemy chronić wybrane katalogi naszego serwera WWW korzystając z dyrektywy <Directory> serwera Apache. W pliku httpd.conf serwera Apache dla chronionego katalogu wpisujemy klauzulę

<Directory /usr/local/apache/htdocs/ldap>
...
</Direcory>

w obrębie której dostępne są następujące dyrektywy:

AuthLDAPHosts
Specyfikuje nazwy serwerów LDAP, do których będzie następować dowiązanie. Opcjonalnie za nazwą serwera po dwukropku może wystąpić numer portu serwera.
AuthLDAPBindDN
Specyfikuje nazwę wyróżnioną służącą do dowiązania do serwera LDAP. W przypadku jej braku nastąpi dowiązanie anonimowe.
AuthLDAPBindPassword
Specyfikuje hasło dla DN służącego do dowiązania do bazy LDAP.
AuthLDAPBindAsUser
Wartość ustawiona na on specyfikuje aby przy dowiązaniu do bazy używać danych dostarczonych przez przeglądarkę (nazwa użytkownika, hasło). Moduł dowiązuje się wtedy do bazy LDAP używając następującego DN: "AuthLDAPUserKey=nazwa użytkownika, AuthLDAPBaseDN" z hasłem wyspecyfikowanym dyrektywą AuthLDAPPassKey.
AuthLDAPBaseDN
W przypadku, gdy w konfiguracji nie występuje dyrektywa AuthLDAPBindAsUser, specyfikuje DN poddrzewa, od którego moduł zacznie przeszukiwanie bazy LDAP w poszukiwaniu wpisów użytkowników w celu zweryfikowania tożsamości. W przypadku, gdy w konfiguracji występuje dyrektywa AuthLDAPBindAsUser, specyfikuje przyrostek DN-u użytkownika, z którym moduł będzie dowiązywał się do bazy w celu zweryfikowania tożsamości (patrz opis dyrektywy AuthLDAPBindAsUser).
AuthLDAPUserKey
Specyfikuje atrybut, w którym w bazie LDAP znajduje się identyfikator użytkownika.
AuthLDAPSearchScope
Specyfikuje zasięg przeszukiwania poddrzewa. Możliwe wartości: onelevel, subtree.
AuthLDAPPassKey
Specyfikuje atrybut, w którym w bazie LDAP znajduje się hasło użytkownika.
AuthLDAPCryptPasswords
Wartość ustawiona na on specyfikuje, czy włączone jest używanie zaszyfrowanych haseł.
AuthLDAPSchemePrefix
Wartość ustawiona na on specyfikuje, czy włączone jest używanie zaszyfrowanych haseł opatrzonych przedrostkiem, zgodnie z [RFC2307], np. {CRYPT}, {SSHA}.
AuthLDAPGroupKey
Specyfikuje atrybut, w którym w bazie LDAP znajdują się grupy, do których przynależy użytkownik.

Poniżej podajemy przykładową konfigurację dla serwera Apache pozwalającą chronić katalog /usr/local/apache/htdocs/ldap za pomocą omawianego modułu.

<Directory /usr/local/apache/htdocs/ldap>
AuthName "Tylko dla wtajemniczonych"
AuthType Basic
AuthLDAPHosts ldap.uci.uni.torun.pl:389
AuthLDAPBindAsUser on
AuthLDAPBaseDN "ou=Osoby,dc=poczta,dc=umk,dc=pl"
AuthLDAPUserKey cn
AuthLDAPSearchScope onelevel
AuthLDAPSchemePrefix on
require valid-user
</Directory>

Powyższa konfiguracja na serwerze spowoduje, że w trakcie próby dostępu do stron WWW umieszczonych w katalogu /usr/local/apache/htdocs/ldap moduł wykona próbę dowiązania do bazy LDAP umieszczonej na komputerze ldap.uci.uni.torun.pl jako DN cn=username,u=Osoby,dc=poczta,dc=umk,dc=pl.

Ustawień powyższych można dokonywać także w pliku .htaccess w chronionym katalogu. Należy jednak pamiętać aby włączyć tę możliwość za pomocą dyrektywy AllowOverride.

b. mod_auth_ldap v. 2.4

Kompilacja

Rozpakowujemy pakiet mod_auth_ldap.tar.gz do podkatalogu src/modules w drzewie źródeł Apache.
Moduł rozpakuje się nam do podkatalogu modauthldap. W katalogu tym należy skonfigurować moduł.
Lokalizację bibliotek OpenLDAP oraz plików nagłówkowych podajemy w pliku mod_auth_ldap.module. W naszej sytuacji w odpowiednim miejscu w pliku wystarczy dopisać

LDAP_INCLUDES='-I/usr/local/openldap/include'
LDAP_LIBS='-L/usr/local/openldap/lib -lldap -llber'

Przy pierwszym podejściu do kompilacji warto w kodzie modułu w pliku mod_auth_ldap.c odkomentować dyrektywę

#define DEBUG_LDAP 1

dzięki czemu w trakcie pracy moduł będzie generował logi do pliku.

Poniższe komendy wykonane w katalogu ze źródłami Apache skonfigurują nam i statycznie skompilują serwer WWW z modułem mod_auth_ldap.

./configure --prefix=/usr/local/apache --enable-module=so -enable-module=ssl --activate-module=src/modules/modauthldap/mod_auth_ldap.c

make

Z naszego punktu widzenia istotna jest opcja --activate-module=src/modules/modauthldap/mod_auth_ldap.c dołączająca nasz moduł do kompilacji Apache.

Alternatywnie, możliwe jest skompilowanie modułu jako dynamiczny moduł Apache. W tym celu należy w katalogu modauthldap wydać polecenie

/usr/local/apache/bin/apxs -c -I/usr/local/openldap/include -L/usr/local/openldap/lib -lldap -llber mod_auth_ldap.c

Konfiguracja

Standardowo już, w pliku httpd.conf serwera Apache dla chronionego katalogu wpisujemy klauzulę

<Directory /usr/local/apache/htdocs/ldap>
...
</Direcory>

w obrębie której dostępne są następujące dyrektywy:

AuthLDAPAuthoritative
Specyfikuje czy w razie niepowodzenia autentykacji/autoryzacji w przypadku braku danego username czy tez pasującej reguły można dopuszczać autentykację/autoryzację za pomocą modułów niższego poziomu (zdefiniowanych w plikach Configuration oraz modules.c serwera Apache).
Możliwe wartości: on/off.
LDAP_Server
Specyfikuje nazwę serwera LDAP, do którego będzie następować dowiązanie.
LDAP_Port
Specyfikuje numer portu serwera LDAP. Domyślnie jest to 389.
Base_DN
Specyfikuje bazowy DN, od którego moduł rozpoczynać będzie przeszukiwanie bazy LDAP w poszukiwaniu danych służących autentykacji, autoryzacji.
Bind_DN
Specyfikuje nazwę wyróżnioną służącą do dowiązania do serwera LDAP. W przypadku jej braku nastąpi dowiązanie anonimowe.
Bind_Pass
Specyfikuje hasło dla DN służącego do dowiązania do bazy LDAP.
UID_Attr
Specyfikuje nazwę atrybutu, która będzie użyta do przeszukania bazy LDAP w poszukiwaniu danych użytkownika dla autoryzacji.
require
Specyfikuje politykę autoryzacji.
Możliwe formy dyrektywy:

require valid-user
oznacza, że autoryzowany jest dowolny użytkownik, który zaloguje się używając poprawnego identyfikatora i hasła.
require user
po której występuje oddzielona znakami spacji lista identyfikatorów użytkowników, którzy zostaną autoryzowani.
require filter
po której występuje filtr LDAP oznacza, ze autoryzowani będą użytkownicy, których wpisy w bazie LDAP pasują do podanego filtru LDAP.
require group
po której występuje przedrostek grupy oznacza, że autoryzowani będą użytkownicy, których DN-y występują w atrybucie uniquemember wyspecyfikowanej grupy, przy czym moduł konstruuje wpis grupy w bazie LDAP doklejając Base_DN do podanego przyrostka.

Jeśli autentykacja powiedzie się, moduł ustawia dwie zmienne środowiskowe:

LDAP_USER
MOD_AUTH_LDAP_VERSION

zawierające odpowiednio identyfikator użytkownika i wersję modułu.

Poniżej podajemy przykładową konfigurację dla serwera Apache pozwalającą chronić katalog /usr/local/apache/htdocs/ldap za pomocą omawianego modułu.

<Directory /usr/local/apache/htdocs/ldap>
AuthName "Tylko dla wtajemniczonych"
AuthType Basic
LDAP_Server ldap.uci.uni.torun.pl
LDAP_Port 389
Base_DN "dc=poczta,dc=umk,dc=pl"
Bind_DN "cn=search,ou=Osoby,dc=poczta,dc=umk,dc=pl"
Bind_Pass "search"
UID_Attr uid
require group cn=grupa1,ou=Grupy
</Directory>

Powyższa konfiguracja na serwerze spowoduje, że w trakcie próby dostępu do stron WWW umieszczonych w katalogu /usr/local/apache/htdocs/ldap moduł wykona próbę dowiązania do bazy LDAP umieszczonej na komputerze ldap.uci.uni.torun.pl jako DN cn=search,ou=Osoby,dc=poczta,dc=umk,dc=pl, rozpocznie przeszukiwanie drzewa bazy od podanego Base_DN i pozwoli na dostęp tym użytkownikom (spośród tych którzy podadzą prawidłowy identyfikator i hasło), którzy należą do grupy grupa1.

Wygodnym rozwiązaniem, które wnosi ten moduł w stosunku do poprzedniego jest to, ze pozwala na autentykację ze względu na filtr LDAP.
Pozwala to przy odpowiednich założeniach na bazę LDAP, wyszczególniać uprawnione osoby ze względu na przynależność do "naturalnych" grup, np. osoby pracujące w tym samym pomieszczeniu można objąć filtrem "(roomNumber=412)".

c. mod_ldap v. 1.8

Kompilacja

Rozpakowujemy plik mod_ldap1.8.c.tar.gz do podkatalogu src/modules w drzewie źródeł Apache.
Cały moduł to jeden plik mod_ldap.1.8.c. W src/modules zakładamy podkatalog mod_ldap, w którym umieszczamy plik modułu. Dla wygody zmieniamy nazwę pliku na mod_ldap.c. Dodatkowo zakładamy w tym miejscu plik Makefile.tmpl o zawartości:

$(OBJS) $(OBJS_PIC): Makefile

mod_ldap.o: mod_ldap.c

Następnie w pliku src/Configuration.tmpl w drzewie serwera Apache specyfikujemy lokalizację bibliotek OpenLDAP.
W naszej sytuacji w odpowiednim miejscu w pliku wystarczy dopisać:

EXTRA_LIBS=-llber -lldap

Jak zwykle podajemy też (najlepiej w zmiennych środowiskowych LDFLAGS oraz INCLUDES) lokalizację bibliotek i plików nagłówkowych
bibliotek SSL oraz OpenLDAP.

Dopiero teraz możemy przystąpić do konfiguracji serwera Apache.

Poniższe komendy wykonane w katalogu ze źródłami Apache skonfigurują nam i statycznie skompilują serwer WWW z modułem mod_auth_ldap.

./configure --prefix=/usr/local/apache --enable-module=so -enable-module=ssl --activate-module=src/modules/modauthldap/mod_ldap.c

make

Konfiguracja

W pliku httpd.conf serwera Apache dla chronionego katalogu wpisujemy klauzulę

<Directory /usr/local/apache/htdocs/ldap>
...
</Direcory>

w obrębie której dostępne są następujące dyrektywy:

LDAPAuth
Specyfikuje czy autentykacja via LDAP ma być użyta czy też nie.
Możliwe wartości: on/off.
LDAPServer
Specyfikuje URL serwera LDAP. URL serwera LDAP powinien być postaci: "ldap://komputer.org.pl:port/".
LDAPBindName
Specyfikuje nazwę wyróżnioną, która będzie służyć do dowiązania do serwera LDAP.
LDAPBindPass
Specyfikuje hasło dla dowiązania do bazy LDAP (hasło dla DN podanego dyrektywą LDAPBindName).
LDAPBase
Specyfikuje bazowy DN, od którego moduł rozpoczynać będzie przeszukiwanie bazy LDAP w poszukiwaniu danych służących autentykacji, autoryzacji.
LDAPuseridAttr
Specyfikuje nazwę atrybutu, którego wartość zostanie użyta do porównania z podaną w procesie autoryzacji nazwą użytkownika. Domyślnym atrybutem jest userid.
LDAPpasswordAttr
Specyfikuje nazwę atrybutu, którego wartość zostanie użyta do porównania z podanym w procesie autoryzacji hasłem.
UWAGA: w przypadku, gdy na serwerze LDAP hasła są przechowywane w postaci zaszyfrowanej aby moduł pracował prawidłowo należy opuścić omawianą dyrektywę.
LDAPgroupMemberAttr
Specyfikuje nazwę atrybutu, w którym przechowywani są członkowie danej grupy. Domyślna wartość: uniquemember.
LDAPSearchMode
Specyfikuje zasięg przeszukiwania poddrzewa. Możliwe wartości: base, onelevel (domyślny), subtree, compare. Tryb compare jest równoważny base i jest dopuszczalny dla zachowania kompatybilności ze starszymi wersjami.
LDAPUseDNForRemoteUser
Specyfikuje czy przestawić wartość zmiennej środowiskowej REMOTE_USER dla skryptów CGI na pełny DN użytkownika. Domyślna wartość: off
Możliwe wartości: on/off.
require
Specyfikuje politykę autoryzacji.
Możliwe formy dyrektywy:

require valid-user
oznacza, że autoryzowany jest dowolny użytkownik, który zaloguje się używając poprawnego identyfikatora i hasła.
require user
oznacza, że autoryzowany jest konkretny użytkownik. Można wyspecyfikować użytkownika podając identyfikator bądź też pełny jego DN.
require filter
po której występuje filtr LDAP oznacza, ze autoryzowani będą użytkownicy, których wpisy w bazie LDAP pasują do podanego filtru (zgodnie z [RFC1960]).
require group
po której występuje pełny DN grupy oznacza, że autoryzowani będą użytkownicy, których DN-y występują w atrybucie wyspecyfikowanym dyrektywą LDAPgroupMemberAttr.

Poniżej podajemy przykładową konfigurację dla serwera Apache pozwalającą chronić katalog /usr/local/apache/htdocs/ldap za pomocą omawianego modułu.

<Directory /usr/local/apache/htdocs/ldap>
AuthName "Tylko dla wtajemniczonych"
AuthType Basic
LDAPAuth on
LDAPServer "ldap://ldap.uci.uni.torun.pl:389"
LDAPBindName cn=search,ou=Osoby,dc=poczta,dc=umk,dc=pl
LDAPBindPass search
LDAPBase "ou=Osoby,dc=poczta,dc=umk,dc=pl"
LDAPuseridAttr uid
require valid-user
</Directory>

Konfiguracja powyższa realizuje identyczne zadanie jak w poprzednio omawianym module przy czym autoryzowany będzie każdy użytkownik, którego wpis znajduje się w bazie LDAP i który poprawnie dokona autentykacji (poda poprawną nazwę użytkownika i hasło).

d. auth_ldap

Kompilacja

Rozpakowujemy plik auth_ldap-1.6.0.tar.gz. Pakiet rozpakuje się nam do podkatalogu auth_ldap-1.6.0. Zgodnie z zaleceniem autora konfigurujemy moduł jako dynamiczny moduł Apache. W katalogu auth_ldap-1.6.0 wykonujemy:

./configure --with-apxs=/usr/local/apache/bin/apxs  --with-ldap-sdk=openldap --with-sdk-headers=/usr/local/openldap/include --with-sdk-libs=/usr/local/openldap/lib --with-activate

i kompilujemy

make

a następnie instalujemy moduł w odpowiednim miejscu (standardowo w katalogu libexec w drzewie Apache) poleceniem

make install

Opcja --with-activate polecenia configure sprawi, że powyższa komenda spowoduje włączenie modułu w pliku conf/httpd.conf serwera Apache, dokładniej w pliku konfiguracyjnym serwera WWW zostanie automatycznie dołączona opcja

LoadModule   auth_ldap_module    libexec/auth_ldap.so

Konfiguracja

W pliku httpd.conf serwera Apache dla chronionego katalogu wpisujemy klauzulę

<Directory /usr/local/apache/htdocs/ldap>
...
</Direcory>

w obrębie której dostępne są następujące dyrektywy:

AuthLDAPAuthoritative
Specyfikuje czy w razie niepowodzenia autentykacji w przypadku braku danego DN czy reguły pasującej  do  wyspecyfikowanego przez użytkownika username przekazać autentykację do modułów niższego poziomu.
Domyślna wartość: on.
Możliwe wartości: on/off.
AuthLDAPBindDN
Specyfikuje nazwę wyróżnioną służącą do dowiązania do serwera LDAP. W przypadku jej braku nastąpi dowiązanie anonimowe.
AuthLDAPBindPassword
Specyfikuje hasło dla DN służącego do dowiązania do bazy LDAP.
AuthLDAPCompareDNOnServer
Specyfikuje czy moduł ma użyć serwera LDAP do porównania DN-ów. Domyślna wartość: on. W przypadku włączonej opcji oraz użycia dyrektywy require dn, moduł odczyta wyspecyfikowany tą dyrektywą DN z bazy LDAP i porówna go z DN-em uzyskanym z wpisu użytkownika w LDAP. W przypadku ustawienia opcji na off, moduł porównuje wyszukany w bazie DN użytkownika z podanym w dyrektywie require dn metodą porównywania łańcuchów znaków.
Możliwe wartości: on/off.
AuthLDAPDereferenceAliases
Specyfikuje kiedy moduł powinien podążać za aliasami podczas operacji na bazie LDAP. Domyślna wartość: always.
Możliwe wartości: never, searching, finding, always.
AuthLDAPEnabled
Specyfikuje czy autentykacja przy użyciu LDAP ma być włączona. Domyślna wartość: on.
Możliwe wartości: on/off.
AuthLDAPFrontPageHack
Dyrektywa umożliwiająca współpracę z Microsoft Front Page przy skompilowanym Apache z omawianym modułem auth_ldap. Dodatkowe informacje na temat użycia dyrektywy znajdują się pod adresem: http://www.rudedog.org/auth_ldap/1.6/auth_ldap.html#frontpage. Domyślna wartość: off.
Możliwe wartości: on/off.
AuthLDAPGroupAttribute
Specyfikuje nazwę atrybutu, w którym przechowywani są członkowie grupy, przy autentykacji ze względu na przynależność do grupy. Dyrektywy można używać wielokrotnie, specyfikując do 10 różnych atrybutów. W przypadku nie wystąpienia dyrektywy, moduł domyślnie używa artybutów member oraz uniquemember.
AuthLDAPGroupAttributeIsDN
Specyfikuje czy moduł ma używać pełnego DN użytkownika jako jego wpisu przy sprawdzaniu przynależności użytkownika do danej grupy, czy jedynie username wyspecyfikowanego przez użytkownika przy logowaniu. Domyślna wartość: on.
Możliwe wartości: on/off.
AuthLDAPRemoteUserIsDN
Specyfikuje czy wartość zmiennej środowiskowej REMOTE_USER ma być ustawiana na pełny DN autentykowanego użytkownika, czy tylko na dostarczony przez niego username. Domyślna wartość: off.
Możliwe wartości: on/off.
AuthLDAPStartTLS
Specyfikuje czy moduł powinien po połączeniu z bazą LDAP używać bezpiecznych sesji TLS. Wymagana jest przy tym obsługa TLS przez serwer LDAP.
Uwaga: dyrektywa dotyczy tylko oprogramowania OpenLDAP.
AuthLDAPUrl
Specyfikuje URL serwera LDAP zgodnie z [RFC2255]. Wpis powinien być postaci ldap://host:port/basedn?attribute?scope?filter . Np. użycie wpisu
ldap://ldap.uci.uni.torun.pl:389/ou=Osoby,dc=poczta,dc=umk,dc=pl?uid?sub spowoduje, że przeszukiwanie w bazie LDAP będzie typu subtree a poszukiwanym atrybutem będzie uid. Warto tutaj dodać, że użycie w dyrektywie odpowiedniego filtra może być pomocne aby administracyjnie ustalić pewne reguły autentykacji, np. za pomocą filtra (l=Torun) można określić, ze autoryzowane są tylko osoby, które oprócz poprawnego hasła posiadają w bazie atrybut l o wartości Torun.
Uwaga: moduł nie obsługuje przeszukiwania typu base.
Dodatkowe dyrektywy modułu dostępne w konfiguracji serwera Apache:

AuthLDAPCacheSize
Specyfikuje maksymalny rozmiar podstawowej pamięci cache LDAP. Cache ten dotyczy pomyślnie zakończonych operacji search/bind. Ustawienie rozmiaru na 0 powoduje wyłączenie cache-owania dla operacji search/bind. Domyślna wartość: 1024 zapamiętanych operacji.
AuthLDAPCacheTTL
Specyfikuje czas (w sekundach) przez jaki leżący w cache obiekt będzie ważny. Domyślna wartość: 600. Ustawienie czasu na 0 powoduje, że obiekty w cache nigdy nie tracą ważności.
AuthLDAPCertDBPath
Specyfikuje ścieżkę, w której moduł poszukiwać będzie pliku cert7.db zawierającego bazę danych certyfikatów aprobowanych CA. Plik ten jest w formacie identycznym z bazą przeglądarki Netscape Communicator.
AuthLDAPOpCacheSize
Specyfikuje rozmiar pamięci cache używanej do przechowywania wyników przeprowadzonej przez moduł operacji compare na serwerze LDAP. Domyślna wartość: 1024 wpisy. Ustawienie wartości na 0 powoduje wyłączenie cache-owania.
AuthLDAPOpCacheTTL
Specyfikuje czas (w sekundach) przez jaki leżące w cache wpisy będą ważne. Domyślna wartość: 600.
require
Specyfikuje politykę autoryzacji.
Możliwe formy dyrektywy:

require valid-user
oznacza, że autoryzowany jest dowolny użytkownik, który zaloguje się używając poprawnego identyfikatora i hasła.
require user
oznacza, że autoryzowany jest konkretny użytkownik. Więcej niż jednego użytkownika można wyspecyfikować używając więcej niż jednej dyrektywy require user bądź też podając nazwy użytkowników odseparowane znakami spacji. Jeśli nazwa użytkownika zawiera znak spacji musi być wyspecyfikowana jako jedyna w odrębnej linijce.

require group
po której występuje DN grupy oznacza, że autoryzowani będą użytkownicy, których DN występują w atrybucie wyspecyfikowanym dyrektywą AuthLDAPGroupAttribute.
require dn
po której występuje DN użytkownika oznacza, ze autoryzowany będzie użytkownik, którego DN odczytany z bazy zgadza się z podanym w dyrektywie.

Poniżej podajemy przykładową konfigurację dla serwera Apache pozwalającą chronić katalog /usr/local/apache/htdocs/ldap za pomocą omawianego modułu.

<Directory /usr/local/apache/htdocs/ldap>
AuthName "Tylko dla wtajemniczonych"
AuthType Basic
AuthLDAPURL ldap://ldap.uci.uni.torun.pl:389/ou=Osoby,dc=poczta,dc=umk,dc=pl
AuthLDAPBindDN cn=search,ou=Osoby,dc=poczta,dc=umk,dc=pl
AuthLDAPBindPassword search
AuthLDAPRemoteUserIsDN on
AuthLDAPStartTLS on

require valid-user
</Directory>

Konfiguracja powyższa realizuje identyczne zadanie jak w poprzednio omawianym module przy czym włączono opcje użycia TLS i zażądano ustawienia po autentykacji zmiennej REMOTE_USER na pełny DN użytkownika.

e. mod_authz_ldap

Kompilacja

Rozpakowujemy plik mod_authz-ldap-0.21.tar.gz. Pakiet rozpakuje się nam do podkatalogu mod_authz_ldap-0.21.

Następnie ustawiamy w systemie potrzebne do konfiguracji i kompilacji zmienne środowiskowe:

export CPPFLAGS=-I/usr/local/openldap/include
export LDFLAGS=-L/usr/local/openldap/lib

Ponieważ nowsze wersje modułu są przeznaczone wyłącznie do kompilacji dynamicznej w  katalogu mod_authz_ldap-0.21 wykonujemy (dodatkowo warto przy testowej kompilacji włączyć debugowanie):

./configure --with-openssl-path=/usr/local/ssl --with-apxs=/usr/local/apache/bin/apxs --with-debug

i kompilujemy

make

a następnie kopiujemy moduł w odpowiednie miejsce (standardowo do katalogu libexec w drzewie Apache) oraz dodajemy w pliku konfiguracyjnym Apache wpis:

LoadModule authz_ldap_module   libexec/mod_authz_ldap.so

Konfiguracja

W pliku httpd.conf serwera Apache dla chronionego katalogu wpisujemy klauzulę

<Directory /usr/local/apache/htdocs/ldap>
...
</Direcory>

w obrębie której dostępne są następujące dyrektywy:

AuthzLDAPServer
Specyfikuje adres serwera LDAP. Adres serwera LDAP powinien być postaci: "komputer.org.pl:port/" przy czym, w przypadku nie podania numeru portu domyślnie brany jest numer 389.
AuthzLDAPBindDN
Specyfikuje nazwę wyróżnioną służącą do dowiązania do serwera LDAP.
AuthzLDAPBindPassword
Specyfikuje hasło dla DN służącego do dowiązania do bazy LDAP.
AuthzLDAPUserBase
Specyfikuje bazowy DN, od którego moduł rozpoczynać będzie przeszukiwanie bazy LDAP w poszukiwaniu danych użytkowników.
AuthzLDAPUserKey
Specyfikuje nazwę atrybutu, która zostanie użyta do konstrukcji filtra w celu przeszukiwania bazy LDAP w poszukiwaniu danych użytkownika. Domyślna wartość: uid.
AuthzLDAPUserScope
Specyfikuje zasięg przeszukiwania LDAP dla gałęzi użytkowników. Domyślna wartość base.
Możliwe wartości: base,onlevel,subtree
AuthzLDAPGroupBase
Dyrektywa analogiczna do AuthzLDAPUserBase z tym, że w odniesieniu do gałęzi grup.
AuthzLDAPGroupKey
Dyrektywa analogiczna do AuthzLDAPUserKey z tym, że w odniesieniu do gałęzi grup.
AuthzLDAPGroupScope
Dyrektywa analogiczna do AuthzLDAPUserScope z tym, że w odniesieniu do gałęzi grup. Domyślna wartość base.
AuthzLDAPMemberKey
Specyfikuje nazwę atrybutu, w którym przechowywane są nazwy wyróżnione (DN) członków danej grupy. Domyślna wartość: member.
AuthzLDAPUseCertificate
Specyfikuje czy moduł ma użyć dopasowania pól issuer oraz subject certyfikatu klienta w celu zautentykowania użytkownika (dopasowania do DN-u użytkownika w bazie LDAP). Dopasowanie opiera się na zgodności par (issuer, subject) lub też (issuer, serial).Patrz: Uwagi dotyczące certyfikatów. Domyślna wartość off.
Możliwe wartości: on/off.
AuthzLDAPUseLDAP
Dyrektywa ta ma znaczenie tylko przy włączonej dyrektywie AuthzLDAPUseCertificate. Specyfikuje czy moduł przy autentykacji na podstawie certyfikatu powinien dodatkowo pytać o nazwę użytkownika i hasło i potwierdzać je w bazie LDAP. Domyślna wartość off.
Możliwe wartości: on/off.
AuthzLDAPDirect
Specyfikuje czy moduł w celu autentykacji ma używać dopasowania certyfikatu klienta do wartości atrybutu userCertificate wpisu użytkownika w bazie LDAP. W trakcie dopasowania moduł przeszukuje bazę LDAP zaczynając od DN-u wyspecyfikowanego dyrektywą AuthzLDAPUserBase i zasięgiem przeszukiwania określonym przez AuthzLDAPUserScope.Domyślna wartość off.
Możliwe wartości: on/off.
AuthzLDAPUseSerial
Specyfikuje czy przy dopasowaniu certyfikatu klienta do DN-u użytkownika w LDAP użyć numeru seryjnego certyfikatu zamiast pola subject. Domyślna wartość off.
Możliwe wartości: on/off.
AuthzLDAPMapBase
Dyrektywa analogiczna do AuthzLDAPUserBase z tym, że w odniesieniu do gałęzi certyfikatów.
AuthzLDAPMapScope
Dyrektywa analogiczna do AuthzLDAPUserKey z tym, że w odniesieniu do gałęzi certyfikatów. Domyślna wartość: onelevel.
AuthzLDAPSetAuthorization
Specyfikuje czy moduł ma nadpisać nagłówek (Authorization Header) DN-em właściciela certyfikatu przy autentykacji z użyciem certyfikatów. Należy wyłączyć opcję gdy autoryzujemy się do aplikacji wymagającej dodatkowych danych, np. nazwy użytkownika. Domyślna wartość: on.
Możliwe wartości: on/off.
AuthzLDAPRoleAttributeName
Specyfikuje nazwę atrybutu, który zostanie użyty przez moduł do autentykacji z użyciem funkcji (ang. role). Patrz: dyrektywa require role.
AuthzLDAPModifyKey
Specyfikuje nazwę atrybutu przechowującego w bazie LDAP czas ostatniej zmiany hasła przez użytkownika. Patrz: dyrektywa require age.
AuthzLDAPAuthoritative
Specyfikuje czy w razie niepowodzenia autentykacji przekazać autentykację do modułów niższego poziomu. Domyślna wartość: on.
Możliwe wartości: on/off.
AuthzLDAPProxyAuthentication
Autentykacja do serwera proxy. Dyrektywa przydatna, gdy na serwerze Apache pracuje moduł proxy i chcemy autentykować się do jego proxy jak do serwera.
Możliwe wartości: on/off.
AuthzLDAPLogLevel
Specyfikuje poziom gadatliwości komunikatów o błędach generowanych przez moduł. Składnia dyrektywy jest identyczna ze składnią dyrektywy LogLevel serwera Apache. Patrz: LogLevel directive. Domyślna wartość: debug.
Możliwe wartości: emerg, alert, crit, error, warn, notice, info, debug.
AuthzLDAPCacheConnection
Specyfikuje, czy moduł powinien używać pamięci cache przy odwołaniach do bazy LDAP. Domyślna wartość: off.
Możliwe wartości: on/off.
AuthzLDAPCacheSize
Specyfikuje rozmiar pamięci cache. Ustawienie rozmiaru na 0 powoduje wyłączenie cache-owania. Domyślna wartość: 0. Maksymalna wartość nie może przekroczyć wartości ustawionej przy konfiguracji modułu poleceniem configure (opcja  --with-cachesize), którą domyślnie jest 128k.
AuthzLDAPCacheTimeout
Specyfikuje czas (w sekundach) przez jaki leżące w cache wpisy będą ważne. Domyślna wartość: 600, przy czym jest ona przyjmowana również, gdy wyspecyfikowany czas jest dłuższy niż 1 dzień lub jest ujemny. Wartość domyślną można skonfigurować poleceniem configure (opcja --with-timeout).

require
Specyfikuje politykę autoryzacji.
Możliwe formy dyrektywy:

require valid-user
oznacza, że autoryzowany jest dowolny użytkownik, który zaloguje się używając poprawnego identyfikatora i hasła.
require age
po której występuje czas w dniach (może występować z częściami dziesiętnymi, np. 2.5). Dyrektywa zabrania dostępu użytkownikom, którzy zmieniali swoje hasło wcześniej niż podana ilość dni, licząc od daty bieżącej.
require user
oznacza, że autoryzowany jest konkretny użytkownik. Jeśli nie są wyspecyfikowane wartości dyrektyw AuthzLDAPUser*  należy  w dyrektywie  podać pełny DN użytkownika.
require group
po której występuje nazwa grupy oznacza, że autoryzowani będą użytkownicy, będący członkami danej grupy. Grupa musi należeć do klasy obiektów groupOfNames. Dodatkowe parametry dla obsługi grup ustalają dyrektywy AuthzLDAPGroupBase, AuthzLDAPGroupKey, AuthzLDAPGroupScope, AuthzLDAPMemberKey.
require role
po której występuje pewna ustalona wartość. Autoryzowany będą wtedy ci użytkownicy, którzy w swoich wpisach w bazie LDAP posiadają w atrybucie wyspecyfikowanym dyrektywą AuthzLDAPRoleAttributeName daną wartość. Jeśli wartością require role jest *, oznacza to, że autoryzowani są użytkownicy posiadający w swoich wpisach atrybut wyspecyfikowany przez AuthzLDAPRoleAttributeName niezależnie od jego wartości.
require filter
po której występuje opcjonalny zasięg (scope) oraz wyrażenie filtrujące. Jest to uogólnienie dyrektywy require role.  Wyrażenie filtrujące jest filtrem LDAP, przy czym moduł dopuszcza w nim pewnego rodzaju podstawienia:
%% - znak %,
%f - nazwa żądanego od serwera WWW pliku,
%m - nazwa żądanej metody (GET, POST, ...),
%r - nazwa komputera lub IP klienta (identyczna z nazwą czy IP w logach Apache),
%s - nazwa serwera,
%t - bieżący czas w formacie YYYYMMDDhhmmss.
require owner
require group-owner
dotyczą autoryzacji opartej na sprawdzaniu posiadania pliku (model zakłada UNIX-owy styl parametrów plików). Aby używać tych dyrektyw należy skonfigurować moduł używając opcji --with-owner programu configure. Autentykacja tymi metodami nie jest jednak efektywna i zalecana, gdyż zwykle serwer WWW pracuje z niskimi przywilejami i może nie być uprawniony do sprawdzania parametrów plików.

Uwagi dotyczące certyfikatów

Aby używać autentykacji z użyciem certyfikatów klienta należy w w przypadku serwera OpenLDAP dołączyć do  jego plików schematów następujący schemat authzldap.schema:

attributetype ( 1.3.6.1.4.1.4263.5.1 NAME 'issuerDN'
  DESC 'The user friendly version of the distinguished name of the
              issuer of a certificate'
  EQUALITY caseExactIA5Match
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE )

attributetype ( 1.3.6.1.4.1.4263.5.2 NAME 'subjectDN'
  DESC 'The user friendly version of the distinguished name of
              the subject of a certificate'
  EQUALITY caseExactIA5Match
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE )

objectclass ( 1.3.6.1.4.1.4263.5.3 NAME 'authzLDAPmap'
  DESC 'Map Entry for mod_authz_ldap'
  SUP top AUXILIARY
  MUST ( issuerDN $ owner )
  MAY ( subjectDN $ serialNumber $ userCertificate )

Schemat ten możemy znaleźć w pakiecie modułu w podkatalogu ldap.
W bazie LDAP należy też umieścić skrócony opis certyfikatów klientów analogiczny z poniższym:

dn: ou=AuthzLDAPCertmap,dc=poczta,dc=umk,dc=pl
objectclass: top

dn: cn=jerzy,ou=AuthzLDAPCertmap,dc=poczta,dc=umk,dc=pl
objectclass: top
objectclass: authzLDAPmap
issuerDN: /C=PL/ST=kujawsko-pomorskie/L=Torun/O=UMK/OU=UCI/CN=Jerzy Szymanski/Email=Jerzy.Szymanski@uni.torun.pl
subjectDN: /C=PL/ST=kujawsko-pomorskie/L=Torun/O=UMK/OU=UCI/CN=Jerzy Szymanski/Email=jerzy@umk.pl
owner: cn=jerzy,ou=Osoby,dc=poczta,dc=umk,dc=pl

W konfiguracji Apache należy wtedy dodać dyrektywy wzorem:

SSLRequireSSL
AuthzLDAPUseCertificate on
AuthzLDAPMapBase ou=AuthzLDAPCertmap,dc=poczta,dc=umk,dc=pl
AuthzLDAPMapScope subtree
require valid-user


Poniżej podajemy przykładową konfigurację dla serwera Apache pozwalającą chronić katalog /usr/local/apache/htdocs/ldap za pomocą omawianego modułu.

<Directory /usr/local/apache/htdocs/ldap>
AuthName "Tylko dla wtajemniczonych"

AuthType Basic
AuthzLDAPServer ldap.uci.uni.torun.pl:389
AuthzLDAPBindDN cn=search,ou=Osoby,dc=poczta,dc=umk,dc=pl
AuthzLDAPBindPassword search
AuthzLDAPLogLevel debug
require valid-user

</Directory>

Konfiguracja powyższa realizuje identyczne zadanie jak w poprzednio omawianym module.

4. Uwagi / konkluzje

1. Moduł 3a
- Nie udało się wykorzystać autoryzacji ze względu na grupy (dyrektywa require group).
- Obecnie nie rozwijany moduł.
- Wersja wyłącznie statyczna.
2. Moduł 3b
- Pomimo, że autor pisze, że dyrektywa 'require group' nie działa w przypadku serwera OpenLDAP,
dyrektywa ta działa prawidłowo.
3. Moduł 3c
- Moduł wyłącznie statyczny.
- Dyrektywa LDAPUseDNForRemoteUser działa błędnie: niezależnie od przełącznika on/off zachowuje się jak gdyby była na on.
5. Moduł 3d
- Dyrektywa AuthLDAPCompareDNOnServer musi być jawnie ustawiona na on mimo, ze wg dokumentacji jest to opcja domyślna.
- Jedyny moduł wśród przetestowanych używający TLS do połączenia z LDAP.
7. Moduł 3e
- Mimo, ze część dyrektyw występuje w dokumentacji modułu - nie są one zaimplementowane. np. AuthzLDAPEngine, AuthzLDAPProtocolVersion.
- Nie udało się wykorzystać autentykacji ze względu na certyfikaty klienta.

8. Warto przyglądać się pracom związanym z Apache 2.x. Do wersji 2.0.41 i wyższych równolegle z serwerem Apache powstaje moduł do autentykacji przy wsparciu LDAP. Niestety na razie jest to wersja eksperymentalna. Wspiera jednak SSL (dla Netscape SDK) oraz TLS (dla OpenLDAP 2.x SDK). Patrz. Polecane linki.

Bibliografia

[RFC1960] T. Howes, A String Representation of LDAP Search Filters, Request for Comments 1960, June 1996.
[RFC2255] T. Howes, M.Smith, The LDAP URL format, Request for Comments 2255, December 1997.
[RFC2307] L. Howard, An Approach for Using LDAP as a Network Information Service, Request for Comments 2307, March 1998.

Polecane linki

http://httpd.apache.org/docs-2.0/mod/mod_auth_ldap.html - dokumentacja modułu autoryzacji via LDAP dla Apache od wersji 2.0.41 wzwyż.