Материалы по интеграции qmail и LDAP уже были представлены на ресурсе,
однако в связи с изменениями в конфигурировании qmail-LDAP а также
множеством просьб о кратком и эффективном руководстве по инсталяции и
администрированию было принято решение написать данный HOWTO.
В данной статье приведена информация которая поможет быстро и
эффективно запустить новую систему электронной почты и DNS сервер на
любой UNIX-подобной операционной системе. В качестве рабочей платформы
здесь используется FreeBSD 4.9/i386. Учитывая специфику любой другой
UNIX системы, можно успешно установить все описываемое ПО.
Работаем
Итак, классическая задача: необходимо установить и настроить почтовый
сервер предприятия, который смог бы размещать более тысячи почтовых
ящиков, был бы легко управляем и масштабируем. Кроме того, сервер
будет выполнять другие функции, как например сервер первичной зоны DNS
и т.д. Имеется достаточно мощный IBM PC сервер с уже установленной ОС
FreeBSD 4.9, процесс установки которой здесь не рассматривается.
Машина имеет два сетевых интерфейса, один из которых "смотрит" внутрь
и имеет соответственно внутренний ip, другой смотрит наружу и имеет
полноценный IANA адрес. Дополнительно рекомендуется установить из
пакетов/портов следующие компоненты: gmake-3.8xx (обязательно),
gnuls-4.xx (цветной "ls" для удобства), joe-2.8xx (удобный редактор).
Устанавливаем Berkley DB 4.2.52 (http://www.sleepycat.com).
Нам нужны библиотеки BDB для того, чтобы использовать BDB базу
данных в качестве backend для хранения данных slapd. После того,
как архив был скачан и сохранен в каталог /usr/local/src/sources,
компилируем и устанавливаем компоненты:
# mkdir /usr/local/src/sources/bdb
# mv db-4.2.52.tar.gz /usr/local/src/sources/bdb
# cd /usr/local/src/sources/bdb
# tar -zxvf db-4.2.52.tar.gz
# cd db-4.2.52
# ./dist/configure --prefix=/usr/local/bdb --mandir=/usr/share/man
--libdir=/usr/lib --includedir=/usr/include
# gmake
# gmake install
Устанавливаем OpenLDAP 2.1 (http://www.OpenLDAP.org). На момент написания
статьи последняя доступная -STABLE версия OpenLDAP была 20031217.
Небольшие пояснения: используется директива --enable-crypt для
возможности хранения паролей для аутентификации сессии с slapd в
формате {CRYPT}. Эта директива не обязательна, и используется в целях
совместимости. После того, как бинарники, библиотеки и прочий хлам был
установлен, нужно создать аккаунт пользователя от прав которого будет
действовать slapd, ибо пускать его с правами root крайне дурной тон.
Правим конфиг slapd и ldap.conf. В качестве примера полностью
приводится конфигурационный файл.
# slapd.conf
#
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/qmail.schema
pidfile /var/openldap/slapd.pid
argsfile /var/openldap/slapd.args
# Define ACL's
access to attrs=userPassword
by self write
by users none
by anonymous compare
access to attrs=mail,mailAlternateAddress,mailMessageStore,deliveryMode,accountStatus
by dn.base="uid=qmaild,ou=DAEMON,dc=komitex,dc=ru" read
by users none
access to dn.base="ou=CONFIG,dc=komitex,dc=ru"
by dn.sub="uid=*,ou=DAEMON,dc=komitex,dc=ru" read
by users none
access to dn.base="ou=DAEMON,dc=komitex,dc=ru"
by dn.sub="uid=*,ou=DAEMON,dc=komitex,dc=ru" read
by users none
access to dn=*
by users read
by anonymous auth
# Define SSL/TLS stuff
TLSCertificateKeyFile /etc/openldap/cert/cert.pem
TLSCertificateFile /etc/openldap/cert/cert.pem
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+TLSv1
###################################################################
# ldbm database definitions
###################################################################
database bdb
suffix "dc=komitex,dc=ru"
rootdn "cn=ldapadmin,dc=komitex,dc=ru"
rootpw {SSHA}CENSORED
directory /var/openldap/openldap-data
# Indices to maintain
index objectClass eq
index mail eq,sub
index mailAlternateAddress eq,sub
index uid eq,sub
index accountStatus eq
index mailHost eq
index deliveryMode eq
index uidNumber,gidNumber eq
Как видно из конфигурации slapd, доступ к атрибутам, описывающим
конфигурацию пользователей почты, будет имеет только учетная запись,
предназначенная для qmail-LDAP. Доступ же к атрибуту userPassword
закрыт для всех, кроме владельца. Пароль для rootdn генерируется
утилитой slappasswd. Сертификат для slapd еще не создан, впрочем, как
и не существует (пока) файла qmail.schema. Об этом чуть позже.
На время оставим OpenLDAP в покое, и приступим к настройке DNS
сервера, в качестве которого будет использоваться пакет djbdns (http://cr.yp.to/djbdns/).
Предварительно потребуется также установить daemontools (http://cr.yp.to/daemontools/) и
ucspi-tcp (http://cr.yp.to/ucspi-tcp/). Это обязательные компоненты.
Далее требуется убедиться, что в rc.local была добавлена строка,
запускающая svscanboot. Можно перезагрузиться или запустить svscanboot
так, как это делается из rc.local.
Устанавливаем ucspi-tcp
# mkdir /usr/local/src/sources/ucspi-tcp
# mv ucspi-tcp-0.88.tar.gz /usr/local/src/sources/ucspi-tcp
# cd /usr/local/src/sources/ucspi-tcp
# tar -zxvf ucspi-tcp-0.88.tar.gz
# cd ucspi-tcp-0.88
# gmake
# gmake setup check
Утилиты установлены в /usr/local
Можно приступать к установке и настройке djbdns. Предварительно
несколько пояснений. Итак, на сервере будет функционировать сервер
первичной зоны DNS для домена komitex.ru, DNS кеш для клиентов во
внутренней сети, сервер трансфера зоны и dummy сервер для обратной
зоны в локальной сети.
Устанавливаем djbdns
# mkdir /usr/local/src/sources/djbdns
# mv djbdns-1.05.tar.gz /usr/local/sources/djbdns
# tar -zxvf djbdns-1.05.tar.gz
# cd djbdns-1.05
# gmake
# gmake setup check
Конфигурируем DNS кеш для клиентов во внутренней сети. Когда сервис
будет подыматься, он должен биндится на ip-адрес, принадлежащий
внутренней сети, в данном случае это адрес 192.168.0.1. Т.е. на
основной ip внутреннего сетевого интерфейса. Кроме того, нам
потребуется еще один ip на внутреннем интерфейсе, для того чтобы
забиндить туда walldns для разрешения имен в обратной зоне внутренней
сети. Поэтому у внутреннего интерфейса помимо основного ip-адреса еще
имеется и алиасный, куда и будет производить bind() наш walldns.
Конфигурируем dnscache. Нужно создать также аккаунты в системе.
Предполагаем также лукапы на домен komitex.ru направлять сразу на
локальный DNS сервер и также поступать с лукапами в обратную зону
локальной сети - будем направлять запрос сразу на алиасный ip, куда
будет забинден walldns.
# /etc/tinydns/root/data
# NS и SOA записи для домена komitex.ru
.komitex.ru:217.24.115.21:ns.komitex.ru
# Вторичный NS
&komitex.ru:217.24.114.30:ns.komisat.ru
# MX записи
@komitex.ru:217.24.115.21:mail.komitex.ru:5
@komitex.ru:217.24.114.23:ns.komisat.ru:10
# A записи
=pop.komitex.ru:217.24.115.21
=smtp.komitex.ru:217.24.115.21
=helga.komitex.ru:217.24.115.21
=komitex.komitex.ru:217.24.114.11
=proxy.komitex.ru:217.24.114.12
=hosting.komitex.ru:217.24.114.24
=webhosting.komitex.ru:217.24.114.17
=mandrake.komitex.ru:217.24.114.22
=www.komitex.ru:217.24.115.21
=ftp.komitex.ru:217.24.114.17
=stat.komitex.ru:217.24.114.11
=flex.komitex.ru:217.24.114.30
В этом файле содержится вся информация, нужная для tinydns. После
того, как файл отредактирован, создаем data.cdb просто сказав "gmake"
в каталоге с только что отредактированным файлом данных. Постольку
поскольку операции обновления cdb файлов атомарные, изменять данные
DNS зоны можно во время работы tinydns.
Осталось поднять walldns для обратной зоны внутренней сети. Это
необходимо для нормальной работы некоторых служб в сети, которые
обязательно хотят ресолвить имена клиентов через DNS. Для работы
walldns специально задан дополнительный адрес на внутреннем сетевом
интерфейсе.
На этом с DNS службами поконечно. Можно браться за OpenLDAP и qmail.
Установка qmail-LDAP
Потребуется "чистый" qmail-1.03 (http://cr.yp.to/software/qmail-1.03.tar.gz)
на который будет залит самый последний патч qmail-LDAP
(http://www.nrg4u.com/qmail/qmail-ldap-1.03-20031201.patch.gz).
# mkdir /usr/local/src/sources/qmail
# mv qmail-1.03.tar.gz /usr/local/src/sources/qmail
# cd /usr/local/src/sources/qmail
# tar -zxvf qmail-1.03.tar.gz
В распакованный каталог qmail скачиваем патч.
# patch -p1 < qmail-ldap-1.03-20031201.patch.gz
Редактируем Makefile. Значения уже рассматривались.
Подправим также 67-ю строчку в qmail-ldap.h. Это нужно для того, чтобы
qmail-LDAP не пытался разместить Maildir каталог в домашнем каталоге
пользователя, если такой атрибут присутствует у объекта в LDAP
каталоге.
#define LDAP_HOMEDIR "nohomeDirectory"
Создаем нужные аккаунты в системе, как написано в INSTALL.ids
Так как мы собираемся использовать функции проверки адресов
отправителя и получателя (SENDERCHEK="", RCPTCHECK="") нам нужно дать
разрешение на чтение файла ~control/ldappassword пользователю qmaild,
в противном случае лукапы qmail-verify будут оканчиваться "temporary
ldap lookup error".
В заключении собираем все обновления в *.cdb файлы - для этого теперь
достаточно сказать "gmake" в каталоге ~/control. Для полного счастья
сгенерим сертификат для работы TLS. Кроме того, этот же сертификат
будет использован для TLS/SSL соединений с демоном slapd.
helga# telnet 192.168.0.1 25
Trying 192.168.0.1...
Connected to helga.komitex.ru.
Escape character is '^]'.
220 helga.komitex.ru ESMTP
EHLO
250-helga.komitex.ru
250-PIPELINING
250-SIZE 0
250-STARTTLS
250 8BITMIME
MAIL FROM: [11]admin@net.nordcomp.ru
250 ok
RCPT TO: [12]kitty@komitex.ru
250 ok
DATA
354 go ahead punk, make my day
TEST
.
250 ok 1073248118 qp 14340 by helga.komitex.ru
и POP3 тоже
helga# telnet 192.168.0.1 110
Trying 192.168.0.1...
Connected to helga.komitex.ru.
Escape character is '^]'.
+OK <14426.1073248192@helga.komitex.ru.>;
USER kitty
+OK
PASS kiska-zaika
+OK
stat
+OK 3 958
QUIT
+OK
Connection closed by foreign host.