Сайт Георгия Мурого

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, перенос хранилища почты в другую директорию и т.п.).

Примеры настройки приводятся для моей концигурации:

До перевода агентом доставки для системных пользователей был dovecot LDA:

main.cf:

mailbox_command = /usr/local/libexec/dovecot/deliver

Подготовка к переводу:

  1. В системе создается пользователь - владелец директории с виртуальными почтовыми ящиками.

  2. В POP3/IMAP сервере создается отдельная БД виртуальных пользователей (текстовая, SQL или LDAP) с GID и UID владельца «виртуальных» ящиков.

  3. Postfix настраивается для использования этой БД в качестве списка получателей. Если он не может напрямую работать с БД, необходим список получателей - текстовой файл («выжимка» из этой БД).

На примере моей почтовой системы:

Пусть ящики виртуальных пользователей принадлежат системному пользователю virtual и хранятся в директории /home/virtual/<domain.ru>/<username>/mail/inbox.

Тогда:

  1. Создаете системного пользователя virtual, запоминаете его UID и GID (допустим, 5000).
    Блокируете возможность входа в систему с такой учетной записью.

  2. Создаете файл со списком получателей для postfix (назовем его usermap), генерируете hash-БД из него, создаете пустой файл паролей (password) для dovecot:

    # cd /home/virtual
    # touch usermap
    # postmap usermap
    # touch password
    
  3. В файле main.cf в переменную local_recipient_maps добавляете

    hash:/home/virtual/usermap
    
  4. В настройки 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
    }
    
  5. Объявляете 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!

  6. Перезапускаем dovecot и postfix

    # /usr/local/etc/rc.d/dovecot restart
    # postfix reload
    

Перевод пользователей, которым не требуется системная учетная запись:

  1. Переводимый пользователь добавляется в базу POP3/IMAP сервера.

  2. Если postfix не может работать с этой БД - в текстовой файл требуемого postfix формата.

  3. Почта этого пользователя переносится на новое место, владелец ее изменяется на «виртуального» системного пользователя.

  4. Системная учетная запись переводимого пользователя удаляется.

Перед удалением реальных пользователей рекомендуется потренироваться на фиктивных временных пользователях.

На примере моей почтовой системы:

  1. Внести пользователя в файл usermap:

    user1<Tab>Иванов Иван Иванович
    

    или

    user1<Tab>domain.ru/user1/mail/inbox/
    
  2. Создать из файла usermap hash-базу:

    # postmap usermap
    
  3. Создать пароль для пользователя:

    # htpasswd passwd user1
    New password:
    Re-type new password:
    Adding password for user user1
    
  4. После переноса почты убедиться, что старый почтовый ящик пользователя пустой, удалить системного пользователя:

    # rmuser user1
    

Остановимся на файле usermap. Поскольку его структура практически полностью соответствует структуре списка адресатов виртуального домена (virtual_mailbox_maps), рекомендую заполнять его с учетом конфигурацию почтового сервера в будущем (с виртуальными доменами):

Перевод в виртуальные пользователей, которым оставляется системная запись, осуществляется также, как и для обычных пользователей, подготовка к переводу следующая:

  1. На время перевода рекомендую останавливать работу postfix.

  2. В настройках postfix (файл main.cf) в качестве mailbox_transport объявить тот же транспорт, что и fallback_transport; переменную mailbox_command удалить.

Вот и все.

Осталось перенастроить postfix на работу с виртуальным доменом.

Рекомендуем эту настройку не затягивать.

Автор: Георгий Мурый, site@moury.ru, 2008 год