Данный материал посвящен интеграции почтового агента (MTA) qmail с сервером LDAP. Предполагается, что читатель уже знаком как с основами управления LDAP сервером, так и с основами qmail и электронными почтовыми системами в целом.
qmail-ldap - это патч к qmail-1.03, позволяющий запрашивать данные о пользователях не только из файлов на дисках, но и из LDAP директории, тем самым позволяя строить централизованно управляемые, быстрые, с возможностью кластеризации, почтовые системы.
-----------------------------------------------------------
Henning Brauer lists-lwql@bsws.de
24 January 2002
Ситкарев Григорий admin@net.nordcomp.ru
31 March 2002-----------------------------------------------------------
Другие ресурсыНабор утилит для администрирования qmail-ldap можно взять
здесь Web-based инструмент для администрирования qmail-ldap от
AdfinsСодержание Введение в LDAP Настройка LDAP сервера
Схема для OpenLDAP 1.2.x
Схема для OpenLDAP 2.x
Конфигурирование qmail
Наполнение директории LDAP
Компоненты qmail-ldap и их взаимодействие 1. qmail-queue
2. qmail-send
3. qmail-lspawn
4. qmail-local
5. qmail-rspawn
6. qmail-remote
7. qmail-inject
8. qmail-smtpd
9. qmail-qmqpd
10. qmail-popup
11. qmail-pop3d
12. auth_pop
13. auth_imap
14. qmail-ldaplookup
Установка Примеры конфигурации
Директория LDAP
Контроль доступа с помощью tcpserver
POP3
IMAP
Webmail
Работа qmail-ldap в кластерном окружении
Доменный алиасинг (domain aliassing)
Патч qmail-ldap-control Установка патча qmail-ldap-control
Примеры конфигурации
Введение в LDAP LDAP (Lightweight Directory Access Protocol) очень удобный инструмент в администрировании больших сетевых систем. База данных сервера LDAP оптимизирована исключительно для операций чтения при этом обеспечивая скорость примерно в 10 раз быстрее, чем SQL базы данных. Одна из возможностей LDAP это хранение пользовательских учетных записей. Одна и та же учетная запись, хранящаяся в базе данных LDAP сервера, может быть использована для входа в UNIX-системы, IMAP серверы, Web-серверы, серверы баз данных и системы электронной почты.
С использованием qmailUser схемы, загруженной в LDAP сервер, qmail-ldap серверы в организации могут быть сконфигурированы на совместное использование одних и тех же данных. Qmail-ldap поддерживает маршрутизацию сообщений к почтовому серверу, указанному в учетной записи в LDAP, даже если внешние почтовые адреса имеют вид
user@company.com. Нет необходимости использовать внутренние адреса вида
user@mailhost1.company.com и конвертировать адрес в
user@company.com, когда сообщение покидает интранет.
Использование LDAP для хранения учетных записей qmail требует создания LDAP директории, или же модифицирования схемы существующей. Для тех, кто абсолютно не знаком с основами LDAP, на сайте проекта
OpenLDAP есть документация и список рассылки с возможностью поиска.
Настройка LDAP сервера Перед тем, как начать наполнение директории, необходимо добавить схему qmail. Как это сделать зависит от того, какой у вас сервер LDAP.
Схема для OpenLDAP 1.2.x Добавьте в файл slapd.oc.conf следующее
objectclass qmailUser
requires
objectclass,
mail,
uid
allows
mailMessageStore,
homeDirectory,
userPassword,
mailAlternateAddress,
qmailUID,
qmailGID,
mailQuota,
mailHost,
mailForwardingAddress,
deliveryProgramPath,
qmailDotMode,
deliveryMode,
mailReplyText,
accountStatus
Перезапустите сервер после внесения изменений.
Схема для OpenLDAP 2.x Добавьте в файл slapd.conf следующее
include /etc/ldap/schema/InetOrgPerson.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/qmail.schema (файл находится в директории qmail. После использования патча, скопируйте его в директорию с файлами схем)
Перезапустите slapd после внесения изменений.
Конфигурирование qmail После того, как схема была загружена в сервер LDAP, требуется внести некоторые изменения в настройки qmail. В дальнейшем предполагается, что пользовательские учетные записи являются виртуальными, т.е. не имеют реальных GID и UID и домашних каталогов, впрочем, так же как и записей в файлах паролей /etc/passwd, /etc/master.passwd . В конечном итоге, это почтовый сервер а не игровая площадка для пользователей. Для этого требуется создать одну реальную учетную запись, которая будет использоваться для операций с локальной почтой.
Добавим следующее:
Редактируем /etc/passwd и добавляем учетную запись vmail (тот самый виртуальный аккаунт). Значения UID и GID для аккаунта vmail достаточно произвольны (в пределах разумного):
vmail:x:11184:2110::/var/qmail/maildirs/:/bin/true
Редактируем /etc/group и добавляем группу:
vmail::2110
Создаем директорию, где будет храниться пользовательская почта. Выбор вполне произволен.:
mkdir /var/qmail/maildirs
Меняем владельца и группу владельца для директории на только что созданного vmail:
chown -R vmail:vmail /var/qmail/maildirs
Далее создаем конфигурационные файлы в директории /var/qmail/control:
Файл defaultdelivery указывает на тип почтового ящика:
./Maildir/
Файл ldapmessagestore указывает на каталог, где хранится почта:
/var/qmail/maildirs
Файл ldapgid указывает реальный GID для операций с пользовательской почтой:
2110
Файл ldapuid указывает реальный UID для операций с пользовательской почтой:
11184
Примечание: Если вы используете например Courier IMAP, то аккаунт vmail может быть также использован для доступа к директориям с пользовательской почтой.
Наполнение директории LDAP На следующем этапе необходимо создать иерархию в директории LDAP и соответствующее наполнение или модифицировать существующее. Для простоты и наглядности продемонстрируем на примере абсолютно пустой директории LDAP с использованием файлов в формате ldif.
Первая строчка должна соответствовать суффиксу DN, указанному в slapd.conf :
suffix "dc=nordcomp, dc=ru"
Файл LDIF dn: dc=nordcomp, dc=ru
objectclass: top
dn: dc=nordcomp, dc=ru
objectclass: top
dn: ou=mailaccounts, dc=nordcomp, dc=ru
objectclass: top
objectclass: organizationalUnit
dn: uid=postnikov, ou=mailaccounts, dc=nordcomp, dc=ru
cn: Anton A. Postnikov
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: qmailUser
mail:
postnikov@nordcomp.ru mailAlternateAddress:
postnikov@net.nordcomp.ru mailHost: mail.nordcomp.ru
mailMessageStore: /var/qmail/maildirs/postnikov
uid: postnikov
userPassword: {MD5}X03MO1qnZdYdgyfeuILPmQ==
После того, как файл был создан (и сохранен под именем new.ldif), загрузите его в директорию LDAP с помощью команды ldapadd.
Пример:
# ldapadd -W -D "cn=rootdn,dc=nordcomp,dc=ru" -f new.ldif
Просмотрите man ldapadd для дополнительной информации.
Компоненты qmail-ldap и их взаимодействие1. qmail-queueqmail-queue получает почтовое сообщение и располагает его в очередь, добавляя строчку "received-".
2. qmail-sendqmail-send работает с сообщениями, находящимися в исходящей очереди, и использует qmail-lspawn для локальной доставки почты и qmail-rspawn для удаленной.
3. qmail-lspawnqmail-lspawn производит поиск пользователя для доставляемой почты и вызывает qmail-local для выполнения доставки.
4. qmail-localqmail-local производит доставку локальной почты а также работает с файлами .qmail .
5. qmail-rspawnqmail-rspawn вызывает qmail-remote для удаленной доставки сообщений.
6. qmail-remoteqmail-remote отправляет сообщения удаленному хосту посредством протокола SMTP.
7. qmail-injectqmail-inject читает сообщения из стандартного ввода, добавляет заголовки и вызывает qmail-queue.
8. qmail-smtpdqmail-smtpd открывает сокет обычно на 25-м порту TCP и принимает сообщения от удаленных серверов SMTP.
9. qmail-qmqpdqmail-qmqpd принимает сообщения от удаленных хостов посредством протокола QMQP (Quick Message Queuing Protocol). qmail-qmqpd будет разрешать relay для любых сообщений, поэтому при его настройке вы должны быть уверены, что лишь разрешенные хосты могут соединяться с ним. QMQP используется для кластерных решений. Если вы хотите использовать кластер, вы должны настроить qmail-qmqpd.
10. qmail-popupqmail-popup получает имя пользователя и пароль от клиента POP3 и передает полученные данные подпрограмме для аутентификации (обычно auth_pop).
11. qmail-pop3dqmail-pop3d вызывается qmail-popup для работы с POP3 клиентом.
12. auth_popauth_pop обычно вызывается qmail-popup для аутентификации клиента POP3. Также auth_pop ответственен за пересылку (forwarding) POP3-сессии в кластерном окружении.
13. auth_imapАналогично auth_pop, но для протокола IMAP. Также ответственен за пересылку (forwarding) сессии в кластерном окружении.
14. qmail-ldaplookupqmail-ldaplookup это удобный инструмент для проверки установок LDAP. man qmail-ldaplookup для дополнительной информации.
Установка qmail-ldap Предполагается, что у вас есть исходные файлы (sources) qmail, скачать их можно с
официального сервера qmail, и патч qmail-ldap-patch, последняя версия которого находится
здесь. Распакуйте оба архива (например, в /usr/src/qmail-1.03).
Пропатчим дерево исходных файлов qmail:
# cd /usr/src/qmail-1.03
# patch -p1 < qmail-ldap-1.03-xxx.patch (параметр -p1 определяет глубину вложенности)
Редактируем Makefile, отражая в нем наши настройки системы. Можно изменить следующие параметры:
QLDAP-CLUSTER
Компилирует код кластера.
Прим: это вовсе не означает, что кластеризация будет включена, это значит, что вы cможете ее использовать.
DASH-EXT
Включает механизм "dash"- (черточка) расширения.
CLEARTEXTPASSWORD (крайне не рекомендуется)
Разрешает хранить пароли в plain-text виде в LDAP. Обычно пароли без префикса {MD5},{SSHA1} и т.д. считаются по умолчанию как {CRYPT}.
LDAPLIBS
Библиотеки, которые вам понадобятся, -lldap and -llber. В некоторых системах также понадобится библиотека -lresolv. Если у вас возникают проблемы при компиляции дважды проверьте этот параметр.
Если у вас установлен OpenLDAP обычно требуется следующее:
LDAPLIBS=-lldap -llber.
Для Netscape потребуется следующее:
LDAPLIBS=-L/usr/local/ldap/lib -lldap50 -llber50 -lpthread
LDAPINCLUDES=-I/usr/local/ldap/include
Не забудьте правильно указать пути к библиотекам и заголовочным файлам.
LDAPINCLUDES
Путь к заголовочным файлам LDAP, как минимум, требуются ldap.h и lber.h.
MAKE-NETSCAPE-WORK
Включает баг-фикс для Netscape-овского прогресс-бара загрузки почты для qmail-pop3d.
AUTOMAILDIRMAKE
Включает патч auto-MAILdirmake. Внешние скрипты не требуются. Позволяет в автоматическом режиме создавать Maildir-ы для пользователей.
AUTOHOMEDIRMAKE
Включает патч auth-HOMEdirmake. Вам необходимо указать внешний скрипт в ~/control/dirmaker, который создает домашний каталог. Скрипт получает только один входной параметр, указывающий полный путь для создаваемого каталога. Прим: этот скрипт запускается с правами пользователя, для которого создается каталог, поэтому необходимо соблюсти разрешения на запись в соответствующие каталоги.
SHADOWLIBS=-lcrypt
Понадобится на большинстве систем, кроме OpenBSD. В некоторых ОС, например Linux и Solaris вам потребуются также
-DSHADOWLIBS=-lcrypt -lshadow если вы хотите использовать и реальных пользователей.
DEBUG
Включает отладочный код при компиляции. Смотри QLDAPINSTALL для расширенной информации.
TLSON
Установите -DTLS для того, чтобы включить шифрование SMTP через SSL. Вам также понадобятся библиотеки и заголовочные файлы OpenSSL.
TLSINCLUDES
Путь к загловочным файлам OpenSSL. Если у вас включен TLS и возникают ошибки при компиляции, дважды проверьте этот параметр. Обычно /usr/local/include или /usr/local/openssl/include.
TLSLIBS
Путь к библиотекам OpenSSL.
Обычно /usr/local/lib или /usr/local/openssl/lib.
OPENSSLBIN
Путь к исполняемым файлам (binaries) OpenSSL. Используются только для создания сертификатов.
Обычно /usr/sbin/openssl или /usr/local/openssl/bin/openssl.
Существует так же возможность изменить названия атрибутов LDAP директории для qmail в файле qmail-ldap.h. Также проверьте conf-* файлы, например для OpenBSD как минимум вы должны модифицировать или conf-spawn или conf-cc:
echo 125 > /path/to/conf-spawn
или
echo "cc -O2 -DFD_SETSIZE=4096" > /path/to/conf-cc
После того, как были отредактированы Makefile и conf-* файлы, следует создать аккаунты qmail. Причем обязательно до компилляции, после которой изменение uid-ов и gid-ов потребует повторной компиляции qmail. Смотрите INSTALL.ids для инструкций по созданию аккаунтов qmail.
Пришло время скомпилировать qmail.
# make install check
(В BSD системах gmake install check)
Если вы используете TLS нужно создать сертификат. Обратитесь к документации OpenSSL для дополнительной информации.
# make cert
или
# make cert-req
Примеры конфигурации Настраиваем конфигурацию qmail для работы с LDAP. Конфигурационные файлы находятся в директории /var/qmail/control.
1. meСодержит полное доменное имя (FQDN) почтового сервера.
# echo "mail.nordcomp.ru" > me
2. rcpthostsСодержит имена (FQDN) всех доменов, почту для которых должен принимать qmail, иными словами, давать relay.
# echo "nordcomp.ru" > rcpthosts
# echo "net.nordcomp.ru" >> rcpthosts
# echo "company.com" >> rcpthosts
3. localsСодержит имена (FQDN) всех доменов, для которых qmail должен доставлять почту локально. Формат аналогичен rcpthosts.
4. ldapbasednКорневой суффикс DN директории LDAP, в которой производится поиск. Параметр является обязательным.
# echo "dc=nordcomp, dc=ru" > ldapbasedn
5. ldapserverИмя (FQDN) вашего LDAP сервера. В случае избыточной конфигурации (два или более LDAP серверов) имена указываются в одну строчку. Допускается также указание IP адреса. Параметр обязательный.
# echo "ldap1.nordcomp.ru ldap2.nordcomp.ru:389" > ldapserver
6. ldaploginЕсли ваш LDAP сервер требует аутентификации для получения данных. Прим: указываемое имя является LDAP DN а не именем пользователя. Значение по умолчанию - NULL, т.е. аутентификация не требуется.
# echo "dn=ldapadmin, dc=nordcomp, dc=ru" > ldaplogin
7. ldappasswordПароль пользователя, указанного в ldaplogin. Значение по умолчанию - NULL. Прим: так как пароль хранится plain-text, установите разрешение на чтение и запись только для root!!!
8. ldaptimeoutПо истечении указанного времени (в секундах) процесс поиска в LDAP директории считается не удачным. Полезен в случае частых зависаний LDAP сервера. Значение по умолчанию - 30 секунд.
# echo "35" > ldaptimeout
Внимание! Данный параметр некорректно обрабатывается версией qmail-ldap 20010101. Если этот файл существует, то ни одно из сообщений не будет доставлено локально. Просто удалите этот файл, значение по умолчанию в 30 секунд вполне подходящее.
9. ldaplocaldeliveryОпределяет использование локальных файлов паролей /etc/passwd тогда и только тогда, когда в директории LDAP не найдена подходящая запись. 1 - включено, 0 - выключено. Значение по умолчанию - 1.
# echo "0" > ldaplocaldelivery
10. ldaprebindЕсли установлено значение "1", то qmail не пытается напрямую прочитать пароль пользователя из LDAP директории, а пытается <привязаться> (bind) к LDAP серверу с указанным именем пользователя и паролем (влияет на auth_pop и auth_imap). Позволяет использовать более строгие правила в ACL LDAP сервера для атрибута userPassword, разрешая читать пароль только пользователю, к которому принадлежит атрибут.
# echo 1 > ldaprebind
11. ldapobjectclassПозволяет ограничить поиск аккаунтов в LDAP директории имеющих только указанный objectClass. Полезно, в случае если LDAP директория служит не только для qmail, но и для других целей. Таким образом, qmail ограничится лишь теми аккаунтами, которые содержат класс например qmailUser.
# echo "qmailUser" > ldapobjectclass
Внимание: в версии 20010101 не работоспособно.
12. ldapuidРеально присутствующий в системе UID, с помощью которого будут производится операции для виртуальных пользователей. Вы можете добавить сколь угодно много пользователей в LDAP директорию для работы с qmail, все они будут использовать только один UID, указанный в этом файле.
# echo "1001" > ldapuid
13. ldapgidАналогично ldapuid, реальный системный GID для операций с виртуальными пользователями.
14. ldapdefaultdotmodeИнтерпретация по умолчанию для .qmail файлов. Возможные значения:
both (используются как атрибут "deliveryProgramPath" так и .qmail)
ldaponly (используется только атрибут "deliveryProgramPath", файл .qmail игнорируется)
ldapwithprog (если существует атрибут "deliveryProgramPath" тогда он используется, .qmail файл игнорируется)
none (игнорируются оба параметра)
15. ldapmessagestoreПрефикс по умолчанию для атрибутов "mailmessagestore". Если вы установили значение например в /var/qmail/maildir/ , то следующие два атрибута пользовательского аккаунта эквивалентны по значению:
mailmessagestore: /var/qmail/maildir/postnikov/
эквивалентно
mailmessagestore: postnikov/
Значение по умолчанию - NULL
16. ldapdefaultquotaЗначение квоты по умолчанию для почтовых ящиков пользователей. Если пользовательский аккаунт имеет атрибут "MailQuotaSize" или "MailQuotaCount" (в предыдущих версиях "mailquota"), значение по умолчанию перекрывается последним. Значение по умолчанию - NULL.
# echo "1000000S, 1000C" > ldapdefaultquota
Что означает: 1000000 байт (S - size) и 1000 сообщений (C - count). Обязательна установка сразу двух параметров. Не забудьте установить quotawarning, иначе пользователь не получит предупреждение о превышении квоты.
17. quotawarningЛюбое, подходящее по содержанию и смыслу, сообщение. Будет добавлено к сообщению о превышении квоты.
# echo "Warning! You have exceeded your quota!" > quotawarning
18. custombouncetextЛюбое дополнительное сообщение к отвергнутым (bounce) сообщениям.
# echo "technical support +7 (323) 43264235" >> custombouncetext
19. tarpitcountКоличество RCPT TO, принимаемых вашим сервером, без задержки. Усложняет жизнь всяческим спаммерам. Значение по умолчанию - 0.
# echo 5 > tarpitcount
20. tarpitdelayЗадержка после n-го количества RCPT TO, указанного в tarpitcount, в секундах. Значение по умолчанию - 0.
# echo 5 > tarpitdelay
21. maxrcptcountКоличество RCPT TO, принимаемых вашим сервером, до того, как будет непосредственно отвергнута попытка доставки. Значение по умолчанию - 0 (неограничено).
22. relaymailfromЭтот файл содержит адрес отправителя или домен отправителя со знаком <@> перед именем домена, которым разрешен relay через сервер. Это действительно плохая идея. Используйте SMTP-after-POP.
# echo "
friend@company.com"; > relaymailfrom
# echo "@others.com" >> relaymailfrom
23. rbllistСодержит список RBL (Real Time Black List) серверов для проверки IP адресов отправителей. Требует дополнительной настройки.
24. badrcpttoСодержит список отвергаемых локальных адресов. Если отправитель имеет RELAYCLIENT="", записи в файле игнорируются.
25. dirmakerЕсли вы компилировали qmail-ldap с функцией autohomedirmake, этот файл содержит полный путь к скрипту, создающему директорию для пользовательской почты. Скрипт исполняется с GID и UID указанного пользователя, поэтому убедитесь в правильности установленных разрешений на запись в каталог. Эта функция особенно полезна в среде с виртуальными пользователями (у которых нет реального домашнего каталога), с использованием единственного реального GID/UID, к примеру, virtual/virtual (uid/gid). В таком случае только virtual должен иметь право на запись в каталог. Скрипт принимает единственный входной параметр, указывающий полный путь к создаваемому каталогу.
Пример скрипта:
#!/bin/bash
mkdir -m 700 -p $1
26. ldapclusterОдна из самых замечательных функций qmail - <родная> поддержка кластеризации. Конечно, в том случае, и только в том, если вы компилировали qmail с поддержкой кластеризации. Вы можете включить кластер, установив значение в 1.
# echo 1 > ldapcluster
27. ldapmailhostАльтернативное имя данного хоста для использования в кластерном окружении. Например, файл "me" содержит в себе запись mail1.company.com. Файл "ldapmailhost" содержит например mail2.company.com . Тогда любая почта, для пользователей с атрибутом mailHost, равным mail1.company.com или mail2.company.com будет доставлена локально. Прим: можно указать более одного альтернативного имени. Записи разделяются символом новой строки.