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ć.