• Bez kategorii

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

Może Ci się również spodoba

Dodaj komentarz