Лаборатория Maint, настройка почтового сервера на базе postfix, dovecot и ldap
Maint Laboratory

Лаборатория Maint

 
  Главная     Программы     RPM пакеты     Библиотеки     Документация     Заметки     Услуги     Контакты  

 


Настройка postfix+dovecot+ldap

Введение

  Исходные данные для настройки: связка postfix+dovecot+ldap настраивалась для друх операционных и двух разнотипных задач. Одна - это домашняя машина с Fedora и сервер клиента CentOS. Postfix, ldap установлены "родные" для ОС, dovecot - пересобирал, из-за неудобного, с моей точки зрения, расположения конфигурационного файла(вместо /etc/dovecot.conf - /etc/dovecot/dovecot.conf). Из-за одновременной настройки для двух разнотипных задач, некоторые настройки могут показаться странными. Но это оправдано, в моем случае ;-).

1. Часть первая LDAP

  Начнем с конфигурации ldap.conf. Много думать не потребовалось:
URI ldap://127.0.0.1/
BASE dc=example,dc=ru

  Теперь перейдем к файлу sldap.conf. Я даю, только изменения, которые я произвел, на базе стандартного файла конфигурации. Сначала потребуется vmail.scheme. Достаточно легко находиться в google. На всякий случай, даю свою ссылку, можно скачать здесь .

include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema
include /etc/openldap/schema/vmail.schema

  Далее определяем тип базы данных. Во всех примерах, которые я нашел в googlе, определяется только ldbm. Для Fedora 9 и CentOS 5 я взял bdb.

database bdb
suffix "dc=example,dc=ru"
rootdn "cn=root,dc=example,dc=ru"
password-hash {crypt}

  Указанный в password-hash способ шифрования пароля можно посмотреть в документации к вашей системе. Далее я наткнулся, на то, что в Fedora 9 нет файла DB_CONFIG, который необходим для пересборки и инициализации базы данных. При первом запуске, ldap ругается. Не знаю, где в Fedora 9, но в CentOS 5 он был. (Вы можете его взять здесь) Недолго думая я перенес его в каталог /var/lib/ldap Fedora. Наверное существует более простой способ нахождения этого файла ;-). В примере у меня указан администратор ldap как root (cn=root). Но вообще то этого делать не стоит. Хотя и можно (работают же некоторые из под root в текущей работе).

rootpw {crypt}xxxxxxxxxxxxx

Пароль для администратора ldap. Его можно сделать следующей командой:

slappasswd -h {указать способ шифровки пароля, который вы выбрали в password-hash}.

  Причем, способ шифровки указывается именно в фигурных скобках. Это я говорю специально, т.к. долго пытался понять, откуда ошибка при выполнении достаточно простой команды.
  Поскольку ldap, это все же база данных, следует определить индексы. Для не сведующих в работе баз данных, сообщаю, что индексы необходимы для ускорения поиска в базах. К стандартным индексам я добавил необходимые для работы с почтой.

index mailBox eq index status eq

  Эти поля определены в vmail.schema. Не включив эту схему, вы будете получать ошибку при инициализации базы. Теперь нужно описать доступ к информации в базе данных. Указываем, что к аттрибуту userPassword себе(под кем Вы находитесь в системе) разрешена запись, анонимам предлагается зарегистрироваться, остальным отказ.

access to attrs=userPassword
  by self write
  by anonymous auth
  by * none

Доступ к остальной информации: себе - писать, анонимам читать, остальным ничего.

access to *   by self write   by anonymous read   by * none

  Существуют более изощренные способы разграничения доступа, в зависимости от параноидальности администратора. Свои настройки я приводить не буду. В конце концов, параноидальность это дело личное, что-то вроде любви, и ни кого кроме обладателя не касается ;-)
  Запускаем LDAP. В RH - подобных системах это лучше делать из каталога /etc/rc.d/init.d. Собственно команда ldap start. В каталоге (папке, директории) /var/lib/ldap формируется база данных. Пока это только структура, общая схема базы, без конкретного наполнения. Производим начальное заполнение базы. Привожу пример файла init.ldif:

dn: dc=example,dc=ru
dc: example
objectClass: dcObject
objectClass: top
objectClass: organization
o: Example OOO
o: example.ru

dn: cn=root,dc=example,dc=ru
objectClass: top
objectClass: organizationalRole
cn: root
description: Example LDAP manager

dn: ou=People,dc=example,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: People
description: Stuff area

dn: ou=Group,dc=example,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: Group
description: Groups of users

Опять указан администратор ldap как root.Поменяйте на свое имя. Занесение данных в базу производится командой:

ldapadd -xWD cn=root,dc=example,dc=ru -h localhost -f init.ldif

  Не забудьте про смену имени root. Дальнейшее заполнение базы достаточно трудоемкий процесс. И очень творческий, для любителей copy/paste. Или любителей попрограммировать утилитки на 1 раз. Во первых нужно занести в базу группы, во вторых пользователей. Можно этого и не делать, для имеющихся пользователей в системе, если вы собираетесь раздавать почту только новым виртуальным пользователям. У меня стояла своя задача. Почта должна приходить всем, кто уже есть в системе, в том числе мне. Нашел в google MigrationTools .После правки наименования организации, домена и т.п. импортировал имеющиеся группы и пользователей. Получил три файла:

groups.ldif

dn: cn=root,ou=Group,dc=example,dc=ru
objectClass: posixGroup
objectClass: top
cn: root
userPassword: {crypt}x
gidNumber: 0

dn: cn=bin,ou=Group,dc=example,dc=ru
objectClass: posixGroup
objectClass: top
cn: bin
userPassword: {crypt}x
gidNumber: 1
memberUid: daemon
memberUid: root
... и т.д

users.ldif

dn: uid=root,ou=People,dc=example,dc=ru
uid: root
cn: root
sn: root
mail: root@example.ru
mailRoutingAddress: root@example.ru
mailHost: example.ru
objectClass: inetLocalMailRecipient
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}x
shadowLastChange: 13949
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 0
gidNumber: 0
homeDirectory: /root
gecos: root

dn: uid=bin,ou=People,dc=example,dc=ru
uid: bin
cn: bin
sn: bin
mail: bin@example.ru
mailRoutingAddress: bin@example.ru
mailHost: example.ru
objectClass: inetLocalMailRecipient
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}x
shadowLastChange: 13949
shadowMax: 99999
shadowWarning: 7
loginShell: /sbin/nologin
uidNumber: 1
gidNumber: 1
homeDirectory: /bin
gecos: bin
... и т.д

mail.ldif

dn: mailBox=root@example.ru,dc=example,dc=ru
mailBox: root@example.ru
status: enabled
objectClass: mailAccount
base: billing
userPassword: {crypt}x

dn: mailBox=bin@example.ru,dc=example,dc=ru
mailBox: bin@example.ru
status: enabled
objectClass: mailAccount
base: billing
userPassword: {crypt}x
... и т.д

  Заполнение базы LDAP для работы с почтой можно считать завершенной. Заполнение, несколько, избыточно. Т.е. группы и пользователей можно было и не заносить. Пункт в mail.ldif base: billing, можно было не включать, у кого авторизация и обслуживание пользователей не идет через биллинговую систему. Все. Осталось только занести данные в LDAP.

ldapadd -xWD cn=root,dc=example,dc=ru -h localhost -f groups.ldif
ldapadd -xWD cn=root,dc=example,dc=ru -h localhost -f users.ldif
ldapadd -xWD cn=root,dc=example,dc=ru -h localhost -f mail.ldif

Настройка postfix+dovecot+ldap

2. Часть вторая IMAP/POP3 сервер Dovecot

  Это достаточно безопасный сервер, насколько может быть безопасно ПО. Я привожу конфигурацию dovecot без ssl, поддерживающую протоколы pop3 и imap.

Файл конфигурации dovecot.conf

protocol pop3 {
    listen = *:110
}
protocol imap {
    listen = *:143
}

Кто как, я предпочитаю хранить логи для сервисов в отдельных файлах

log_path = /var/log/dovecot/dovecot.log

Отключаю поддержку SSL/TLS. Для 1.0.x

ssl_disable = yes

Для 1.2.x

ssl = no

Приветствие для клиентов сервера. Можно сказать что-нибудь доброе или просто, "версия сервера не твое дело". Остановимся на нейтральном.

login_greeting = Welcome to IMAP/POP3 server

Теперь расположение почтового ящика.

mail_location = mbox:/var/spool/dovecot/%n:INBOX=/var/spool/mail/%n

Здесь необходимы некоторые пояснения. Сама почта у меня будет находится в стандартном каталоге для почты. Мне показалось, что будет правильным, если я смогу посмотреть почту на локальной машине не только через pop/imap клиента, а локально. Например через mutt или mail. Ну а все причиндалы dovecot вынесем в отдельную папку. Напоминаю, что почтовый клиент, обслуживает, как локальных(реальных), так и виртуальных пользователей

Включаем отладку, очень полезно при первоначальной настройке и поиске неисправностей. После настройки лучше отключать.

mail_debug = yes

Задаем допустимый интервал UID для пользователей, по умолчанию 500 и выше. Это сделано для того, чтобы быть увереным в том, что пользователи не смогут войти как демоны или другие системные пользователи. Запрет входа как root встроен в бинарник dovecot и не может быть изменен, даже если установить first_valid_uid в 0.

first_valid_uid = 500
last_valid_uid = 50000

Теперь задаю интервал для группы. Минимальных GID для группы у меня выставлен в 12, т.к. под этим номером у меня находится группа mail. Таким образом я позволяю работать с ящиком как с локальным и виртуальным одновременно.

first_valid_gid = 12
last_valid_gid = 50000

Ну и остались только пользователь и группа. Только для 1.2.x.

mail_uid = virtual
mail_gid = mail

Следующие параметры отвечают за диагностику. Для отладки они нужны, а после их следует отключить.
Высокий уровень информативности. Используется при поиске ошибок, связанных с аутентификацией.

auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes

Осталось только определить способ аутентификации

auth default {
  # Разделенный пробелами список, используемых механизмов аутентификации:
  mechanisms = plain login
  # LDAP database
  passdb ldap {
    args = /etc/dovecot/dovecot-ldap.conf
  }
  userdb ldap {
    args = /etc/dovecot/dovecot-ldap.conf
  }
  user = virtual
  socket listen {
    master {
      path = /var/run/dovecot/auth-master
      mode = 0600
      user = virtual
      group = virtual
     }
    client {
      path = /var/spool/postfix/private/dovecot-smtp-auth
      mode = 0660
      user = postfix
      group = postfix
    }
  }
}

Файл конфигурации dovecot-ldap.conf
Для начала определяем хост, на котором крутится LDAP-сервер. Формат параметра host = hostname:port. У меня LDAP крутится на одном сервере с почтой.

hosts = 127.0.0.1

Определяем пользователя (обзовем его ldapuser), для захода на сервер. Хост example.ru (ты же в Россее живем)

dn = cn=ldapuser,dc=example,dc=ru

Задаем пароль для входа, ну буквально "secret_password";

dnpass = secret_password

Ходить будем не от пользователя. Я так решил ;-)

auth_bind = no

LDAP base.

base = dc=example, dc=ru

Запрос для выборки пользователей

user_filter = (&(objectClass=mailAccount)(mailBox=%u))

Определяем соответствие переменных

pass_attrs = mailBox=user,userPassword=password

Фильтр для проверки паролей

pass_filter = (&(objectClass=mailAccount)(mailBox=%u))

Определяемся, чем шифруем пароль

default_pass_scheme = {здесь ваши личные пристрастия, CRYPT, MD5 и т.п}

Ну и остались только пользователь и группа. (для dovecot 1.0.x). Для 1.2.x определяется в файле конфигурации dovecot.conf

user_global_uid = virtual
user_global_gid = mail

На этом настройка dovecot закончена. Осталось только проверять. Напоминаю, что я описываю только критичные для данной конфигурации настройки. И предлагаю немного подумать.
 

Настройка postfix+dovecot+ldap

3. Часть третья Postfix

  О настройках postfix материала в интернете достаточно много. Я ограничусь только настройками, связанными с ldap и dovecot. Более подробно работа postfix с ldap описана http://www.opennet.ru/base/net/postfix_openldap.txt.html Нас интересует в основном связка с dovecot.
Для начала включаем поддержку sasl аутентификации

smtpd_sasl_auth_enable = yes

Задаем имя приложения, используемого для инициализации SASL сервера. Данный параметр задает имя конфигурационного файла. Имя smtpd будет соответсвовать конфигурационному файлу SASL - smtpd.conf.

smtpd_sasl_application_name = smtpd

Включает функциональную совместимость с SMTP клиентами, которые используют устаревшую версию команды AUTH (RFC 2554), например, outlook express 4 и MicroSoft Exchange version 5.0.

broken_sasl_auth_clients = yes

Отвергаем методы, позволяющие анонимную аутентификацию

smtpd_sasl_security_options = noanonymous

Указывем домен для postfix

virtual_mailbox_domains = example.ru

В принципе можно брать информацию о доменах из ldap. Это если вы собираетесь обслуживать не один почтовый домен, а несколько.

virtual_mailbox_domains = ldap:ldapdomains

Опишем где взять в LDAP домены и с какого сервера взять.

ldapdomains_server_host = 127.0.0.1
ldapdomains_search_base = ou=domains,ou=mail,dc=example,dc=ru
ldapdomains_query_filter = (mailDomain=%s)
ldapdomains_result_attribute = mailDomain
ldapdomains_scope = one
ldapdomains_bind_dn = ou=mail,ou=services,dc=example,dc=ru
ldapdomains_bind_pw = xxxxxxxx

Напомню, что сама почта у меня будет находится в стандартном каталоге для почты. Мне показалось, что будет правильным, если я смогу посмотреть почту на локальной машине не только через pop/imap клиента, а локально. Все причиндалы dovecot вынесены в отдельную папку. Напоминаю, что почтовый клиент, обслуживает, как локальных(реальных), так и виртуальных пользователей

virtual_mailbox_base = /var/spool/mail

Можно сделать через ldap разделение по типам ящиков (mbox, maildir) для различных пользователей, но в моем случае я посчитал это излишним.
Теперь укажем владельца и группу для почты. У меня # 1890 ит 12 - uid и gid пользователя virtual и группы mail соответственно.

virtual_uid_maps = static:1890
virtual_gid_maps = static:12
virtual_minimum_uid = 1

Теперь осталось только указать postfix какой использовать транспорт для виртуальных доменов. Если вы используете postfixadmin для управления доменами, то транспорт необходимо задавать непосредственно в самом postfixadmin, а не через параметр virtual_transport.

virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

Если необходимо пересылать локальную почту в виртуальные почтовые ящики, так же необходимо указать

fallback_transport = dovecot

Указываем postfix, что SASL авторизацию будет производить dovecot, а также указать путь к сокету. Путь к сокету задан относительно папки /var/spool/postfix

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-smtp-auth

Осталось последнее, указать в файле master.cf для доставки в виртуальные почтовые ящики

dovecot unix - n n - - pipe
    flags=DRhu user=пользователь:группа argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

Вот, собственно и все.
 

© Елохин И.Ю. (Maint Laboratory)