Konfiguracja dostarczania poczty w LDAP

Ostatnim razem pisałem o uwierzytelnianiu użytkowników w katalogu LDAP aby umożliwiać im odbieranie i nadawanie poczty. Teraz nadszedł czas aby skonfigurować Postfixa aby dostarczał pocztę do właściwych skrzynek.
Jeśli sam kompilujesz Postfixa musisz pamiętać o dodaniu do niego wsparcia dla LDAP. Mój opis tym razem bazuje na Ubuntu, więc trzeba tylko zainstalować odpowiedni pakiet postfix-ldap:

$ sudo -i
# apt-get install postfix-ldap

To załatwi sprawę wsparcia map ldap: w Postfixie.
Teraz idziemy do konfiguracji Postfixa:

# cd /etc/postfix
# vi main.cf


W main.cf należy dodać coś takiego (zastąp example.com właściwą nazwą domeny):

ldap_bind_dn = cn=admin,dc=example,dc=com
ldap_bind_pw = secret
ldap_search_base = o=hosting,dc=example,dc=com
ldap_domain = dc=example,dc=com
ldap_server_host = localhost
ldap_server_port = 389
ldap_version = 3

# Accounts
accounts_server_host = $ldap_server_host
accounts_search_base = $ldap_search_base
accounts_query_filter = (&(objectClass=mailUser)(mail=%s))
accounts_result_attribute = mailMessageStore
accounts_cache = no
accounts_bind = yes
accounts_bind_dn = $ldap_bind_dn
accounts_bind_pw = $ldap_bind_pw
accounts_version = $ldap_version

accountsmap_server_host = $ldap_server_host
accountsmap_search_base = $ldap_search_base
accountsmap_query_filter = (&(objectClass=mailUser)(mail=%s))
accountsmap_result_attribute = mail
accountsmap_cache = no
accountsmap_bind = yes
accountsmap_bind_dn = $ldap_bind_dn
accountsmap_bind_pw = $ldap_bind_pw
accountsmap_version = $ldap_version

# aliases
aliases_server_host = $ldap_server_host
aliases_search_base = $ldap_search_base
aliases_query_filter = (&(objectClass=mailAlias)(mail=%s))
aliases_result_attribute = mailForwardingAddress
aliases_bind = yes
aliases_cache = no
aliases_bind_dn = $ldap_bind_dn
aliases_bind_pw = $ldap_bind_pw
aliases_version = $ldap_version

# transports
transport_server_host = $ldap_server_host
transport_search_base = $ldap_search_base
transport_query_filter = (&(objectClass=mailDomain)(domainName=%s))
transport_result_attribute = mtaTransport
transport_cache = no
transport_bind = yes
transport_scope = one
transport_bind_dn = $ldap_bind_dn
transport_bind_pw = $ldap_bind_pw
transport_version = $ldap_version

# transport_maps
maildrop_destination_concurrency_limit = 2
maildrop_destination_recipient_limit = 1
transport_maps = ldap:transport
virtual_alias_maps = ldap:aliases, ldap:accountsmap

# virtual accounts for delivery
virtual_mailbox_domains = ldap:transport
virtual_mailbox_base = /vdhome
virtual_mailbox_maps = ldap:accounts
virtual_minimum_uid = 501
virtual_uid_maps = static:501
virtual_gid_maps = static:501

local_recipient_maps = $alias_maps $virtual_mailbox_maps

Powyższe linie powinny wystarczyć dla dostarczania poczty. Próbowałem jak najbardziej to uprościć, więc nie sprawdzam statusu konta (aktywne/nieaktywne) itp. Powinno się również skonfigurować odrębne konto z prawami tylko do odczytu i odpowiednie listy kontroli dostępu, ale to by zaciemniło obraz, więc użyłem cn=admin.
Teraz należy zrestartować Postfixa i sprawdzić logi. Jeśli Postfix uruchomi się bez problemów, można przejść do konfiguracji poczty w katalogu LDAP. Możesz użyć opisu z Uwierzytelniania użytkowników poczty w LDAP, ale w ramach przykładu dodam nową domenę virtdomain.com, użytkownika jsmith oraz alias postmaster, który będzie dostarczał pocztę do jsmith. Do utworzenia wpisu można użyć phpLDAPadmin lub innego narzędzia lub po prostu zaimportować następujący LDIF:

dn: domainName=virtdomain.com,o=hosting,dc=example,dc=com
domainname: virtdomain.com
mtatransport: virtual
objectclass: mailDomain
objectclass: top

dn: uid=jsmith,domainName=virtdomain.com,o=hosting,dc=example,dc=com
cn: John Smith
givenname: John
homedirectory: /vdhome/virtdomain.com/jsmith
mail: jsmith@virtdomain.com
mailmessagestore: virtdomain.com/jsmith/Maildir/
objectclass: inetOrgPerson
objectclass: top
objectclass: mailUser
sn: Smith
uid: jsmith
userpassword: {MD5}XD9034sf8w83sfoXXg==

dn: mail=postmaster@virtdomain.com,domainName=virtdomain.com,o=hosting,dc=example,
 dc=com
cn: Postmaster
mail: postmaster@virtdomain.com
mailforwardingaddress: jsmith@virtdomain.com
objectclass: mailAlias
objectclass: top

Jeżeli dodajesz to przy pomocy phpLDAPadmin, wybierz inetOrgPerson jako strukturalną klasę obiektu i dodaj klasę mailUser i potrzebne atrybuty. Jako RDN możesz wybrać atrybut mail, wtedy nie będzie trzeba dodawać atrybutu uid.

Proszę zwrócić uwagę na atrybuty homeDirectory i mailMessageStore. Ten ostatni zawiera relatywną ścieżkę do skrzynki użytkownika. Katalog bazowy jest dodawany przez Postfixa, który bierze go ze zmiennej virtual_mailbox_base. Dovecot używa zaś atrybutu homeDirectory i dokleja /Maildir na końcu. Nie jest to dobra sytuacja, więc później napiszę jak to wyeliminować. Na tę chwilę powinno działać.
Sprawdźmy czy Postfix prawidłowo rozwiązuję mapy LDAP:

# postmap -q "virtdomain.com" ldap:transport
virtual
# postmap -q "postmaster@virtdomain.com" ldap:aliases
jsmith@virtdomain.com
# postmap -q "jsmith@virtdomain.com" ldap:accounts
virtdomain.com/jsmith/Maildir/
# postmap -q "jsmith@virtdomain.com" ldap:accountsmap
jsmith@virtdomain.com

Jeśli nie otrzymujesz żadnych rezultatów lub otrzymujesz błąd połączenia z serverem LDAP, musisz sprawdzić logi i poprawić konfigurację.
Jeśli wszystko jest w porządku, wyślij wiadomość do siebie i sprawdź czy została dostarczona do skrzynki. Jeśli zobaczysz w logach coś pododbnego:

status=bounced (mail for example.com loops back to myself)

to znaczy, że jest problem z transportem. Uwaga: możesz znaleźć wiele sposobów rozwiązania tego problemu, wiele z nich sugeruje dopisanie domeny (tutaj: example.com) do mydestination, to nie jest właściwe rozwiązanie!
W dokumentacji Postfixa, w sekcji VIRTUAL_README Vietse napisał:

NEVER list a virtual MAILBOX domain name as a mydestination domain!
NEVER list a virtual MAILBOX domain name as a virtual ALIAS domain!

innymi słowy: jeśli domena jest wirtualna, to ma być wirtualna. Posftix przyjmie pocztę dla tej domeny, musisz mu tylko wskazać dokąd ma ją dostarczyć.

Możesz również polubić…

Leave a Reply

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.