Почему мне нравится postfix? Вроде бы sendmail вполне хорошо справляется с обработкой почты. Чем же posfix лучше?
Я предпочитаю хранить информацию о пользователях не в локальных файлах или базах данных типа MySQL, а в LDAP серверах (OpenLDAP, Active Directory и т.п.). И лично для меня решающим фактором перехода с sendmail стало то, как postfix работает с LDAP серверами.
В качестве простого примера можно рассмотреть работу с псевдонимами.
По умолчанию postfix использует всем хорошо знакомый файл /etc/aliases.
alias_maps = hash:/etc/aliases
Но доступ к этому файлу имеет только суперпользователь. Если вы один админ на всю деревню – то особых затруднений это не вызывает. Но если админов несколько? Давать всем пароль root? Вы это серьёзно?
Вот тут то и помогает LDAP, в том числе и возможностью разграничения доступа.
Можно создать ou в котором будут храниться псевдонимы. В текущих схемах OpenLDAP на CentOS я не нашел готовую схему для почтовых псевдонимов. Поэтому для хранения информации о них решил использовать objectClass inetOrgPerson.
У inetOrgPerson три обязательных атрибута: cn, sn и mail. Сn будет использоваться в качестве имени псевдонима и части dn записи. Mail – показывает куда пересылать почту. В простейшем случае в sn можно дублировать информацию из cn.
Например, создадим ou в котором будут храниться псевдонимы:
dn: ou=Aliases,dc=company,dc=ru objectclass: organizationalUnit objectclass: top ou: Aliases
И добавим туда простейший псевдоним:
dn: cn=psevdo,ou=Aliases,dc=company,dc=ru cn: psevdo mail: localuser mail: anotheruser@mail.ru objectclass: inetOrgPerson objectclass: top sn: psevdo
Для того, что бы postfix работал с OpenLDAP следует создать текстовый файл фильтра, например /etc/postfix/ldap_aliases.cf следующего содержания:
# или имя сервера server_host = 1.2.3.4 # контейнер, где хранятся псевдонимы search_base = ou=Aliases,dc=company,dc=ru # искать во всем дереве, начиная с указанного выше контейнера scope = sub # запрос к LDAP серверу query_filter = (&(objectClass=inetOrgPerson)(cn=%u)) # атрибут, который мы должны получить в ответ в результате поиска result_attribute = mail # Пользователь, с правами которого мы обращаемся к серверу bind_dn = cn=proxy user,dc=company,dc=ru # Пароль этого пользователя bind_pw = this_is_a_password_proxy_user
В файле main.cf добавляем фильтр поиска:
alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap_aliases.cf
Т.е. у нас остается классический вариант /etc/aliases и к нему добавляется поиск псевдонимов в LDAP сервере.
В дальнейшем разруливаем права доступа в OpenLDAP для админов, пароль root им больше не понадобится.
Кстати, поле sn можно использовать в качестве логического. Для включения выключения псевдонима.
dn: cn=psevdo,ou=Aliases,dc=company,dc=ru cn: psevdo mail: localuser mail: anotheruser@mail.ru objectclass: inetOrgPerson objectclass: top sn: true
Если хотим, что бы псевдоним работал – присваиваем sn значение true. Для отключения – все что угодно кроме true.
Ну и немного изменим query_filter:
query_filter = (&(objectClass=inetOrgPerson)(cn=%u)(sn=true))
Итак мы можем обратиться к LDAP с любым запросом. Попросить вернуть только нужные нам атрибуты. Как такое сделать в sendmail я не знаю :(
