Целью данного HOW-TO является создание легко управляемой и масштабируемой почтовой системы, все записи о пользователях которой хранятся в LDAP. Описываемый процесс установки производился на Linux Mandrake 9.1. Сразу хотелось бы отметить, что поставляемые с этим дистрибутивом rpm-пакеты postfix'а и courier-imap'а не подойдут. К сожалению, после многих попыток было обнаружено, что настроить их на нормальную работу по данной схеме невозможно. Симптомы следующие: Postfix в логах ругался, что не может выложить почту в Maildir пользователя, якобы доступ на запись запрещён, а courier-imap в свою очередь всегда отказывал в доступе, ссылаясь на неправильный пароль. После установки postfix и courier-imap из сырцов с абсолютно той же конфигурацией вышеуказаные проблемы исчезли. Оставим это на совести сборщиков дистрибутива и перейдём к описанию процесса настройки.
·OpenLDAP
~ Установка
OpenLDAP был установлен из rpm'ов, поставляемых с дистрибутивом и был признан годным к употреблению. При желании можно было собрать также из сырцов, но так как данная сборка работала вполне корректно, то я оставил её как есть. В целом потребовались следующие пакеты: · openldap-2.0.27-5.3mdk · openldap-guide-2.0.27-5.3mdk · openldap-clients-2.0.27-5.3mdk · openldap-servers-2.0.27-5.3mdk · libldap2-2.0.27-5.3mdk · libldap2-devel-2.0.27-5.3mdk · libldap2-devel-static-2.0.27-5.3mdk
development-пакеты openldap потребуются при сборке postfix из сырцов.
~ Конфигурация
1. /etc/openldap/slapd.conf - конфигурационный файл сервиса slapd # Включите данные схемы include /usr/share/openldap/schema/core.schema include /usr/share/openldap/schema/cosine.schema include /usr/share/openldap/schema/corba.schema include /usr/share/openldap/schema/inetorgperson.schema include /usr/share/openldap/schema/nis.schema include /usr/share/openldap/schema/openldap.schema include /usr/share/openldap/schema/qmail.schema
# Последняя схема была найдена среди исходников courier-imap, и я посчитал # необходимым включить её в slapd.conf. include /etc/openldap/schema/authldap.schema
database ldbm suffix "dc=home,dc=ru" rootdn "cn=root,dc=home,dc=ru" # Пароль rootpw лучше всего указывать в зашифрованном виде. # Для генерации шифрованного пароля используйте утилиту slappasswd # Например: slappaswd -h {MD5} rootpw {MD5}6Q2kox8osDMVzi5zSKI6YQ==
directory /var/lib/ldap
index objectClass,uid,uidNumber,gidNumber eq index cn,mail,surname,givenname eq,subinitial
# logging loglevel 256
# Basic ACL access to attr=userPassword by self write by anonymous auth by dn="cn=courier,ou=daemons,dc=home,dc=ru" read by * none
access to attr=accountStatus by dn="cn=courier,ou=daemons,dc=home,dc=ru" read by dn="cn=postfix,ou=daemons,dc=home,dc=ru" read
access to * by * read
В принципе это основные моменты конфигурационного файла. Можно несколько усложнить конфигурацию: настроить более сложные правила доступа к LDAP-записям и т.д. Но это можно сделать позднее при необходимости. Главное, что текущей настройки достаточно для нормального запуска OpenLDAP. Если возникнут какие-либо проблемы, внимательно изучите логи, обычно там находится вся необходимая информация. Запускается ldap простой командой: service ldap start В сборке от Mandrake OpenLDAP запускается под непривелегированным пользователем ldap. Это следует учесть, если вы будете собирать OpenLDAP из сырцов, обязательно создайте пользователя и группу ldap, дайте этому пользователю права на запись в каталог /var/lib/ldap и запускайте демон slapd с параметрами: -u ldap -g ldap. Запускать slapd от суперпользователя, как говорит Григорий, "дурной тон"...
2. /etc/ldap.conf host 127.0.0.1 base dc=home,dc=ru ldap_version 3 rootbinddn cn=root,dc=home,dc=ru scope one pam_filter objectclass=posixAccount pam_login_attribute uid pam_member_attribute gid pam_password crypt nss_base_passwd ou=Users,dc=home,dc=ru?one nss_base_shadow ou=Users,dc=home,dc=ru?one ssl off
Данный файл является конфигурацией ldap-клиента.
~ Добавление записей в LDAP
В LDAP будут хранится записи структуры каталога и пользовательских записей. Всё это можно представить в виде древовидной структуры:
Т.е. имеется главный контейнер "home.ru". Далее выделяются контейнеры ou=users - где будут хранится описания пользователей (типа адресной книги), ou=mailusers - вся информация по почтовым пользователям (адреса, мыло, локальное хранилище почты и т.д.), ou=daemons - ldap-пользователи сервисов postfix и courier-imap (именно под данными пользователями указанные сервисы будут подключаться к ldap-серверу для получения необходимой им информации). В принципе, можно было обойтись без контейнера mailusers, а всю необходимую информацию включить в аттрибуты пользователей контейнера ou=users. Но в будущем мне может потребоваться помимо пользователей почты включить также пользователей Samba, Squid. При миграции аккаунтов возможны совпадения логинов различных пользователей, также для некоторых пользователей было бы желательно иметь различные пароли для разных сервисов. Поэтому такая схема (может быть некорректная с точки зрения теории) достаточно гибка и позволит мне без проблем проводить миграцию пользовательских учётных записей любых сервисов в LDAP. Переложим данную структуру в ldif-файлы:
Базовое дерево: #base.ldif dn: dc=home,dc=ru objectClass: dcObject dc: home
dn: ou=Users,dc=home,dc=ru objectClass: organizationalUnit ou: Users description: Home Users
dn: ou=mailusers, dc=home, dc=ru objectclass: top objectclass: organizationalunit ou: mailusers description: users with mailaccounts at my home.
dn: ou=daemons, dc=home, dc=ru objectclass: top objectclass: organizationalunit ou: daemons description: daemons thats connect to LDAP
Добавим пользователей: #users.ldif dn: uid=crux,ou=Users,dc=home,dc=ru uid: crux cn: Lettiev V.V. cn: Vladimir Lettiev sn: Admin givenName: Vladimir title: Systems Administrator mail: crux@home.ru telephoneNumber: 24-55-07 objectClass: Person objectClass: OrganizationalPerson objectClass: inetOrgPerson
dn: cn=postfix,ou=daemons,dc=home,dc=ru objectClass: top objectClass: person cn: postfix sn: postfix userPassword: {crypt}lT3u7UFC2hdWA
dn: cn=courier,ou=daemons,dc=home,dc=ru objectClass: top objectClass: person cn: courier sn: courier userPassword: {crypt}hjUyfu886SJhA
Теперь необходимо записать эти данные в LDAP-каталог. Выполнятеся это следующей последовательностью команд: # ldapadd -W -x -D "cn=root,dc=home,dc=ru" -f base.ldif # ldapadd -W -x -D "cn=root,dc=home,dc=ru" -f users.ldif Если всё прошло гладко и сообщений об ошибках не поступило, то можно переходить к следующему этапу.
·Postfix
MTA Postfix считается одним из самых безопасных, надёжным и простым в настройке почтовым сервисом. В данном примере используется версия 2.0.10.
~ Установка
$ tar -xzf postfix-2.0.10.tar.gz $ cd postfix-2.0.10
Соберём makefiles с поддержкой LDAP ( devel-файлы LDAP должны находится в /usr/include, а библиотеки в /usr/lib ) $ make makefiles CCARGS="-I/usr/include -DHAS_LDAP" \ AUXLIBS="-L/usr/lib -lldap -L/usr/lib -llber" $ make
Теперь надо создать пользователя postfix и группу postdrop (или убедится, что они уже есть) # groupadd postdrop # adduser -s /bin/false -G postdrop -d /var/spool/postfix postfix
Теперь можно выполнить инсталляцию postfix # make install
По ходу инсталяции будут задаваться вопросы, касаемые местоположения разных компонентов системы, фактически можно просто нажимать Enter, всё что предлагается по умолчанию вполне удобно.
# Вся почта пользователей будет принадлежать одному пользователю # (например, vmail), с uid=1001 и gid=1001 virtual_uid_maps = static:1001 virtual_gid_maps = static:1001 virtual_recipient_maps = ldap:ldapsource virtual_mailbox_size_limit = ldap:ldapquota virtual_minimum_uid = 500
# Корневая папка, внутри которой будет хранится вся почта пользователей virtual_mailbox_base =/var/imap/home
В данной конфигурации postfix будет доставлять почту виртуальным пользователям, т.е. фактически пользователи не существуют в системе, они присутствуют лишь в LDAP. Местоположение Maildir какалога определяется атрибутом mailbox пользователя. Вся почта пользователей будет принадлежать одному реальному пользователю vmail(uid=1001,gid=1001). Почтовая квота также определяется из атрибута пользователя mailQuota. Можно также было производить поиск alias'ов из LDAP-каталога, но в данном случае это излишне, потому что alias'ы прописываются пользователям в качестве дополнительных атрибутов mail. Можно проверить конфигурацию postfix (команда: postfix check), если же не появились сообщения об ошибках, то это значит, что всё ок и можно запустить Postfix (команда postfix start).
А также создать Maildir-каталог пользователю crux # mkdir -m 0700 /var/imap/home/crux # maildirmake /var/imap/home/crux/Maildir # chown -R vmail.vmail /var/imap/home/crux
Если у вас нет утилитки maildirmake, то это не проблема, под созданием Maildir каталога, имеется ввиду создание каталогов: <userHomeDir>/Maildir <userHomeDir>/Maildir/cur <userHomeDir>/Maildir/new <userHomeDir>/Maildir/tmp Права на все каталоги - 0700.
Вообще, на будущее, для простого создания почтовых пользователей можно написать небольшой скрипт.
Письмо отправилось. Замечательно, теперь необходимо настроить Courier-Imap для того чтобы пользователи смогли получать свою почту.
·Courier-Imap
Courier-Imap - это превосходный IMAP, POP3 сервер. Поддержка ldap встроена, и при компиляции он не требует devel-файлов OpenLDAP.
~ Установка $ tar xzf courier-imap-1.7.3.tar.gz $ cd courier-imap-1.7.3 $ ./configure --prefix=/usr/local $ make $ make check # make install # make install-configure
Для того чтобы запустить IMAP и POP3 сервисы, воспользуйтесь следующими командами: # /usr/local/libexec/imapd.rc start # /usr/local/libexec/pop3d.rc start
Следует отметить, что если вы отключаете какой-либо из этих двух сервисов, то второй тоже должен быть отстановлен, т.к. скрипты запуска сделаны таким образом, что они запускают или останавливают сервис authdaemon.ldap и если один из сервисов остановить, то будет остановлен и authdaemon.ldap, соотвественно оставшийся сервис (скажем pop3) не сможет обрабатывать запросы, т.к. не сможет подключиться к authdaemon.ldap.
Теперь можно проверить почтовый ящик crux@home.ru. $ telnet localhost 110 Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. +OK Hello there. user crux@home.ru +OK Password required. pass mysuperpass +OK logged in. list +OK POP3 clients that break here, they violate STD53. 1 374 . quit +OK Bye-bye. Connection closed by foreign host.
Как видно письмо присутствует в ящике. Также следует отметить, что в качестве логина использовался не "crux", а crux@home.ru. Т.к. в качестве атрибута пользователя, по которому ведётся поиск в LDAP используется "mail", если бы в параметре LDAP_MAIL файла authldaprc мы поставили бы атрибут "uid", то в таком случае логин был бы просто "crux". Но представьте себе ситуацию, когда у вас есть почтовые адреса admin@mail.home.ru и admin@net.home.ru и они принадлежат двум разным людям, то если использовать в качестве логина пользователя его uid, то можем получить, например, что первый admin будет входить под логином admin1, a другой под admin2 - что неочевидно (исходя из названия мыла), да и не очень удобно.
Пожалуй это всё. Если есть вопросы или вы обнаружили ошибки, пишите на crux@syktsu.ru