Jerzy Szymański , UCI, Toruń 2002

Przegląd metod współpracy usługi katalogowej LDAP z aplikacjami użytkowymi do obsługi poczty elektronicznej

0 Wstęp

Przegląd obejmuje 2 webowe interfejsy pocztowe : Squirrelmail w wersji 1.2.4 i IMP w wersji 3.0 dla środowiska Horde 2.0 oraz Sylpheed-Claws (klient poczty elektronicznej oparty na GTK+ ) w wersji 0.7.0 .  Jako serwer LDAP użyty został  serwer slapd  z pakietu OpenLDAP w wersji 2.0.23 .  Jako serwer WWW użyty został serwer Apache w wersji 1.3.22 z obsługą PHP v. 4.1.1 dołączoną jako moduł dynamiczny. Instalacje służące przeglądowi zostały przeprowadzone w systemie Linux RedHat 7.2 .
 

1 Przygotowanie bazy danych

1.1  Struktura testowej bazy danych
1.2  Istotne pozycje konfiguracyjne serwera slapd
1.3  Plik LDIF zawierający bazę adresową
1.4  Zainicjowanie bazy danych

1.1  Struktura testowej bazy danych

Pzykładowa baza danych, do której będą odwoływać się aplikacje pocztowe będzie zawierać adresy pracowników UCI. Będzie posiadać ona przyrostek 'dc=UCI,dc=PL' . Wyodrębnimy w nim jedno poddrzewo ou=Pracownicy.  W poddrzewie tym umieszczone zostaną wpisy poszczególnych osób.

ou=Pracownicy,dc=UCI,dc=PL                        - poddrzewo, które zawierać będzie wpisy z danymi pracowników
cn=jerzy,ou=Pracownicy,dc=UCI,dc=PL    - DN przykładowego wpisu

Struktura bazy wygląda zatem następująco:

Struktura bazy

Każdy wpis  na poziomie ou=Pracownicy,dc=uci,dc=pl należy do klasy obiektów inetOrgPerson i posiada następujące atrybuty: cn, sn, title, organizationName, streetAddress, l, st, postalCode, mail, telephoneNumber .

1.2 Istotne pozycje konfiguracyjne serwera slapd.

Pakiet OpenLDAP został zainstalowany w katalogu /usr/local/openldap a jego aplikacje odwołują się do plików konfiguracyjnych umieszczonych w katalogu /etc/openldap .

Plik /etc/openldap/slapd.conf wygląda następująco:

# Dołączenie potrzebnych schematów

include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema

# Ustawienie poziomu logowania umożliwiającego śledzenie przetwarzania przez serwer ACL-i .

loglevel        384

# Definicja bazy, w której będą przechowywane adresy

database        ldbm
suffix          "dc=UCI,dc=PL"
rootdn          "cn=root,dc=UCI,dc=PL"
rootpw          {SSHA}f/n3fk8Oo5Y0Jcv/rxy/0/ntITzcqLOO

# Ustawienie prawa do czytania dla wszystkich dla poddrzewa o wierzchołku: ou=Pracownicy,dc=UCI,dc=PL

access to dn=".*,ou=Pracownicy,dc=UCI,dc=PL"
          by * read

# Katalog, w którym zostanie umieszczona baza danych

directory       /usr/local/openldap/var/openldap-ldbm

# Indeksy

index   objectClass     eq

1. 3 Plik LDIF zawierający bazę adresową

Został utworzony plik LDIF o nazwie adresy.ldif z danymi do bazy o następującej zawartości

dn: dc=UCI,dc=PL
objectClass: dcObject
objectClass: organization
o: Uczelniane Centrum Informatyczne
dc: UCI

dn: ou=Pracownicy, dc=UCI, dc=PL
ou: Pracownicy
objectClass: top
objectClass: organizationalUnit

dn: cn=jerzy,ou=Pracownicy,dc=UCI,dc=PL
cn: Jerzy Szymanski
sn: Szymanski
objectclass: inetOrgPerson
title: ml. programista
organizationName: PSU
streetAddress: Chopina 12/18
l: Torun
st: kujawsko-pomorskie
postalCode: 87-100
mail: Jerzy.Szymanski@uni.torun.pl
telephoneNumber: +48566113372

dn: cn=jan,ou=Pracownicy,dc=UCI,dc=PL
cn: Jan Kowalski
sn: Kowalski
objectclass: inetOrgPerson
title: st. programista
organizationName: PSU
streetAddress: Chopina 12/18
l: Torun
st: kujawsko-pomorskie
postalCode: 87-100
mail: Jan.Kowalski@uni.torun.pl
telephoneNumber: +48566113372

.......

Dalej w pliku występują kolejne wpisy dla poszczególnych osób.

1.4  Zainicjowanie bazy danych

Wprowadzamy dane do serwera LDAP za pomocą komendy:

/usr/local/openldap/bin/ldapadd -x -D "cn=root,dc=UCI,dc=PL" -w haslo -f adresy.ldif

Przed uruchomieniem ldapadd należy upewnić się czy w systemie jest uruchomiony proces slapd.

2 Squirrelmail

2.1 Metody współpracy z LDAP
2.2 Konfiguracja
2.3 Komentarz

2.1 Metody współpracy z LDAP

Standardowo współpraca Squirrelmail z LDAP polega na umożliwieniu włączenia w aplikacji opcji globalnej książki adresowej. Oznacza to, że oprócz właściwej danemu użytkownikowi prywatnej książki adresowej, którą program Squirrelmail przechowuje lokalnie na dysku twardym w postaci pliku tekstowego, możliwe jest udostępnienie wspólnej dla wszystkich użytkowników programu książki adresowej, która umiejscowiona jest w bazie LDAP.
Użytkownicy, którzy zalogują się przez WWW do programu Squirrelmail mogą w pełni funkcjonalnie korzystać z obu rodzajów książek adresowych. W szczególności dla książek adresowych LDAP Istnieje też możliwość wyspecyfikowania wielu różnych serwerów LDAP, które przechowują adresy emailowe i udostępnienie ich w Squirrelmail.

Niewątpliwą wadą aplikacji jest to, że w obecnej wersji nie jest możliwe dowiązanie do bazy LDAP inne niż anonimowe. Naraża to nasze dane adresowe na niebezpieczeństwo ujawnienia osobom niepowołanym.

2.2 Konfiguracja

Aby aplikacja mogła działać poprawnie, moduł PHP serwera Apache powinien być skompilowany z następującymi opcjami konfiguracyjnymi programu configure : --enable-track-vars --enable-force-cgi-redirect --with-gettext

Ponieważ pakiet Squirrelmail jest napisany w języku PHP, wystarczy więc rozpakować pakiet w katalogu dostępnym serwerowi WWW, np. w katalogu htdocs/squirrel . Dalszej konfiguracji dokonuje się w podkatalogu squirrel/config. Korzystając z umieszczonego tam przykładowego pliku konfiguracyjnego config_default.php należy w tym katalogu utworzyć własny plik konfiguracyjny o nazwie config.php. Włączenie możliwości korzystania z bazy LDAP polega na umieszczeniu w tym pliku co najmniej jednego wpisu postaci:

$ldap_server[nr] = array(
    'host' => 'Adres serwera LDAP',
    'base' => 'Podstawowy DN bazy',
    'name' => 'Opis książki adresowej',
    'port' => 'Nr portu serwera LDAP',
    'charset' => 'Symbol standardu kodowania znaków przez serwer LDAP',
    'maxrows' => 'Maksymalna ilość wierszy w wynikach wyszukiwania'
);

W przypadku naszej testowej bazy danych zakładając, że serwer LDAP pracuje na komputerze lokalnym, konfiguracja może wyglądać następująco:

$ldap_server[0] = array(
    'host' => 'localhost',
    'base' => 'dc=Pracownicy,dc=UCI,dc=PL',
    'name' => 'Baza adresów',
    'port' => '389',
    'charset' => 'utf-8',
    'maxrows' => '30'
);

W miejscu nr wpisujemy kolejno od 0 numery serwerów LDAP (w przypadku, gdy chcemy korzystać z większej ilości serwerów) i
zapisujemy dla nich oddzielne konfiguracje wg powyższego schematu.

W typowej sytuacji, gdy serwer LDAP pracuje na porcie 389 oraz używa standardu kodowania znaków utf-8 i nie potrzebujemy ograniczeń co do maksymalnej ilości pozycji w wynikach wyszukiwania, wystarczy następująca konfiguracja

$ldap_server[0] = array(
    'host' => 'localhost',
    'base' => 'dc=Pracownicy,dc=UCI,dc=PL',
    'name' => 'Baza adresów',
);

Aby wspomóc administratorów w tworzeniu i wprowadzaniu zmian w konfiguracji, w katalogu squirrel/config autorzy programu zamieścili prosty, lecz bardzo funkcjonalny skrypt konfiguracyjny conf.pl . Z pomocą tego skryptu można łatwo ustawić wszelkie opcje programu. Dodatkowo, konfigurując program skryptem, dla każdej wprowadzanej pozycji dostępny jest krótki opis jej przeznaczenia.

2.3 Komentarz

Warto zwrócić uwagę, że wśród dostępnych pluginów rozszerzających możliwości Squirrelmail-a jest kilka, które są godne uwagi szczególnie wtedy, gdy posiadamy bądź planujemy wykorzystywać LDAP do autentykacji użytkowników przeprowadzanej przez serwer IMAP. Są to: Instalację pluginów można przeprowadzić bardzo łatwo korzystając ze skryptu conf.pl. W pakiecie z pluginem zawarta jest jego krótka charakterystyka i opis czynności instalacyjnych. Wszystkie powyższe pluginy dla Squirrelmail -a można znaleźć pod adresem http://www.squirrelmail.org/plugins.php .

3. IMP (Internet Messaging Program)

3.1 Metody współpracy z LDAP
3.2 Konfiguracja
3.3 Komentarz

3.1 Metody współpracy z LDAP

IMP, analogicznie jak Squirrelmail, współpracuje z LDAP na zasadzie korzystania z książki adresowej opartej na bazie LDAP.

W rzeczywistości książka adresowa realizowana jest przez oddzielny moduł Horde o nazwie Turba . Moduł ten pozwala na dostęp do książki adresowej z poziomu dowolnej aplikacji dla środowiska Horde. Dostępną w nim książkę adresową łatwo można zintegrować z IMP-em w ten sposób, że z poziomu użytkownika widoczna jest ona jako jedna z pozycji w menu tego programu. Turba pozwala także na korzystanie z wielu książek adresowych umieszczonych na różnych serwerach LDAP. Jedną z jej zalet jest też to, że można wybrać atrybuty (np. imię, nazwisko, adres emailowy), według których możliwe będzie wyszukiwanie osoby w książce.

Istotną rzeczą jest to, że Turba pozwala na dowiązanie do bazy LDAP z podaniem DN-u użytkownika oraz hasła. Umożliwia to w połączeniu z odpowiednią konfiguracją praw dostępu do bazy na serwerze LDAP szczegółowe ustalenie praw dostępu z poziomu książki adresowej do danych umieszczonych na serwerze LDAP z dokładnością do poszczególnych atrybutów wpisów.

Reasumując, zalety książki adresowej Turba to:

Oprócz możliwości korzystania z książki opartej na LDAP w trybie read-only aplikacja umożliwia również modyfikowanie danych w książce. Niestety kod programu dotyczący korzystania z LDAP nie jest jeszcze przetestowany w dostatecznym stopniu i zdarza się, że nie działa poprawnie, bądź działa tylko część z jego funkcji. Mankament ten dotyczy wszystkich wspomnianych tutaj komponentów Horde. Dodatkowym kłopotem jest też, że w obecnej wersji Turba nie potrafi dynamicznie zmienić DN-u z jakim dowiązuje się do LDAP-a w zależności od użytkownika, który w danej chwili korzysta z książki.

3.2 Konfiguracja

Podobnie jak Squirrelmail, IMP jest aplikacją napisaną w języku PHP. Instalację pakietu przeprowadza się też podobnie, choć są pewne różnice. Aplikacja jest modułem dla środowiska Horde. Oznacza to, ze przed zainstalowaniem IMP-a należy zainstalować i poprawnie skonfigurować środowisko Horde. W typowej sytuacji polega to na umieszczeniu pakietu w katalogu htdocs/horde oraz modyfikacji plików w katalogu horde/conf. Najważniejsze opcje konfiguracyjne programu zawarte są w pliku horde/config/horde.php . Następnie np. w podkatalogu horde/imp umieszczamy pliki programu IMP, dokonujemy rejestracji aplikacji w środowisku Horde (polega ona na umieszczeniu odpowiedniego wpisu w pliku horde/config/registry.php) oraz konfigurujemy program (katalog horde/imp/config). Analogicznie, pliki modułu Turba umieszczamy w podkatalogu horde/turba i dokonujemy rejestracji w Horde.

Do poprawnego działania Horde wymagane jest, by moduł PHP dla serwera Apache skompilowany był z następującymi opcjami programu configure : --with-gettext --with-xml --with-mysql --with-ldap --with-imap .

Istnieje możliwość sprawdzenia, czy serwer WWW, PHP oraz Horde jest prawidłowo skonfigurowane. Należy połączyć się przeglądarką z testową stroną Horde:
http://nazwa_naszego_serwera_WWW/horde/test.php.
Strona ta poinformuje nas czy posiadamy poprawnie skonfigurowane środowisko do pracy Horde.

Moduł Turba odpowiada za obsługę książek adresowych, więc wszelkich wpisów związanych z testową bazą danych dokonujemy w jego plikach konfiguracyjnych - katalog turba/config.

Definicji książek dokonujemy w pliku turba/config/sources.php . Wpis dla pojedyńczej książki adresowej LDAP w tym pliku dla testowej bazy danych może wyglądać następująco:

$cfgSources['ldap_abook'] = array(
    'title' => 'książka LDAP',
    'type' => 'ldap',
    'params' => array(
        'server' => 'localhost',
        'port' => 389,
        'root' => 'ou=Pracownicy,dc=UCI,dc=PL',
        'dn' => array('cn'),
        'objectclass' => 'inetOrgPerson',
        'objectclass' => 'top',
        'filter' => ''
    ),
    'map' => array(
        '__key' => 'dn',
        'name' => 'cn',
        'email' => 'mail',
        'alias'  => 'sn',
        'title'  => 'title',
        'workPhone' => 'telephonenumber',
        'organizacja' => 'organizationname',
        'miejscowosc' => 'l'
    ),
    'search' => array(
        'name',
        'email',
        'alias'
    ),
    'strict' => array(
        'dn'
    ),
    'public' => true,
    'readonly' => true,
    'export' => false
);

Omówimy ważniejsze opcje na powyższym przykładzie.

W tablicy params podajemy parametry dotyczące serwera LDAP i opis bazy z danymi.
W tablicy map specyfikujemy żądane atrybuty, które aplikacja ma wyświetlać dla danego wpisu. Powyżej zażądano wyświetlania pól: cn, mail, sn, title, telephoneNumber, organizationName, l.
Wszystkie atrybuty wpisów, rozpoznawane przez Turbę zdefiniowane są w pliku turba/config/attributes.php . W powyższym przykładzie do listy zostały dodane dwa dodatkowe pola: organizacja oraz miejscowosc . Aby aplikacja zezwoliła na ich użycie, do pliku turba/config/attributes.php został dodany następujący opis tych pól:

$attributes['organizacja'] = array(
    'type' => 'text',
    'desc' => _("Organization")
);
$attributes['miejscowosc'] = array(
    'type' => 'text',
    'desc' => _("City")
);

Następna tablica - search, zawiera nazwy atrybutów, dla których żądamy by możliwe było wyszukiwanie wg nich osób w książce adresowej.
Za pomocą parametru public ustala się, czy definiowana książka jest dostępna do czytania dla wszystkich.
Parametr readonly wskazuje, czy możliwe będzie zapisywanie danych do książki.

W przypadku gdy chcemy, by dostęp do danych osobowych opierał się na DN użytkownika i haśle, należy parametr public ustawić na false oraz w tablicy params dodać następujące pozycje:

'bind_dn' => 'DN użytkownika',
'bind_password' => 'tajne_hasło',

Użyty tutaj DN powinien posiadać prawo do czytania danych z bazy LDAP. Wygodne jest tutaj utworzenie do tego celu specjalnego użytkownika, choć zachowując szczególną ostrożność można użyć do tego celu także DN-u "cn=root,dc=UCI,dc=PL ". W przypadku tym należy koniecznie ustawić opcję readonly na true, a w obu przypadkach należy pamiętać by plik turba/config/sources.php w systemie był dostępny do czytania wyłącznie dla użytkownika, z którego prawami pracuje serwer WWW.

Niedociągnięciem programu jest to, ze w tablicy map nie można używać dużych liter alfabetu w nazwach atrybutów wpisu, co jest powszechnie praktykowane w schematach LDAP. Np. w powyższym przykładzie zapisanie wartości workPhone jako telephoneNumber spowoduje, że przy opisie osoby, nr telefonu nie zostanie wyświetlony. Należy koniecznie użyć zapisu telephonenumber .

Następnie możemy dołączyć pozycję książki adresowej do menu programu IMP, umieszczając  w pliku horde/imp/config/conf.php linijkę

$conf['menu']['apps'] = array('turba');

(przy założeniu, że moduł Turba został standardowo zarejestrowany w Horde pod nazwą "turba")

3.3 Komentarz

Warto wspomnieć o możliwości przeprowadzenia autoryzacji do środowiska Horde poprzez LDAP. Niestety kod Horde jest jeszcze niedopracowany w tym względzie i nawet po prawidłowym skonfigurowaniu aplikacja co prawda autentykuje i zachowuje się poprawnie, lecz przy pierwszym logowaniu przedstawia użytkownikowi nieuzasadnione ostrzeżenia (Warnings).

Uwagę zwraca również słaba dokumentacja dotycząca konfigurowania (oraz samych możliwości) wszelkich funkcji związanych z LDAP. Dotyczy to ponownie wszystkich omawianych komponentów Horde.

4. Sylpheed-Claws

4.1 Konfiguracja
4.2 Metody współpracy z LDAP
 

4.1 Konfiguracja


Konfiguracja nie nastręcza kłopotów. Wymagania programu to w zasadzie tylko posiadanie zainstalowanej biblioteki GTK+ w wersji 1.2.6 lub wyższej. Jeśli nie wymagamy dodatkowych własnych ustawień i mamy zainstalowany OpenLDAP, po rozpakowaniu źródeł, możemy skonfigurować program poleceniem:

configure  --prefix=/usr/local/sylphed --enable-ldap --disable-imlib --disable-gdk-pixbuf

Następnie kompilujemy kod programu poleceniem make oraz instalujemy skompilowany program za pomocą make install.

4.2 Metody współpracy z LDAP

Program sam w sobie jest dość ciekawy, ponieważ oferuje wygodny, dość intuicyjny interfejs użytkownika. Jednocześnie posiada sporo opcji dotyczących obsługi skrzynek pocztowych i list news-owych. Jednak z punktu widzenia LDAP, ważne jest, że bez kłopotu współpracuje z serwerem LDAP udostępniając wewnątrz programu książkę adresową. Książka ta posiada możliwości Program jest łatwo "konfigurowalny". Konfiguracji dokonuje się za pomocą menu, podczas pracy z programem.

5. Uwagi

Warto wspomnieć, że oprócz wspomnianych powyżej istnieją też inne aplikacje do obsługi skrzynek poczty elektronicznej wykorzystujące LDAP. Starym, dobrze znanym przykładem jest chociażby Netscape Communicator . Także Mutt (popularny tekstowy klient pocztowy) posiada możliwość integracji z LDAP.