Konfiguracja dostarczania poczty w oparciu o LDAP
Ostatnio pisałem o konfiguracji uwierzytelniania użytkowników w katalogu LDAP aby mogli odbierać i wysyłać pocztę. Teraz czas na konfigurację Postfixa aby tę pocztę dostarczał do właściwych domen i skrzynek.
Jeśli kompilujecie/instalujecie Postfixa samodzielnie, to należy pamiętać o wkompilowaniu wsparcia dla LDAP oraz wskazaniu ścieżki do bibliotek LDAP. Ja pójdę na łatwiznę i zrobię to na Ubuntu:
$ sudo -i
# apt-get install postfix-ldap
To dołoży nam do postfixa wsparcie dla map typu ldap:
Teraz możemy zabrać się za konfigurację serwera Postfix:
# cd /etc/postfix
# vi main.cf
Do main.cf
dodajemy takie wpisy (oczywiście example.com i to co trzeba zastępujemy):
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 wpisy powinny nam załatwić dostarczanie przez postfixa poczty do skrzynek, starałem się to maksymalnie uprościć, żeby nie zaciemniać obrazu. Może w dalszym etapie spróbuję tę konfigurację doszlifować, tak aby sprawdzać status kont (aktywne/nieaktywne) i trochę poprawić bezpieczeństwo, bo nie ma potrzeby aby cn=admin przeglądał katalog.
Można zrestartować postfixa i trzeba spojrzeć w logi czy nie wypluł jakichś błędów. Jeśli wystartował, to na chwilę go zostawimy i zajmiemy się konfiguracją poczty w katalogu LDAP. Możecie skorzystać z tego co wcześniej opisałem tutaj: konfiguracja uwierzytelniania poczty w LDAP, ale ja dodam tutaj nową domenę virtdomain.com, użytkownika jsmith i alias postmaster, który będzie wskazywał na jsmith. Można to wyklikać w phpLDAPadmin lub innym narzędziu, można też oczywiście wciągnąć ldifa, takiego jak ten:
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śli dodajecie to z phpLDAPadmina to przy dodawaniu użytkownika trzeba najpierw wybrać klasę obiektu inetOrgPerson
jako strukturalną, a później dołożyć klasę mailUser
i następnie potrzebne atrybuty. Jako RDN można też wybrać atrybut mail
i wtedy nie trzeba w ogóle nadawać uid
.
Proszę zwrócić uwagę na atrybut homeDirectory
oraz mailMessageStore
, ten ostatni jak widać zawiera względną ścieżkę do skrzynki użytkownika, początek tej ścieżki dokładany jest przez Postfixa i bierze się ze zmiennej virtual_mailbox_base
. Dovecot tymczasem korzysta z atrybutu homeDirectory
i do niego dokleja /Maildir
. Nie jest to dobra sytuacja i później napiszę jak to usprawnić, na chwilę obecną powinno zadziałać.
Sprawdźmy czy postfix rozwiązuje dobrze mapy LDAPowe:
# 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
Mniej więcej takie powinny być wyniki, jeśli nie dostajecie żadnych wyników lub zgłaszany jest błąd podłączenia do LDAP, to trzeba przejrzeć logi, konfigurację i usprawnić.
Jeśli wszystko jest dobrze, to po skonfigurowaniu konta pocztowego w kliencie poczty i wysłaniu poczty do samego siebie, wiadomość powinna zostać dostarczona do skrzynki. Jeśli w logach postfixa zobaczycie taki komunikat:
status=bounced (mail for example.com loops back to myself)
to coś jest nie tak z transportem. I tutaj uwaga: jak wpiszecie to w google to znajdziecie wiele wyników i rozwiązań tego problemu, zwykle sugestia jest taka, aby dopisać domenę (tu example.com) do mydestination
. Nie idźcie tą drogą! 😉 W dokumentacji Postfixa w sekcji VIRTUAL_README Vietse napisał dobitnie:
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: jak domena jest wirtualna, to ma być wirtualna, postfix będzie wiedział, że ma przyjąć dla niej pocztę tylko trzeba mu wskazać dokąd ją dostarczyć.