Maja Górecka-Wolniewicz
Uczelniane Centrum Informatyczne UMK
Maja.Wolniewicz@uni.torun.pl

Analiza możliwości zastosowania protokołu LDAP
w serwerach poczty elektronicznej

(opracowanie przygotowane w ramach realizacji zadań projektu KBN)

Data opracowania: 07.03.2002

Spis treści
  1. LDAP jako serwer bazy użytkowników
  2. Przechowywanie tablic konfiguracyjnych serwera poczty
  3. Realizacja routingu poczty elektronicznej
  4. Integracja przykładowych serwerów poczty z LDAP-em
    1. Sendmail
    2. Qmail
    3. Cyrus IMAP/POP
    4. IMAP University of Washington
    Bibliografia

Protokół LDAP może wspomagać pracę serwerów poczty elektronicznej. Istnieją różnorodne aspekty zastosowania LDAP-a w serwerach pocztowych działających według protokołów SMTP (sendmail, qmail), IMAP, czy POP3 (rozwiązania projektu Cyrus z Carnegie Mellon oraz implementacje University of Washington).

1. LDAP jako serwer bazy użytkowników

Po pierwsze LDAP może udostępniać serwerom bazę użytkowników systemu pocztowego. Przydzielenie użytkownikowi skrzynki pocztowej w takiej sytuacji nie koniecznie musi oznaczać, że użytkownik dysponuje kontem w systemie.

Serwer SMTP przyjmując pocztę sprawdza, czy dany użytkownik jest znany w systemie. Nie musi w tym procesie korzystać z systemowego pliku haseł (/etc/passwd), w wyszukaniu użytkownika może pośredniczyć serwer LDAP lub można korzystać z innych, zdefiniowanych w systemie źródeł danych. Dzieje się tak dzięki odpowiedniej konfiguracji usługi zwanej Name Service Switch (NSS). Mechanizm ten został opracowany przez firmę Sun w celu ujednolicenia procedur stosowanych w celu dotarcia przez stację kliencką, czy aplikację sieciową do informacji dotyczącej sieci komputerowej. Takie podejście jest stosowane m.in. w systemach Solaris oraz Linux. Bazuje na zastosowaniu pliku nsswitch.conf, który steruje sposobem doboru źródeł informacji. Typowo dane dotyczące użytkowników, grup, stacji komputerowych, protokołów, czy zdefiniowanych sieci są pobierane z plików lub z usługi NIS (Network Information Service). Podejście NSS jest uniwersalne i stosunkowo łatwo można rozszerzać źródła danych. Między innymi w ramach PADL Software powstał moduł nss_ldap umożliwiający korzystanie z usługi katalogowej LDAP. Serwer LDAP, z którym współpracuje NSS przechowuje dane zgodne z definicją zawartą w dokumencie [RFC2307]. Jeśli w systemowym pliku nsswitch.conf wskazano usługę katalogową LDAP jako źródło bazy danych passwd; np. jest w nim wiersz:

passwd ldap files

to użytkownik o danym identyfikatorze jest najpierw poszukiwany w zasobach LDAP, potem w pliku /etc/passwd.
Wskazanie lokalizacji serwera LDAP jest umieszczane w pliku konfiguracyjnym usługi NSS w danym systemie, typowo jest to plik /etc/ldap.conf, w wierszu:

host nazwa_hosta

Należy pamiętać, że nazwa_hosta musi być rozstrzygalna bez pomocy usługi LDAP.
W wierszu base tego pliku ustala się bazę przeszukiwania danych na serwerze LDAP (poprzez podanie nazwy wyróżnionej wpisu traktowanego jako korzeń obszaru przeszukania). Ważna jest postać danych o użytkownikach, które są przechowywane w zasobach LDAP. NSS działa zgodnie z RFC2307, dlatego w celu definiowania użytkowników należy korzystać z schematu NIS przedstawionego w tym dokumencie. Standardowo NSS szuka w bazie LDAP użytkownika za pomocą filtra o postaci:

"(&(objectClass=posixAccount)(uid=nazwa))"

czyli użytkownik musi być reprezentowany w bazie danych za pomocą klasy obiektów posixAccount.
Więcej szczegółów na temat połączenia usługi NSS z LDAP-em można znaleźć w części "Zarządzanie kontami użytkowników w unixowym systemie komputerowym".

W opisanym powyżej rozwiązaniu realizacja bazy użytkowników za pomocą usługi LDAP jest funkcją zintegrowaną z systemem operacyjnym, na którym działa serwer pocztowy. Takie podejście nie wymaga więc żadnej specjalnej konfiguracji serwera poczty SMTP, którego zadaniem jest przyjmowanie poczty kierowanej do użytkowników systemu oraz wysyłanie maili.

Serwery POP/IMAP odgrywają w systemie nieco inną rolę - obsługują zlecenia użytkownika dotyczące skrzynki pocztowej (otwarcie skrzynki, pobranie kolejnego listu itp.). W tym przypadku nie jest wystarczające stwierdzenie, że dany użytkownik istnieje w systemie. Niezbędne jest również jego uwierzytelnienie, czyli sprawdzenie, czy dane dostarczone w celu weryfikacji tożsamości są poprawne. Taki proces jest standardowo realizowany w oparciu o parę danych (identyfikator, hasło). Również w tej sytuacji można wykorzystać LDAP-a. Tym razem współpraca LDAP-a z systemem operacyjnym jest realizowana za pomocą rozwiązania nazywanego w skrócie PAM (Pluggable Authentication Module), które jest standardowo stosowane od kilku lat w większości popularnych systemów unixowych ([RFC86.0]). W najnowszych systemach operacyjnych właśnie PAM jest odpowiedzialny za realizację procesu uwierzytelnienia użytkownika ubiegającego się o prawo korzystania z usługi sieciowej. PAM działa w oparciu o zestaw modułów, które mogą być rozbudowywane w celu zaimplementowania w systemie nowych metod uwierzytelniania. Odpowiednia konfiguracja PAM-a umożliwia dopasowanie sposobu uwierzytelnienia do lokalnych potrzeb, m.in. zastosowanie usług katalogowych LDAP. Odbywa się to przez dodanie modułu pam_ldap.so przygotowanego dla danego systemu operacyjnego oraz zgodną z intencjami konfigurację (katalog /etc/pam.d w Linuxie lub plik /etc/pam.conf w Solarisie). Oprogramowanie pam_ldap jest dostarczane również w ramach PADL Software (pam_ldap.tgz). Jeżeli sam system operacyjny korzysta z PAM-a, to ta technika dostępu może być stosowana w dowolnej usłudze sieciowej. Gdy serwer POP/IMAP działa w systemie nie korzystającym standardowo z PAM-a, to można wymusić tego typu pracę dla konkretnej aplikacji. Służy do tego protokół SASL, Simple Authentication and Security Layer ([RFC2222]).

2. Przechowywanie tablic konfiguracyjnych serwera poczty

Większość serwerów pocztowych korzysta z dodatkowych plików do przechowywania różnego typu danych konfiguracyjnych, np. aliasów, stacji wirtualnych, tablic zawierających dodatkowe odwzorowania adresów (tzw. mapy). Sendmail stosuje również z tzw. klasy, które są tworzone za pomocą plików lub zewnętrznych programów. W tym zakresie można również zastosować usługę LDAP. W zasobach LDAP można umieszczać tablice pomocnicze sendmaila, a sam serwer pocztowy tak skonfigurować, że potrzebne dane są pobierane za pomocą zapytań przekazywanych do serwera LDAP. Szczegółowe rozwiązania zostaną przedstawione dalej, przy opisie konkretnych implementacji serwerów (p. 4). Oczywiście takie rozwiązanie wymaga zastosowania odpowiedniego schematu danych w bazie LDAP (p. 4a). Zaletą przechowywania aliasów, map i klas w bazie LDAP jest poprawa bezpieczeństwa tych danych oraz ułatwienie zarządzania. Takie podejście nie wymaga również żadnych dodatkowych czynności po wniesieniu modyfikacji do bazy LDAP, podczas gdy typowo aktualizacja danych w plikach systemowych wiąże się z koniecznością realizacji dodatkowych operacji (np. wywołanie polecenia newaliases czy makemap w celu utworzenia właściwej wersji bazy danych, albo wręcz restart serwera poczty). Z kolei w serwerze qmail LDAP może pośredniczyć w ustalaniu dodatkowych danych o użytkownikach oraz definiować takie parametry, jak maksymalny dopuszczalny rozmiar skrzynki pocztowej (p. 4b).

3. Realizacja routingu poczty elektronicznej

W styczniu 2001 w serii Internet-Draft została opublikowana druga wersja schematu LDAP służącego do definiowania informacji, z której aplikacje sieciowe mają korzystać do realizacji routingu poczty w ramach intranetu (draft-lachman-laser-ldap-mail-routing-02.txt, [LachmanI-D]). Często zdarza się, że uzasadniona jest konfiguracja serwisu pocztowego w ten sposób, że z zewnątrz jest widoczny jeden serwer obsługujący całą domenę, tymczasem w ramach domeny chcemy niezależnie realizować routing poczty do lokalnych serwerów (tzw. routing intranetowy).
Temu problemowi wychodzi naprzeciw dokument [LachmanI-D]. Definiuje on jedną klasę obiektów - inetLocalMailRecipient oraz kilka atrybutów specyficznych dla tej klasy. Jeśli serwer SMTP ma realizować routnig zgodnie z tą specyfikacją, to baza LDAP musi zawierać odpowiednie dane, zgodne z rekomendowanym schematem routingu. Jedna z pierwszych implementacji tego podejścia jest zintegrowana z programem sendmail.

4. Integracja przykładowych serwerów poczty z LDAP-em

Poniżej zostały przedstawione możliwości poszczególnych pakietów implementujących serwery poczty elektronicznej (protokołów SMTP, POP, IMAP) w zakresie współpracy z usługą katalogową LDAP.

a. Sendmail

Zastosowanie LDAP-a do obsługi aliasów, map i klas

Aby włączyć zastosowanie LDAP-a w sendmailu musi zostać zdefiniowana stała LDAPMAP, np. poprzez wpisanie w pliku devtools/Site/site.config.m4 wiersza:
APPENDDEF(`confMAPDEF', `-DLDAPMAP')
Jeśli biblioteki OpenLDAP-a i/lub SSL-a (gdy LDAP współpracuje z SSL-em - takie podjeście jest zalecane) znajdują się w niestandardowym miejscu, to w pliku devtools/Site/site.config.m4 dopisujemy również wiersze:
	
APPENDDEF(`confINCDIRS', `-I/opt/LDAP/include -I/opt/SSL/include')
APPENDDEF(`confLIBDIRS', `-L/opt/LDAP/lib -L/opt/SSL/lib -Xlinker -R/opt/LDAP/lib -Xlinker -R/opt/SSL/lib')
APPENDDEF(`confLIBS', `-lldap -llber -lssl -lcrypto')	
Jeśli korzystamy z wersji 2.x serwera LDAP, to w celu współpracy z programem sendmail musi zostać włąćzona w pliku konfiguracyjnym slapd.conf opcja
	allow bind_v2
Można wyspecyfikować własne reguły odwzorowania za pomoca LDAP-a lub skorzystać z reguł wbudowanych. Wbudowana, czyli domyślna specyfikacja sposobu realizacji odwzorowania za pomoca LDAP-a dostarcza metody dopasowywania na podstawie: (1) pełnej kwalifikowanej nazwy stacji (odpowiednik makra $j w konfiguracji sendmaila) lub (2) nazwy klastra. Wprowadzenie pojęcia klastra pozwala na współdzielenie wpisów umieszczonych w bazie LDAP przez wiele stacji, bez konieczności wpisywania nazw tych stacji do bazy katalogowej. Aby ustalić nazwę klastra LDAP-owskiego należy w konfiguracji m4 serwera (czyli w pliku .mc, na podstawie którego program m4 wyprodukuje właściwy plik konfiguracyjny serwera) zdefiniować zmienną confLDAP_CLUSTER; np. poniższe przypisanie nadaje klastrowi nazwę Serwery:

define(`confLDAP_CLUSTER', `Serwery')

Do obsługi aliasów, map i klas poprzez LDAP-a sendmail stosuje własny schemat, który można znaleźć w dystrybucji pakietu w pliku sendmail.schema. Schemat ten należy włączyć do konfiguracji serwera LDAP, dodając do pliku slapd.conf wiersz:
include /opt/LDAP/etc/openldap/schema/sendmail.schema

Schemat sendmaila definiuje sześć klas obiektów:

Wprowadzono też nowe atrybuty:

Definicja aliasów

Aby sendmail korzystał z LDAP-a do obsługi aliasów należy w konfiguracji m4 serwera następująco zdefiniować wartość ALIAS_FILE:
define(`ALIAS_FILE', `ldap:')
Taka definicja sprawia, że będzie używana domyślna procedura, implementująca następującą metodę przeszukiwania zasobów LDAP:
ldap -k (&(objectClass=sendmailMTAAliasObject)
                  (|(sendmailMTACluster=${sendmailMTACluster})
                  	(sendmailMTAHost=$j))
                  (sendmailMTAKey=%0))
     -v sendmailMTAAliasValue
Oznacza to, że w bazie LDAP jest wyszukiwany wpis określony za pomocą filtru podanego w opcji -k, tj. wpis spełniający następujące warunki: Jako wynik wyszukania będzie przekazywana wartość atrybutu sendmailMTAAliasValue. Można ustalić własny sposób realizacji procesu wyszukania danych aliasowych w bazie LDAP, np. podając poniższą definicję:
define( ALIAS_FILE, 
	ldap:-k (&(objectClass=mailAlias)(uid=%0)) -v "uniqueMember,uniqueAlias")
W tej sytuacji w celu znalezienia aliasu będzie poszukiwany wpis należący do klasy mailAlias mający wartość atrybutu uid równą wartości przekazanej w zapytaniu. Wynikiem przeszukania będzie wartość atrybutu uniqueAlias.

Oto przykład danych, które załadowane do bazy LDAP sprawią, wyszukanie aliasu dla klucza będącego lokalnym adresem Maja.Wolniewicz zwróci wartość mgw (zakłada się, że jest stosowane domyślne ustawienie wyszukiwania):

dn: sendmailMTAKey=Maja.Wolniewicz, dc=uci, dc=uni, dc=torun, dc=pl
objectClass: sendmailMTA
objectClass: sendmailMTAAlias
objectClass: sendmailMTAAliasObject
sendmailMTAAliasGrouping: aliases
sendmailMTAHost: smtp.uci.uni.torun.pl
sendmailMTAKey: Maja.Wolniewicz
sendmailMTAAliasValue: mgw
W podobny sposób realizuje się obsługę list mailowych. W tej sytuacji zazwyczaj określa się więcej niż jedną wartość atrybutu sendmailMTAAliasValue.

We wszystkich prezentowanych przykładach zamiast podawania atrybutu sendmailMTAHost można zdefiniwać wartość atrybutu sendmailMTACluster, by skorzystać z możliwości udostępnienia aliasu na kilku serwerach klastra.

Definicja map

Mapy są definiowane w konfiguracji m4 sendmaila za pomocą dyrektywy FEATURE. W pierwszym argumencie podaje się nazwę mapy (dopuszczalne nazwy to access_db, authinfo, bitdomain, domaintable, genericstable, mailertable, uucpdomain, virtualdomain). Drugi argument określa rodzaj mapy i jej nazwę (np. `dbm /etc/mail/virtusers'). W celu korzystania z danych dostarczanych przez serwer LDAP należy podać w drugim argumencie wartość `LDAP', np.
FEATURE(`genericstable', `LDAP').
Taka definicja spowoduje, że do wyszukiwania danych będzie używana następująca formuła:

Kgenerics ldap 
	-1 
	-k 	(&(objectClass=sendmailMTAMapObject)
			(|(sendmailMTACluster=${sendmailMTACluster})
				(sendmailMTAHost=$j))
			(sendmailMTAMapName=generics)
			(sendmailMTAKey=%0))
	-v sendmailMTAMapValue 
czyli w bazie LDAP jest poszukiwany klucz określony za pomocą filtru podanego w opcji -k, tj. wpis spełniający następujące warunki: Jako wynik wyszukania będzie przekazywana wartość atrybutu sendmailMTAMap, przy czym opcja -1 sprawia, że w przypadku, gdy istnieje kilka wartości tego atrybutu odbierany wynik wskazuje, że nie znaleziono odpowiedniego dopasowania.
Poniższy przykład pokazuje, jak należy przygotować dane, by spełniały one funkcję mapy generics.
dn: sendmailMTAMapName=generics, dc=uci, dc=uni, dc=torun, dc=pl
objectClass: sendmailMTA
objectClass: sendmailMTAMap
sendmailMTAHost: smtp.uci.uni.torun.pl
sendmailMTAMapName: generics

dn: sendmailMTAKey=Maja.Wolniewicz, sendmailMTAMapName=generics, dc=uci, 
	dc=uni, dc=torun, dc=pl
objectClass: sendmailMTA
objectClass: sendmailMTAMap
objectClass: sendmailMTAMapObject
sendmailMTAMapName: generics
sendmailMTAHost: smtp.uci.uni.torun.pl
sendmailMTAKey: mgw
sendmailMTAMapValue: Maja.Wolniewicz@uni.torun.pl
W tym przypadku zostaną załadowane do bazy LDAP dane realizujące odwzorowanie adresu wyjściowego mgw na adres Maja.Wolniewicz@uni.torun.pl.

Definicja klas

Jest również możliwe użycie LDAP-a do definicji klas, z których korzysta sendmail. Do klas stosowanych w tym programie należą m.in. klasy: R definiująca tzw. domeny relayowania (ustalenie, jak serwer postępuje z pocztą dla danej domeny) oraz G używana razem z mapą generics do określenia domen uwzględnianych w pełnej nazwie kwalifikowanej. Użycie w definicji klasy argumentu `@LDAP', np. umieszczenie w konfiguracji m4 serwera wierszy:

 
GENERICS_DOMAIN_FILE(`@LDAP')
RELAY_DOMAIN_FILE(`@LDAP')
oznacza, że klasy G i R będą korzystały z przeszukiwań LDAP-a, stosując domyślny filtr, np. w przypadku klasy G:
F{R}@ldap:-k	(&(objectClass=sendmailMTAClass)
		(sendmailMTAClassName=G)
		(|(sendmailMTACluster=${sendmailMTACluster})
			(sendmailMTAHost=$j)))
	-v 	sendmailMTAClassValue
czyli w bazie LDAP jest wyszukiwany klucz określony za pomocą filtru podanego w opcji -k, tj. wpis spełniający następujące warunki: Jako wynik wyszukania będzie przekazywana wartość atrybutu sendmailMTAClassValue.

Oto przykładowa postać danych dotyczących klas G oraz R:

dn: sendmailMTAClassName=G, dc=uci, dc=uni, dc=torun, dc=pl
objectClass: sendmailMTA
objectClass: sendmailMTAClass
sendmailMTAHost: smtp.uci.uni.torun.pl
sendmailMTAClassName: G
sendmailMTAClassValue: uci.uni.torun.pl
sendmailMTAClassValue: smtp.uci.uni.torun.pl

dn: sendmailMTAClassName=R, dc=uci, dc=uni, dc=torun, dc=pl
objectClass: sendmailMTA
objectClass: sendmailMTAClass
sendmailMTAHost: smtp.uci.uni.torun.pl
sendmailMTAClassName: R
sendmailMTAClassValue: uci.uni.torun.pl

Realizacja routingu poczty w intranecie

Właczenie dyrektywy FEATURE(`ldap_routing') w konfiguracji m4 serwera sendmail oznacza, że będą impementowane własności zawarte w dokmencie Internet-Draft Lachmana i Shapiro, draft-lachman-laser-ldap-mail-routing-02.txt. Jest wówczas możliwe oparte na LDAP-ie routowanie poszczególnych adresów mailowych do innego serwera lub pod inny adres. Poszukiwanie w zasobach LDAP jest realizowane najpierw z pełnym adresem docelowym odbiorcy (np. user@aaa.pl), a następnie, w przypadku niepowodzenia, z adresem ograniczonym do części domenowej (np. @aaa.pl). Domena, której dotyczy routing za pomocą LDAP-a jest definiowana poleceniem:
LDAPROUTE_DOMAIN(`aaa.pl')
Można również użyć definicji LDAPROUTE_EQUIVALENT() i LDAPROUTE_EQUIVALENT_FILE() do wskazania równoważnie traktowanych domen. Domeny równowane są odwzorowywane na wartość określaną makrem $M (maskaradowana nazwa stacji) przed realizacją zapytania do serwera LDAP.

Zgodnie z dokumentem [LachmanI-D] do potrzeb routingu intranetowego jest używana jedna klasa obiektów - inetLocalMailRecipient. Klasa ta jest podporzadkowana klasie top. Zdefiniowano również trzy nieobowiązkowe atrybuty tej klasy:

mailLocalAddress
określa zgodny z RFC822 adres odbiorcy maila
mailHost
określa pełną kwalifikowaną nazwę serwera poczty, który jest faktycznym serwerem SMTP danego użytkownika
mailRoutingAddress
określa zgodny z RFC822 adres używany, gdy mail jest routowany do innego serwera.

Dyrektywa FEATURE(`ldap_routing') włącza domyślne procedury postępowania. Istnieje jednak możliwość dostosowania postaci zapytań do indywidualnych potrzeb. Służą do tego dodatkowe argumenty w poleceniu FEATURE():

FEATURE(`ldap_routing', <mailHost>, <mailRoutingAddress>, <bounce>, <detail>)

<mailHost>
definicja mapy określającej, jak należy poszukiwać nazw alternatywnych serwerów dla danego adresu; domyślna definicja:
ldap -1 -v mailHost 
	-k 	(&(objectClass=inetLocalMailRecipient)
    		(mailLocalAddress=%0))
(wyszukujemy wpis należący do klasy inetLocalMailRecipient, którego wartość atrybutu mailLocalAddress jest równa wartości podanej w zapytaniu, zostaje zwrócona wartość atrybutu mailHost, ale tylko gdy atrybut ten jest jednowartościowy)
<mailRoutingAddress>
definicja mapy określającej, jak należy poszukiwać alternatywnego adresu dla danego adresu docelowego; domyślna definicja:
ldap -1 -v mailRoutingAddress 
	-k 	(&(objectClass=inetLocalMailRecipient)
    		(mailLocalAddress=%0))
(wyszukujemy wpis należący do klasy inetLocalMailRecipient, którego wartość atrybutu mailLocalAddress jest równa wartości podanej w zapytaniu, zostaje zwrócona wartość atrybutu mailRoutingAddress, ale tylko gdy atrybut ten jest jednowartościowy)
<bounce>
ten argument, jeśli jest podany i ma wartość różną od passthru sprawia, że mail jest odbijany (powraca do nadawcy), jeśli nie znaleziono ani mailHost, ani mailRoutingAddress
<detail>
ten argument określa działania podejmowane, gdy adres zawiera komponent +detail; możliwe operacje to:
`strip' - próba poszukiwania w LDAP-ie z komponentem +detail, a następnie, jeśli nie znaleziono dopasowania obcięcie +detail i powtórzenie przeszukania;
`preserve' - tak samo jak dla `strip', ale jeśli znaleziono dopasowanie wartości mailRoutingAddress, to komponent +detail jest dołączany do nowego adresu.
W powyższych definicjach nie ma miejsca na podanie nazwy serwera LDAP oraz nazwy wyróżnionej korzenia przeszukiwanego obszaru. Zakłada się, że te ustalenia zostały przekazane serwerowi poczty w konfiguracji m4 za pomocą opcji confLDAP_DEFAULT_SPEC, np.
define(`confLDAP_DEFAULT_SPEC', `-h ldap_server -p port_no -b base_dn')

Losy routingu intranetowego zależą od postaci danych w bazie LDAP. Oto możliwe warianty:

Poniższy przykład pokazuje możliwą konfigurację danych w LDAP-ie.
dn: uid=mgw, dc=uni, dc=torun, dc=pl
objectClass: inetLocalMailRecipient
mailLocalAddress: mgw@uni.torun.pl
mailRoutingAddress: Maja.Wolniewicz@uci.uni.torun.pl
Poczta do mgw@uni.torun.pl będą kierowane pod adres Maja.Wolniewicz@uci.uni.torun.pl.
dn: uid=mgw, dc=uni, dc=torun, dc=pl
objectClass: inetLocalMailRecipient
mailLocalAddress: mgw@uni.torun.pl
mailHost: smtp.uci.uni.torun.pl
Poczta do mgw@uni.torun.pl będą kierowane do serwera smtp.uci.uni.torun.pl.
dn: uid=mgw, dc=uni, dc=torun, dc=pl
objectClass: inetLocalMailRecipient
mailLocalAddress: mgw@uni.torun.pl
mailHost: smtp.uci.uni.torun.pl
mailRoutingAddress: Maja.Wolniewicz@uci.uni.torun.pl
Poczta do mgw@uni.torun.pl będą przekazywane zgodnie z rekordem MX dla smtp.uci.uni.torun.pl i będzie używany nowy adres docelowy: Maja.Wolniewicz@uci.uni.torun.pl.
dn: dc=uci, dc=uni, dc=torun, dc=pl
objectClass: inetLocalMailRecipient
mailLocalAddress: @uci.uni.torun.pl
mailHost: smtp.uni.torun.pl
Poczta kierowana do wszystkich użytkowników w domenie uci.uni.torun.pl, czyli poczta pod adres @uci.uni.torun.pl będzie przekazywany do serwerasmtp.uci.uni.torun.pl.

b. Qmail

Aby serwer qmail wspólpracował z LDAP-em konieczne jest zastosowanie uzupełnień do pakietu (instalacja dodatkowego patche'a). W wyniku modyfikacji drzewa pakietu zostaną m.in. dodane w pliku Makefile ustawienia związane z korzystaniem z pakietów LDAP oraz SSL. Jeśli jest to potrzebne, należy je zmienić, by odzwierciedlały właściwą lokalizację bibliotek i plików nagłówkowych w systemie. Istotna jest opcja LDAPFLAGS=-DQLDAP_CLUSTER, jej włączenie jest niezbędne, gdy zamierzamy korzystać z klastrowania. Ważne są również definicje zawarte w pliku qmail-ldap.h. M.in. ustawia się w nim stałe:
LDAP_CATCH_ALL
wartość używana do przechwytywania maili kierowanych do konkretnej domeny
QLDAP_TIMEOUT
domyślny czas oczekiwania na rezultat wyszukania w LDAP-ie
LDAP_*
definicja nazw atrybutów, które są wyszukiwane w bazie LDAP
Konfiguracja programu qmail opiera się na plikach, które są domyślnie zlokalizowane w katalogu /var/qmail/control. Jeśli qmail ma korzystać z LDAP-a, to istotne jest ustalenie informacji w następujących plikach tego katalogu:
ldapserver
plik ten musi zawierać co najmniej jedną nazwę serwera LDAP; jeśli podajemy kilka nazw, to je odseparować odstępem; jeśli serwer pracuje na porcie różnym od domyślnego (389), to za nazwą umieszczamy numer portu poprzedzony znakiem dwukropka, np.
ldap.example.com:389 ldap2.example.com:389
ldapbasedn
definicja nazwy wyróżnionej wpisu stanowiącego korzeń obszaru przeszukiwania
ldaplogin
nazwa wyróżniona użytkownika, który jest uwierzytelniany w operacjach wyszukiwania (domyślnie wartość pusta)
ldappassword
hasło użytkownika zdefiniowanego w ldaplogin (jeśli jest stosowane uwierzytelnianie, domyślnie wartość pusta);
UWAGA: hasło jest podawane jawnym tekstem - należy unikać takiego rozwiązania!
ldaptimeout
czas, po którym przeszukanie kończy się niepowodzeniem, jeśli nie nadejdzie odpowiedź (domyślnie 30 sek.)
ldaplocaldelivery
gdy plik zawiera wartość 1, to jeśli nie znaleziono dopasowania w LDAP-ie jest przeszukiwany plik passwd; gdy w pliku umieszczono wartość 0, to nie jest realizowane dodatkowe przeszukanie (domyślnie 0)
ldaprebind
wartość 1 powoduje, że qmail-ldap nie wyszukuje hasła użytkownika w bazie LDAP, lecz podejmuje próbę dowiązania do serwera za pomocą poszukiwanej nazwy wyróżnionej i dostarczonego hasła (domyślnie 0)
ldapobjectclass
nazwa klasy obiektów, do której muszą należeć poszukiwane wpisy (domyślnie pusty)
ldapuid
identyfikator użytkownika przydzielany wirtualnemu użytkownikowi, wielu użytkowników może otrzymać jeden identyfikator
ldapgid
identyfikator grupy przydzielany wirtualnemu użytkownikowi
ldapdefaultdotmode
domyślna interpretacja plików .qmail; możliwe wartości:
both - są używane: atrybut deliveryProgramPath oraz pliki .qmail
ldaponly - wyszukanie w LDAP-ie, nie jest używany atrybut deliveryProgramPath oraz pliki .qmail są ignorowane
ldapwithprog - jest używany atrybut deliveryProgramPath (jeśli istnieje jego wartość), pliki .qmail są ignorowane
none - zarówno atrybut deliveryProgramPath, jak i pliki .qmail są ignorowane
ldapmessagestore
przedrostek używany w ścieżce określającej lokalizację w obszarze skrzynek pocztowych, bez znaku "/" na początku (domyślnie wartość pusta)
ldapdefaultquota
limit przestrzeni dyskowej, określany w postaci rozmiar, liczba:
"xxxxS, yyyyC"
co oznacza: xxxx bajtów, yyyy maili (domyślnie wartość pusta)
ldapcluster
wartość 1 włącza możliwość stosowania klastrowania, 0 wyłacza
ldapmailhost
alternatywne nazwy serwera używane przy klastrowaniu (domyślnie wartość pusta)
Qmail wzbogacony o LDAP-a umożliwia korzystanie z kont użytkowników przechowywanej w bazie LDAP, dzięki czemu nie jest potrzbne istnienie zwykłych kont w systemie. Do najbardziej przydatnych własności tego rozwiązania należą: sterowanie limitem przydzielonej przestrzeni w skrzynce (definicja ogólna lub ustalenia obowiązujące dla konkretnego użytkownka), możliwość automatycznej odpowiedzi na listy oraz funkcjonalność zwana klastrowaniem.

Qmail-LDAP korzysta z własnego schematu, który rozszerza sposób opisu użytkownika w bazie LDAP. Może zostać tak skonfigurowany, że wszystkie serwery pocztowe w jednostce organizacyjnej mogą korzystać z tych samych danych dotyczących użytkownika. Umożliwia również stosowanie routingu komunikatów zgodnie z nazwą serwera pocztowego podaną w opisie użytkownika w LDAP-ie, w przypadku gdy użytkownik na zewnątrz posługuje się adresem ogólnym np. o postaci @uni.torun.pl.

qmail.schema definiuje jedną nową klasę obiektów - qmailUser. Klasa ta wymaga określenia wartości dwóch atrybutów: mail oraz uid (oba te atrybuty są zdefiniowane w podstawowym schemacie, core.schema). Obiekt tej klasy opcjonalnie może używać atrybutów:

qmailUID
identyfikator użytkownika w systemie pocztowym
qmailGID
identyfikator grupy w systemie pocztowym
mailMessageStore
ścieżka do skrzynki pocztowej (skrzynka może mieć postać maildir lub mailbox)
mailAlternateAddress
zastępcze adresy pocztowe użytkownika
mailQuota
przydzielony użytkownikowi maksymalny rozmiar skrzynki pocztowej
mailHost
nazwa serwera, na którym istnieje skrzynka użytkownika
mailForwardingAddress
adresy, pod które są przezywane komunikaty (forward)
deliveryProgramPath
program realizowany, dla każdego przyjmowanego maila do użytkownika
qmailDotMode
sposób implementacji plików .qmail: both, dotonly, ldaponly, ldapwithprog, none'
deliveryMode
tryb dostarczania poczty: normal (mail jest umieszczany w skrzynce), forwardonly (mail przekazywany dalej), nombox (mail nie jest umieszczany w skrzynce), localdelivery (mail zawsze jest dostarczany lokalnie), reply (zawsze jest wysyłana automatyczna odpowiedź z tekstem ustalonym w atrybucie mailReplyText)
mailReplyText
tekst używany do odpowiedzi na każdy odebrany mail
accountStatus
aktualny stan konta: active (aktywne), nopop (zablokowanie korzystanie z protokołu POP), disabled (zablokowane), deleted (skasowane, oczekujące na ostateczne usunięcie skrzynki)
qmailAccountPurge
najbliższa data (określona jako liczba sekund od 01.01.1970), gdy konto pocztowe zostanie wyczyszczone i ostatecznie usunięte
Przykładowe dane w postaci LDIF, korzystające ze schematu qmail mogą mieć postać:
dn: cn=Jan Kowalski, o=UMK, c=PL
cn: Jan Kowalski
sn: Kowalski
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: qmailUser
mail: jankowal@uni.torun.pl
mailHost: smtp.uni.torun.pl
mailMessageStore: /usr/home/jankowal/Maildir/
mailQuota: 1000000S,100C
qmailUID: 1001
qmailGID: 1001
uid: jankowal
userPassword: {MD5}b28a87511da157f147ed4766b0474a8a

c. Cyrus IMAP/POP

Wśród wielu programów rozwijanych w ramach projektu Cyrus, http://asg.web.cmu.edu/cyrus/ jest równie serwer IMAP/POP. Zgodnie z analizą w punkcie 1, w przypadku serwerów POP/IMAP może nie być potrzebna żadna dodatkowa konfiguracja w celu korzystania z bazy LDAP. Wystarczy, że w systemie są stosowane PAM-owskie reguły uwierzytelniania. Pakiet IMAP Cyrusa korzysta z oprogramowania SASL tego projektu. Jeśli SASL korzysta z PAM-a lub z dodatkowego demona pwcheck pośredniczącego w obsłudze zapytań o dane dotyczące użytkownika systemu (w tej sytuacji praca demona opiera się na usługach NSS i PAM), to takie rozwiązanie jest wystarczające, by mogło być realizowane uwierzytelnienie użytkowników zdefiniownaych w bazie LDAP.

d. IMAP University of Washington

Pakiet UW-IMAP jest udostępniany przez projekt prowadzony w University of Washington. Podobnie jak rozwiązanie Cyrus, serwer ten nie wymaga żadnej dodatkowej konfiguracji, wystarczy odpowiednio skompilować oprogramowanie: w Linuxie należy wskazać zamiar korzystania z PAM-a w wywołaniu programu make:
make lnp
w Solarisie ustawić PASSWDTYPE=pmb, a w innych systemach ustawić PASSWDTYPE=pam. Należy również sprawdzić ustawienie zmiennej PAMLDFLAGS w pliku src/osdep/unix/Makefile i dostosować jej wartość do specyfiki systemu.