Почему мне нравится 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  я не знаю :(