Home / Community / Blog

LDAP authentication is build in eZ Publish by default - the only thing to do is configuration.

To use LDAP you have to add line

LoginHandler[]=LDAP

in settings/override/site.ini.append.php file in section UserSettings. In my file it looks like this:

[UserSettings]
LogoutRedirect=/
LoginHandler[]=LDAP

In new file settings/override/ldap.ini.append.php you have to specify all connection settings. In my case it looks like this:

[LDAPSettings]
LDAPServer=127.0.0.1
LDAPBaseDn=ou--users,dc--jaqb,dc--gda,dc--pl
LDAPBindUser=cn--ldap-connect-user,ou--users,dc--jaqb,dc--gda,dc--pl
LDAPBindPassword=SecretPassword

The double minus sign is entered instead of equal sign. You can change this using LDAPEqualSign variable.

As you can see, I've created special user only to bind to LDAP server, because my server doesn't allow anonymous bind and you have to enter password in plain text.

When you clear ini cache you can login using LDAP account.

When I've used ldapsearch, I've noticed that not every attribute I can search is displayed.

For example I can search locked accounts:

ldapsearch -x -H ldap://ldap.mydomain.com -W \
-D "cn=jaqb,dc=mydomain,dc=com" \
-b "ou=Users,dc=mydomain,dc=com" \
"(pwdAccountLockedTime=*)"

but pwdAccountLockedTime attribute is not displayed.

According to ldapsearch manual you have to add + (plus sign) do filter attributes. Now it looks like this:

ldapsearch -x -H ldap://ldap.mydomain.com -W \
-D "cn=jaqb,dc=mydomain,dc=com" \
-b "ou=Users,dc=mydomain,dc=com" \
"(pwdAccountLockedTime=*)" "+"

, but now "normal" attributes aren't shown. To show both regular and operational attributes you have add * (asterisk sign):

ldapsearch -x -H ldap://ldap.mydomain.com -W \
-D "cn=jaqb,dc=mydomain,dc=com" \
-b "ou=Users,dc=mydomain,dc=com" \
"(pwdAccountLockedTime=*)" "+" "*"

There is another search attribute 1.1 - not to show any attributes:

ldapsearch -x -H ldap://ldap.mydomain.com -W \
-D "cn=jaqb,dc=mydomain,dc=com" \
-b "ou=Users,dc=mydomain,dc=com" \
"(pwdAccountLockedTime=*)" 1.1

sometimes useful in scripts.

Skoro już mam postawionego LDAP to przydałoby się wykorzystać ich również do logowania się do strony. Robi się to bardzo prosto.

W pliku ezpublish_legacy/settings/override/site.ini.append.php (dla starszych wersji bez ezpublish_legacy) w sekcji UserSettings trzeba dopisać

LoginHandler[]=LDAP

a następnie skonfigurować parametry połączenia. Ja skopiowałem plik settings/ldap.ini do settings/override/ldap.ini.append.php i tam zmieniłem:

LDAPServer=ldap.domain.local
LDAPBaseDn=ou--Users,ou--MyOrganization,dc--domain,dc--local
LDAPBindUser=someuser
LDAPBindPassword=somepassword

(w zasadzie w tym pliku wystarczy zrobić tylko powyższe wpisy w sekcji LDAPSettings) po przeładowaniu plików ini w panelu administracyjnym mogłem się zalogować kontem z LDAP.

Do działania oczywiście potrzebna jest obsługa LDAP w PHP, w CentOS pakiet nazywa się (cóż za niespodzianka!) php-ldap.

Jak już postawiłem usługę katalogową, to chciałem użyć jej do autoryzacji do repozytoriów SVN do których był dostęp przez Apache.

W sumie jest to proste:

<IfModule mod_dav.c>
    <Location /svn>
        DAV svn
        SVNParentPath /var/lib/svn/repositories
        SVNListParentPath on
        AuthType Basic
        AuthName "Dostep do repozytorium"
        AuthBasicProvider ldap
        AuthLDAPURL "ldap://localhost/dc=jaqb,dc=gda,dc=pl" NONE
        AuthLDAPBindDN "cn=Manager,dc=jaqb,dc=gda,dc=pl"
        AuthLDAPBindPassword jakiesmocnehaslo
        AuthLDAPGroupAttribute memberUid
        AuthLDAPGroupAttributeIsDN off
        Require ldap-group cn=svnowcy,ou=groups,dc=jaqb,dc=gda,dc=pl
    </Location>
</IfModule>

kluczowe są dwa wpisy:

AuthLDAPGroupAttribut memberUid
AuthLDAPGroupAttributeIsDN off

bez tego Apache zakładał, że użytkownicy są wpisani jako member lub uniquemember i na dodatek jako np.:

uid=jaqb,ou=People,dc=jaqb,dc=gda,dc=pl

a domyślnie LAM zakłada jako np.: jaqb w memberUid.

Redmine ma możliwość integracji z usługami katalogowymi. Chciałem mojego połączyć z OpenLDAP który postawiłem.

Po zalogowaniu się na konto administratora w zakładce Administration jest LDAP authentication. Tam wybrałem New authentication mode i wpisałem:

     Name: mój zajefajny serwerek
     Host: localhost
     Port: 389
  Account: cn=Manager,dc=jaqb,dc=gda,dc=pl
  Base DN: ou=users,dc=jaqb,dc=gda,dc=pl

nie jest zaznaczone LDAPS, ale musi być zaznaczone On-the-fly user creation - to oznacza, że jak użytkownik z OpenLDAP loguje się po raz pierwszy w Redmine to zostanie mu automatycznie założone konto (w Redmine). Jeżeli to nie jest zaznaczone, to musielibyśmy najpierw takiemu delikwentowi założyć konto w Redmine i wskazać, że ma się autoryzować przez OpenLDAP.

Dalej w Attributes wpisałem:

     Login: uid
First name: givenName
 Last name: sn
      Mail: mail

.

Po zatwierdzeniu pokazała się tabelka w której widać było nowo utworzone połączenie. Można je teraz przetestować. Jeżeli wszystko jest OK zastanawiamy się, czemu Users jest 0 skoro w bazie OpenLDAP jest ich kilka setek (no w każdym razie przeważnie więcej niż 1). Otóż ta liczba to liczba użytkowników z autoryzowanych w Redmine przez dane połączenie, więc na początek 0 jest OK.

Teraz można się wylogować z konta administratora. Zalogować na użytkownika z OpenLDAP. Ucieszyć, że działa. Wylogować. Zalogować jeszcze raz na administratora i przekonać, że Users się zmieniło.

Pakiety

Zaczynamy od instalacji pakietów:

yum install openldap-servers openldap-clients

od razu można ustawić, żeby serwer (slapd) się włączał automatycznie:

chkconfig --add slapd
chkconfig slapd on

na razie go nie włączam.

Jedna ważna uwaga. W pakiecie openldap jest używany plik /etc/openldap/ldap.conf, ale niektóre pakiety (np.: kiedyś nss_ldap, a obecnie pam_ldap) używają pliku /etc/ldap.conf lub /etc/pam_ldap.conf. Dwa różne plik z konfiguracją powodują problemy, dlatego zwykle kasuję plik /etc/ldap.conf i w jego miejsce tworzę link symboliczny o takiej samej nazwie wskazujący na /etc/openldap/ldap.conf:

rm /etc/ldap.conf
rm /etc/pam_ldap.conf
ln -s /etc/openldap/ldap.conf /etc/ldap.conf
ln -s /etc/openldap/ldap.conf /etc/pam_ldap.conf

Skopiowałem domyślną konfigurację bazy i ustawiłem uprawnienia:

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap:ldap /var/lib/ldap

Dostosowałem wartości olcSuffix i olcRootDN w pliku

/etc/openldap/slapd.d/cn=config/olcDatabase={2}bdb.ldif

u mnie wyglądają tak:

olcSuffix: dc=jaqb,dc=gda,dc=pl
olcRootDN: cn=Manager,dc=jaqb,dc=gda,dc=pl

Wygenerowałem skrót hasła (haslo) poleceniem slappasswd:

slappasswd -u
New password:
Re-enter new password:
{SSHA}B6+pPk3uabUwf034GKcToi3a75A44Jws

i ustawiłem je w konfiguracji jakże oczywistą komendą:

echo "olcRootPW: {SSHA}B6+pPk3uabUwf034GKcToi3a75A44Jws" >> \
/etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif

od razu ustawiłem, żeby akceptował połączenia szyfrowane zmieniłem wartość SLAPD_LDAPS w pliku /etc/sysconfig/ldap na yes:

SLAPD_LDAPS=yes

i uruchomiłem serwer

/etc/init.d/slapd start

Otworzyłem port dla połączeń szyfrowanych:

iptables -I INPUT -p tcp --dport 636 -j ACCEPT

Teraz już można podłączyć się do serwera za pomocą polecenia:

ldapsearch -H ldaps:// localhost -D "cn=Manager,dc=jaqb,dc=gda,dc=pl" -W

nic tam nie ma bo baza jest pusta a na dodatek certyfikat może być nie pasujący, ale można się podłączyć.

GUI

Ściągnąłem i zainstalowałem obsługę LDAP w PHP i LDAP Account Manager'a:

yum install php-ldap
wget "http://downloads.sourceforge.net/project/lam/LAM/3.9/ldap-account-manager-3.9-0.fedora.1.noarch.rpm?r=&ts=1355006390&use_mirror=netcologne"
rpm -i ldap-account-manager-3.9-0.fedora.1.noarch.rpm

(jest już dostępna wersja 4.0.RC1).

W przypadku SElinux'a trzeba zmienić kontekst pliku lam.conf (i kilku innych potrzebnych później):

setenforce Permissive
chcon -t httpd_t /var/lib/ldap-account-manager/config/lam.conf
chcon -t httpd_t /var/lib/ldap-account-manager/config/config.cfg
chcon -t httpd_t /var/lib/ldap-account-manager/config/profiles/default.user
setenforce Enforcing

lub od razu dla całego katalogu:

setenforce Permissive
chcon -R -t httpd_t /var/lib/ldap-account-manager/config
setenforce Enforcing

Teraz można się zalogować do LAM przez adres:

http://adres.ip.kompuerta.lub.nazwa/lam

Najpierw wypadałoby zmienić domyślne hasło. W tym celu w prawym górnym rogu kliknąć LAM configuration. i wejść w Edit general settings. Domyślne hasło to lam. Nowe hasło ustawić w ramce Change master password.

Teraz należy dostosować konfigurację. Znowu w prawym górnym rogu kliknąć LAM configuration. Tam trzeba wejść w Edit server profiles, zmienić w zakładce General settings: Tree suffix - w zależności od domeny i w ramce Security settings hasło i List of valid users - tam wpisałem

cn=Manager,dc=jaqb,dc=gda,dc=pl

a w zakładce Account types: LDAP suffix dla każdego z typów kont. U mnie wygląda to tak

ou=users,dc=jaqb,dc=gda,dc=pl
ou=groups,dc=jaqb,dc=gda,dc=pl
ou=machines,dc=jaqb,dc=gda,dc=pl
dc=jaqb,dc=gda,dc=pl

dla odpowiednio Users, Groups, Hosts i Samba domains.

Teraz można się zalogować wpisując ustawione wcześniej hasło. Przy pierwszym logowaniu baza jest pusta, więc LAM wyświetli komunikat podobny do tego:

The following suffixes are missing in LDAP. LAM can create them for you.
ou=users,dc=jaqb,dc=gda,dc=pl
ou=groups,dc=jaqb,dc=gda,dc=pl
ou=machines,dc=jaqb,dc=gda,dc=pl
dc=jaqb,dc=gda,dc=pl

kliknięcie Create jest równoznaczne zaimportowaniu pliku init.ldiff o zawartości:

# jaqb.gda.pl
dn: dc=jaqb,dc=gda,dc=pl
objectClass: organization
objectClass: dcObject
dc: jaqb
o: jaqb

# users, jaqb.gda.pl
dn: ou=users,dc=jaqb,dc=gda,dc=pl
objectClass: organizationalUnit
ou: users

# groups, jaqb.gda.pl
dn: ou=groups,dc=jaqb,dc=gda,dc=pl
objectClass: organizationalUnit
ou: groups

# machines, jaqb.gda.pl
dn: ou=machines,dc=jaqb,dc=gda,dc=pl
objectClass: organizationalUnit
ou: machines

pliku poleceniem

ldapadd -H ldap://localhost -D "cn=Manager,dc=jaqb,dc=gda,dc=pl" -W -f init.ldiff

Zakładanie użytkowników

Chciałem, żeby użytkownicy byli rozróżniani po uid'zie, więc zmieniłem w Tools, Profile editor domyślny profil (default) dla użytkowników RDN identifier na uid i przy okazji zmieniłem domyślną powłokę (Login shell) na /bin/false.

Najpierw trzeba założyć grupę - nazwałem ją wszyscy.

Potem wystarczy wypełnić wymagane pola, oznaczone gwiazdką. Tak naprawdę wystarczy nazwisko (Last name), resztę uzupełni LAM jak przejdziemy na zakładkę Unix. LAM przyjmuje konwencję nazwy użytkownika jako pierwsza litera imienia i nazwisko, dla Jana Kowalskiego będzie to jkowalski.

Teraz wystarczy skonfigurować inne usługi by korzystały z usługi katalogowej.

Pojawiła się (w lipcu ;-) nowa wersja całkiem przyjemnego narzędzia do przeglądania drzewa LDAP - JXplorer.

Just my blog...

Mon Tue Wed Thu Fri Sat Sun
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31