Postfix: как превратить системных пользователей в виртуальных
Перевод настроенного по умолчанию почтового сервера (адресаты основного домена postfix - системные пользователи сервера) на обслуживание только виртуальных доменов удобнее производить сразу - это займет несколько часов. Однако иногда возникает необходимость поэтапного перевода, без остановки почтовой системы.
Эти рекомендации описывают постепенный перевод системных пользователей в виртуальные пользователи основного домена postfix как этап перевода этого домена в виртуальный.
Для опытных администраторов
Технология перевода основана на использовании специального класса адресатов postfix «fallback» - для принадлежащих к основному домену postfix, но не имеющим системной учетной записи. Для доставки почты таким адресатам локальный агент доставки (LDA) POP3/IMAP сервера настраивается как программа (fallback_command) или транспорт postfix (fallback_transport).
При использовании POP3/IMAP сервера dovecot как fallback_transport он
настраивается так же, как и виртуальный транспорт (см. документацию на
dovecot), однако в командной строке вместо -d ${recipient}
необходимо
писать -d ${user}
.
Для недостаточно опытных администраторов
Для перевода системных пользоватетей в виртуальные (не имеющих системной учетной записи) понадобится POP3/IMAP сервер, имеющий в своем составе LDA и способный работать как с системными пользователями, так и со своей базой пользователей (текстовая, SQL, LDAP и т.п.).
Строго говоря, LDA от POP3/IMAP сервера требуется только на время перевода юзеров в виртуальные - когда основной домен postfix сам станет виртуальным, LDA можно отключить - почту можно доставлять встроенным виртуальным транспортом postfix.
Перевод системных пользователей в виртуальные удобен для кардинальной перестройки почтовой системы (например, на хранение базы виртуальных пользователей в БД LDAP или SQL, изменение типа хранилища почты - из mbox в Maildir или dbm, перенос хранилища почты в другую директорию и т.п.).
Примеры настройки приводятся для моей концигурации:
-
POP3/IMAP-сервер - dovecot
-
Почта хранится в Maildir
-
Почтовая директория -
~/mail/inbox/
-
Список виртуальных пользователей postfix - текстовый файл (БД формата hash)
-
Список паролей dovecot - текстовый файл, схема паролей - CRYPT (пароли задаются утилитой htpasswd из комплекта веб-сервера apache)
До перевода агентом доставки для системных пользователей был dovecot LDA:
main.cf:
mailbox_command = /usr/local/libexec/dovecot/deliver
Подготовка к переводу:
-
В системе создается пользователь - владелец директории с виртуальными почтовыми ящиками.
-
В POP3/IMAP сервере создается отдельная БД виртуальных пользователей (текстовая, SQL или LDAP) с GID и UID владельца «виртуальных» ящиков.
-
Postfix настраивается для использования этой БД в качестве списка получателей. Если он не может напрямую работать с БД, необходим список получателей - текстовой файл («выжимка» из этой БД).
На примере моей почтовой системы:
Пусть ящики виртуальных пользователей принадлежат системному пользователю
virtual
и хранятся в директории
/home/virtual/<domain.ru>/<username>/mail/inbox
.
Тогда:
-
Создаете системного пользователя virtual, запоминаете его UID и GID (допустим, 5000).
Блокируете возможность входа в систему с такой учетной записью. -
Создаете файл со списком получателей для postfix (назовем его
usermap
), генерируете hash-БД из него, создаете пустой файл паролей (password) для dovecot:# cd /home/virtual # touch usermap # postmap usermap # touch password
-
В файле
main.cf
в переменнуюlocal_recipient_maps
добавляетеhash:/home/virtual/usermap
-
В настройки dovecot (файл dovecot.conf) описываете файл
/home/virtual/password
как базу паролей, создаете базу данных типа “static”:passdb passwd-file { args = /home/virtual/password } userdb static { args = uid=5000 gid=5000 home=/home/virtual/<domain.ru>/%n }
-
Объявляете dovecot LDA как fallback_transport:
В файл master.cf:
# Dovecot LDA dovecot unix - n n - - pipe flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${user}
В файл main.cf:
dovecot_destination_recipient_limit = 1 fallback_transport = dovecot
Обращаю внимание, что в командной строке для запуска deliver указано
-d ${user}
, а не-d ${recipient}
, как в документации на Dovecot! -
Перезапускаем dovecot и postfix
# /usr/local/etc/rc.d/dovecot restart # postfix reload
Перевод пользователей, которым не требуется системная учетная запись:
-
Переводимый пользователь добавляется в базу POP3/IMAP сервера.
-
Если postfix не может работать с этой БД - в текстовой файл требуемого postfix формата.
-
Почта этого пользователя переносится на новое место, владелец ее изменяется на «виртуального» системного пользователя.
-
Системная учетная запись переводимого пользователя удаляется.
Перед удалением реальных пользователей рекомендуется потренироваться на фиктивных временных пользователях.
На примере моей почтовой системы:
-
Внести пользователя в файл usermap:
user1<Tab>Иванов Иван Иванович
или
user1<Tab>domain.ru/user1/mail/inbox/
-
Создать из файла usermap hash-базу:
# postmap usermap
-
Создать пароль для пользователя:
# htpasswd passwd user1 New password: Re-type new password: Adding password for user user1
-
После переноса почты убедиться, что старый почтовый ящик пользователя пустой, удалить системного пользователя:
# rmuser user1
Остановимся на файле usermap
. Поскольку его структура практически
полностью соответствует
структуре списка адресатов виртуального домена (virtual_mailbox_maps),
рекомендую заполнять его с учетом конфигурацию почтового сервера в будущем
(с виртуальными доменами):
-
Если по ящикам почту будет раскладывать внешний транспорт (тот же dovecot), правая часть файла может быть любой:
user1<Tab>Иванов Иван Иванович user2<Tab>Мухоморыч
-
Если по ящикам виртуального домена почту будет раскладывать встроенный транспорт postfix’а (virtual), правая часть файла должна содержать путь для доставки почты:
user1<Tab>domain.ru/user1/mail/inbox/ user2<Tab>domain.ru/user2/mail/inbox/
Перевод в виртуальные пользователей, которым оставляется системная запись, осуществляется также, как и для обычных пользователей, подготовка к переводу следующая:
-
На время перевода рекомендую останавливать работу postfix.
-
В настройках postfix (файл
main.cf
) в качествеmailbox_transport
объявить тот же транспорт, что иfallback_transport
; переменнуюmailbox_command
удалить.
Вот и все.
Осталось перенастроить postfix на работу с виртуальным доменом.
Рекомендуем эту настройку не затягивать.
Автор: Георгий Мурый, site@moury.ru, 2008 год