Strona główna BSD Apache + LDAP

Apache + LDAP

przez CoreBlog

Apache jest jednym z najczęściej wykorzystywanych serwerów httpd. Jeśli skompilujemy go razem z modułem mod_authnz_ldap, będziemy mieli możliwość uwierzytelniania użytkowników poprzez katalog LDAP.

Korzystając z mechanizmu portów instalujemy serwer apache:

cd /usr/ports/www/apache22
make install clean

Przy wyborze opcji wybieramy LDAP oraz AUTHNZ_LDAP.

Teraz możemy przejść do skonfigurowania modułu. Na początek sprawdźmy czy te dwie poniższe linijki znajdują się w pliku konfiguracyjnym /usr/local/etc/apache22/httpd.conf:

LoadModule ldap_module libexec/apache22/mod_ldap.so
LoadModule authnz_ldap_module libexec/apache22/mod_authnz_ldap.so

Powinny być one dodane automatycznie podczas instalacji apache. Jeśli jednach ich nie ma dopiszmy je na końcu listy dytektyw LoadModule.

Nadanie uprawnień użytkownikowi składa się z 2 faz. W pierwszej fazie uwierzytelnienia sprawdzana jest poprawność pary danych: loginu oraz hasła. W drugiej fazie moduł rozstrzyga, czy uwierzytelniony użytkownik ma prawo dostępu do zasobu.

Konfigurację przeprowadzamy wewnątrz dyrektywy

<Directory "/usr/local/www/apache22/data">
    AuthName "Private ZONE"
    AuthType basic
    AuthBasicProvider ldap
    AuthLDAPURL "ldap://localhost:389/ou=people,dc=firma,dc=bogus"
 
    Require ldap-user "test"
</Directory>

Trzy dytektywy: AuthLDAPURL, AuthLDAPBindDN oraz AuthLDAPBindPassword biorą udział w pierwszej fazie uwierzytelnienia. Pierwsza z nich jest obowiązkowa, pozostałe dwie są opcjonalne. Konfigurując AuthLDAPURL określamy adres serwer LDAP, korzeń DN, atrybut wykorzystywany podczas operacji wyszukiwania oraz dodatkowe filtry przeszukiwania. W przykładzie podałem jedynie korzeń, od którego ma nastąpić wyszukanie użytkownika. Rozszerzony zapis wyglądałby na przykład tak:

AuthLDAPURL "ldap://localhost:389/ou=people,dc=firma,dc=bogus?uid?sub?(objectClass=*)"

AuthLDAPBindDN oraz AuthLDAPBindPassword określają DN oraz hasło, które mają być użyte podczas logowania do serwera LDAP. Te parametry wykorzystywane są w przypadku, gdy konfiguracja ACL’i serwera LDAP nie pozwala dostęp nie uwierzytelnionemu użytkownikowi.

Druga faza odpowiada za autoryzację użytkownika. Aby nadać użytkownikowi dostęp do danego zasobu, należy użyć dyrektywy Require. Możliwe są poniższe konfiguracje:

•Require ldap-user – sprawdzana jest nazwa użytkownika
•Require ldap-dn – porównywany jest DN zwrócony przez serwer LDAP
•Require ldap-group – sprawdzane jest czy użytkownik należy do grupy
•Require ldap-attribute – sprawdzany jest konkretny atrybut
•Require ldap-filter – podobnie jak wyżej, ale wyszukanie przeprowadzone jest na całym katalogu wykorzystując filtr, a nie poprzez proste porównanie atrybutów

Uwaga! Jeśli używamy wartości Required dla innego modułu, to aby możliwa była autoryzacja, dyrektywa AuthzLDAPAuthoritative musi mieć ustawioną wartość off.

OK. Czas rozszerzyć te suche informacje o przykłady. Sam korzystam głównie z dyrektywy ‘Require ldap-user’, aczkolwiek przydatne jak dla mnie są też ‘Require ldap-group’ oraz ‘Require ldap-attribute’.

Require ldap-user

W tej dytektywie podajemy nazwę użytkownika (lub użytkowników), który ma mieć przyznany dostęp do zasobu. Jeśli nie skonfigurowaliśmy atrybutu, po którym dokonywane jest sprawdzenie, użyty zostanie atrybut ‘uid’.

Require ldap-user test janek

Jeśli w dytektywie AuthLDAPURL (AuthLDAPURL ldap://localhost:389/ou=people,dc=firma,dc=bogus?cn) podaliśmy atrybut ‘cn’ jako ten, po którym ma być dokonywane sprawdzenie, dyrektywa Require może wyglądać tak:

Require ldap-user “Jan Kowalski”

W przypadku kilku użytkowników

Require ldap-user “Jan Kowalski”
Require ldap-user “Adam Nowak”

Należy pamiętać, że może to być problematyczne, jeśli kilka osób w tym samym katalogu ma podobne cn, ponieważ wyszukanie po atrybucie cn musi zwrócić dokładnie jeden wpis. Dlatego polecam przeszukiwać katalog po atrybucie uid, który jest unikalny.

Require ldap-group

W tej dyrektywie podajemy grupę, której członkowie mają mieć przyznany dostęp do zasobu, na przykład:

Require ldap-group cn=webaccess,ou=groups,dc=firma,dc=bogus

Dodatkowe zachowanie możemy skonfigurować za pomocą tych dwóch opcji:

AuthLDAPGroupAttribute – za pomocą tej dyrektywy określamy które atrybuty mają być użyte w celu sprawdzenia członkostwa w grupie (standardowo member oraz uniquemember)
AuthLDAPGroupAttributeIsDN Directive – jeśli ma wartość on (standardowo) sprawdzany jest DN. Jeśli off sprawdzana jest nazwa użytkownika(uid).

Require ldap-attribute

Sprawdzana jest wartość atrybutu

Require ldap-attribute employeeType=active

I na sam koniec jeszcze kilka dodatkowych przykładów.

Aby nadać uprawnienia wszystkim użytkownikom w bazie:

AuthLDAPURL "ldap://localhost:389/ou=people,dc=firma,dc=bogus?uid?sub?(objectClass=*)"
Require valid-user

Podobnie jak w przykładzie powyżej uprawnienia zostaną nadane wszystkim użytkownikom, przy czym podaliśmy 2 serwery LDAP:

AuthLDAPURL "ldap://localhost backup_ldap.firma.local/ou=people,dc=firma,dc=bogus"
Require valid-user

W tym przykładzie uprawnienia otrzymają wszyscy użytkownicy, którzy dodatkowo są aktywnymi pracownikami.

AuthLDAPURL ldap://localhost:389/ou=people,dc=firma,dc=bogus?uid??(employeeType=active)
Require valid-user

A co jeśli chcemy nadać uprawnienia wszystkim aktywnym pracownikom oraz komuś kto na przykład nie jest pracownikiem firmy?

AuthLDAPURL ldap://localhost:389/ou=people,dc=firma,dc=bogus?uid??(|(employeeType=active) (uid=dziennikarz))
Require valid-user

Powyższe przykłady pokazują, że rozszerzając dyrektywę AuthLDAPURL o dodatkowe opcję, możemy (poprzez wprowadzenie do wpisu użytkownika dodatkowego atrybutu) w prosty sposób zarządzać dostępem do odpowiednich zasobów.

Virtual Hosts z LDAP
mod_cfg_ldap pozwala na przechowywanie konfiguracji hostów wirtualnych w katalogu LDAP i uaktualnianie jej w czasie rzeczywistym.

Korzystając z mechanizmu portów instalujemy moduł mod_cfg_ldap:

cd /usr/ports/www/mod_cfg_ldap
make install clean

Przed uruchomieniem tego modułu musimy skopiować schemat LDAP:

cp /usr/local/share/doc/mod_cfg_ldap/mod_cfg_ldap.schema /usr/local/etc/openldap/schema/mod_cfg_ldap.schema

Następnie dodajmy go do konfiguracji serwera LDAP (/usr/local/etc/openldap/slapd.conf)

include         /usr/local/etc/openldap/schema/mod_cfg_ldap.schema

i zrestartujmy serwer:

/usr/local/etc/rc.d/slapd restart

Teraz możemy zacząć konfigurację modułu w serwerze Apache. W tym celu musimy dodać 2 wpisy do pliku konfiguracyjnego /usr/local/etc/apache22/httpd.conf. Pierwszy z nich załaduje moduł podczas startu serwera. Podczas instalacji ta linijka zostanie dodana automatycznie, należy ją tylko odznaczyć:

LoadModule cfg_ldap_module    libexec/apache22/mod_cfg_ldap.so

Drugi dołączy konfigurację modułu:

Include etc/apache22/extra/cfg_ldap.conf

Teraz tworzymy w katalogu /usr/local/etc/apach22/extra plik cfg_ldap.conf zawierający poniższą konfigurację:

<IfModule mod_cfg_ldap.c>
    EnableCfgLdap on
    CfgLdapUseTLS off
    #CfgLdapTrustedCA "/etc/apache2/ssl/ca.crt"
    CfgLdapServer "localhost"
    CfgLdapBindDN "cn=admin,dc=firma,dc=bogus"
    CfgLdapCredentials "secret"
    CfgLdapBaseDN "ou=apache,dc=firma,dc=bogus"
    # if you don't want to use any filter just keep the following
    CfgLdapFilter "(objectClass=apacheConfig)"
    # otherwise you could filter based on cosine.schema's ARecord
    # CfgLdapFilter "(|(ARecord=127.0.0.1)(ARecord=127.0.0.2))"
    CfgLdapCacheTTL 60
</IfModule>

Restartujemy serwer apache:

/usr/local/etc/rc.d/apache22 restart

Na sam koniec dodajemy wpisy do katalogu LDAP:

# Wpis 1: ou=apache,dc=firma,dc=bogus
dn: ou=apache,dc=firma,dc=bogus
ou: apache
objectclass: organizationalUnit
objectclass: top
 
# Wpis 2: ou=my_virtual_host,ou=apache,dc=firma,dc=bogus
dn: ou=my_virtual_host,ou=apache,dc=firma,dc=bogus
apacheDocumentRoot: /usr/local/www/apache22/data/my_virtual_host_directory
apacheServerName: my_virtual_host
objectClass: organizationalUnit
objectClass: top
objectClass: apacheConfig
ou: my_virtual_host

Aby wszystko zadziałało musimy jeszcze dodać rekord my_virtual_host do serwera DNS.

Powiązane artykuły

Napisz komentarz