Ключевые слова:sendmail, cyrus, imap, mail, virtual, freebsd, (найти похожие документы)
From: Andrey Y. Ostanovsky
Date: Mon, 21 May 2006 18:21:07 +0000 (UTC)
Subject: Настройка виртуальных почтовых доменов на базе cyrus-imap и sendmail
Оригинал: http://binkd.spb.ru/howto/cyrus-sendmail.howto.txt
1. Исходная задача.
На работающем сервере, где уже имеются почтовые ящики с живыми
POP3 клиентами и штатными мейлбоксами (базовая почтовая система
FreeBSD), развернуть imap сервер и виртуальные домены на нем.
Старые клиенты продолжают пользоваться своими старыми ящиками.
Сделать это желательно не прибегая к изменению исходного кода
используемых программ.
Чтобы старые и новые пользователи не мешали друг другу при
получении почты по POP3 - новые пользователи с виртуальными
доменами ходят только по протоколам pop3s или imap.
2. Установка необходимого программного обеспечения.
Sendmail - поставляется и обновляется вместе с операционной системой.
Version 8.13.3
Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7
NAMED_BIND NETINET NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF
STARTTLS TCPWRAPPERS USERDB XDEBUG
Особенности сборки sendmail описаны в /etc/make.conf или в
соответствующем файле из дерева исходных текстов:
# $FreeBSD: src/share/examples/etc/make.conf,v 1.229.2.12 2005/03/07 20:39:34 phk Exp $
# Setting the following variables modifies the build environment for
# sendmail and its related utilities. For example, SASL support can be
# added with settings such as:
# with SASLv2:
SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2
SENDMAIL_LDFLAGS=-L/usr/local/lib
SENDMAIL_LDADD=-lsasl2
Пересборка sendmail-a отдельно от "world" делается следующими командами:
cd /usr/src/usr.sbin/sendmail
# make clean && make obj
# make depend && make && make install
......
Cyrus-imap - устанавливается из портов и попутно ставит cyrus-sasl
cyrus-imapd-2.2.12_1 The cyrus mail server, supporting POP3 and
IMAP4 protocols
cyrus-sasl-2.1.21 RFC 2222 SASL (Simple Authentication and
Security Layer)
3. Конфигурация
Cyrus
Практически не отличается от того, что рекомендовано в документации.
==== imapd.conf ====
#
altnamespace: yes
servername: host.base-domain.ru (здесь и далее названия вымышленные)
admins: superadmin admin@virt-domain.ru
#
# собственно включение поддержки виртуальных доменов
# если не хочется биться с резольвингом обратной зоны - ставим userid
virtdomains: userid
defaultdomain: base-domain.ru
#
# _две_ директивы для некодированных в MIME русских Subject-ов
reject8bit: no
pass8bit: yes
#
# sasl авторизация
sasl_pwcheck_method: auxprop
sasl_auxprop_plugin: sasldb
#
==== imapd.conf ====
Сертификаты для cyrus-а генерируем примерно таким скриптом:
==== cyrus_create_cert.sh ====
#!/bin/sh
#
# Генерируем сертификаты (в процессе нужно будет заполнить несколько
# полей информацией об организации):
#
IMAP_KEYPATH="/var/imap/server.pem.new"
#
openssl req -new -x509 -nodes -out ${IMAP_KEYPATH} -keyout ${IMAP_KEYPATH} -days 365
#
chown cyrus:mail ${IMAP_KEYPATH}
#
openssl x509 -noout -text -in ${IMAP_KEYPATH}
#
# Вышеприведенной командой мы создали X.509 сертификат, действительный 1
# год (эта строчка для генерации есть в документации к cyrus-imapd). За
# более подробной информацией по поводу сертификатов и openssl в общем
# можно сходить на http://www.openssl.org/ в раздел документации,
#
==== cyrus_create_cert.sh ====
Если все устраивает, то переименовываем server.pem.new в server.pem и пускаем в работу.
В основном, при генерации сертификатов надо обращать внимание на примерно такую строчку:
"serial:BB:2E:DD:AF:3E...", на одной из машин этот serial, при генерации ключей,
почему-то упорно был равен нулю - с таким ключом cyrus работать не захотел.
==== cyrus.conf ====
#
# Проследить, чтобы было раскомментировано
#
lmtpunix cmd="lmtpd" listen="/var/imap/socket/lmtp" prefork=0
==== cyrus.conf ====
Конфигурационные файлы готовы, остается запустить описанную в документации
процедуру создания базы(partition) Cyrus-а, и можно стартовать master-процесс,
который слушает указанные в cyrus.conf порты.
Sendmail
Для работы sendmail по SSL генерим ключи и указываем пути к ним в конфиге.
==== /etc/mail/certs/create_cert.sh ====
#!/bin/sh
#
#
openssl req -new -x509 -keyout cakey.pem -out cacert.pem -days 365
#
openssl req -nodes -new -x509 -keyout sendmail.pem -out sendmail.pem -days 365
#
openssl x509 -noout -text -in sendmail.pem
#
chmod 600 ./sendmail.pem
#
==== /etc/mail/certs/create_cert.sh ====
Добавлен новый мейлер cyrusv2, но не объявлен локальным доставщиком
почты. Дело в том, что старые пользователи должны продолжать пользоваться
своими почтовыми ящиками по старой схеме.
==== sendmail.mc ====
MAILER(local)
MAILER(smtp)
MAILER(cyrusv2)
==== sendmail.mc ====
после чего по make cf создаем новый sendmail.cf
Виртуальный домен, кроме DNS, заносим только в mailertable, ни в какие
local-host-names его заносить не надо!
==== mailertable ====
virt-domain.ru cyrusv2:/var/imap/socket/lmtp
==== mailertable ====
Однозначного примера, как задать параметры флагов для cyrusv2 из mc
я не нашел, а разбираться не было времени, поэтому поменял значения
прямо в sendmail.cf
==== sendmail.cf ====
Mcyrusv2,
...
S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrToL, E=\r\n,
...
==== sendmail.cf ====
Без этой замены EnvToL на EnvToSMTP не работает доставка на витруальные
домены с примерно такой диагностикой:
... while talking to localhost:
>>> DATA
<<< 550-Mailbox unknown. Either there is no mailbox associated with this
<<< 550-name or you do not have authorization to see it.
<<< 550 5.1.1 User unknown
Альтернативный вариант доставки через procmail и delivery, позволяющий использовать
предварительную сортировку.
==== procmail-cyrus-delivery.sh ====
#!/bin/sh
# http://subwiki.honeypot.net/cgi-bin/view/Freebsd/SendMailAndCyrus
# script name: procmail-cyrus-delivery.sh
#
LOGNAME=$1
formail -I"From " | /usr/local/cyrus/bin/deliver -a $LOGNAME -m user.$LOGNAME
==== procmail-cyrus-delivery.sh ====
==== .procmailrc ====
:0fw
* ^Subject: ERROR
| /path/to/your/scripts/procmail-cyrus-delivery.sh $LOGNAME
==== .procmailrc ====
4. Администрирование и работа.
В документации где-то попалась фраза о том, что в виртуальных доменах нельзя назначить
shared папки, которые были бы доступны пользователям разных доменов.
Соответственно, для каждого вновь поднимаемого домена нужно добавить запись про админа в
директиве admins: файла imapd.conf, чтобы во-первых, можно было делегировать кому-то
управление, не опасаясь, что будет снесено все, и, во-вторых, для того, чтобы не вводить
каждый раз "длинное" имя пользователя при работе с его ящиком. Для админа virt-domain-а
- ящики имеют привычные короткие имена пользователей(то, что написано до @).
Замечание: папки для юзеров virt-domain (и его админа - тоже) надо создавать под аккаунтом
админа virt-domain, причем, для самого админа - руками (cyradm), иначе, из почтового клиента,
типа Thunderbird и административного аккаунта - subfolders получаются не вида user.name.foo,
а в виде паблик фолдера "foo@virt-domain" с правами "anyone lrs". Чей это глюк - пока не
разбирался.
Причем, для админа virt-domain перестает работать схема "altnamespace: yes", то есть, его
subfolders должны быть созданы заранее в виде:
localhost> lm INBOX*
INBOX (\HasChildren)
INBOX.Sent (\HasNoChildren)
subfolders у непривилегированых пользователей виртуального домена, из клиента Thunderbird
создаются нормально и с нормальными правами.
localhost> lm user.post*
user.post (\HasChildren)
user.post.Trash (\HasNoChildren)
user.post.Sent (\HasNoChildren)
При попытке выцепить проходящее мимо письмо в локальный мейлбокс, замечено, что virtusertables
в отношении виртуальных доменов - не работают, скорее всего должны работать штатные операции
sendmail-а по работе с виртуальными доменами.
Небольшой скриптик, генерирующий пароли для ввода в saslpasswd2
==== add_sasldb_user.sh ====
#!/bin/sh
# $Id: cyrus-sendmail.howto,v 1.7 2005/11/22 13:08:33 aost Exp $
# Небольшой скриптик, генерирующий пароли для ввода в saslpasswd2
#
SASL_CMD="/usr/local/sbin/saslpasswd2"
SASL_DBL="/usr/local/sbin/sasldblistusers2"
#
if [ ! -f ${SASL_CMD} -a ${SASL_DBL} ]; then
echo "Error: executable files not found!"
echo "${SASL_CMD} or ${SASL_DBL}"
exit
fi
#
if [ "x$1" = "x" ]; then
echo "Usage: $0 user@name"
exit
fi
#
# check user
#
CHK_DBL=`${SASL_DBL}|grep ${1}`
#
if [ -z "${CHK_DBL}" ]; then
AUTO=`pw -V /tmp useradd post -w random 2>/dev/null |awk '{print $0}'`
echo ${AUTO}|${SASL_CMD} -cp ${1} && echo "Added user: $1 pass: ${AUTO}"
else
echo "Error: possible duplicate user"
echo "Found in sasldb:"
echo "${CHK_DBL}"
exit
fi
#
==== add_sasldb_user.sh ====
Вот пока, собственно, и весь опыт, наработанный мной на виртуальных
почтовых доменах.
Andrey Y. Ostanovsky
***************
Однозначного примера, как задать параметры флагов для cyrusv2 из mc
я не нашел, а разбираться не было времени, поэтому поменял значения
прямо в sendmail.cf
==== sendmail.cf ====
Mcyrusv2,
...
S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrToL, E=\r\n,
...
==== sendmail.cf ====
*************
В *.mc файле так и прописать
MAILER_DEFINITIONS
Mcyrusv2, P=[IPC], F=lsDFMnqA@/:|SmXz, E=\r\n,
S=EnvFromSMTP/HdrFromSMTP, R=EnvToSMTP/HdrToL,
T=DNS/RFC822/X-Unix, A=FILE $h