Серверная почта на основе Postfix, Dovecot и MySQL для Debian

Администрирование > Разное

Postfix — очень мощный почтовый сервер, основанный на идеологии Open Source, его часто называют Postfix MTA — Postfix Mail Transfer Agent. В этом руководстве, собранном из разных истоников и дополненных личными переживаниями, я расскажу как установить Postfix в связке с Dovecot (IMAP/POP3) и MySQL на сервер Apache под управлением OC Debian. Руководство было опробовано на Debian 5 Lenny и Debian 6 Squeeze.

Текст статьи достаточно объёмный, но выполнив все шаги, мы получим в своё распоряжение надёжный почтовый сервер с возможностью добавления почтовых доменов и ящиков прямо через интерфейс MySQL, а это многого стоит.

Серверная почта на основе Postfix, Dovecot и MySQL для Debian

Postfix — очень мощный почтовый сервер, основанный на идеологии Open Source, его часто называют Postfix MTA — Postfix Mail Transfer Agent. В этом руководстве, собранном из разных истоников и дополненных личными переживаниями, я расскажу как установить Postfix в связке с Dovecot (IMAP/POP3) и MySQL на сервер Apache под управлением OC Debian. Руководство было опробовано на Debian 5 Lenny и Debian 6 Squeeze.

Текст статьи достаточно объёмный, но выполнив все шаги, мы получим в своё распоряжение надёжный почтовый сервер с возможностью добавления почтовых доменов и ящиков прямо через интерфейс MySQL, а это многого стоит.

Базовая настройка системы

Предполагается, что в файле /etc/hosts уже есть запись для нашего сервера, в этом примере и ниже по тексту будет использована следующая запись:

127.0.0.1 localhost.localdomain localhost
12.34.56.78 mysrv.example.com mysrv

В файле /etc/hostname должно содержаться сокращённое название сервера, в днном случае mysrv:

echo "mysrv" > /etc/hostname
hostname -F /etc/hostname

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

aptitude update && aptitude safe-upgrade

Установка нужных пакетов

Выполним следующую команду для установки Postfix, Dovecot, OpenSSL и MySQL:

aptitude install postfix postfix-mysql postfix-doc mysql-client mysql-server dovecot-common dovecot-imapd dovecot-pop3d postfix-tls libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl telnet

В процессе установки появится несколько диалогов первоначальной настройки пакетов, вот основные шаги:

  • Во время установки сервера MySQL, если он не был установлен ранее, потребуется ввести пароль для пользователя root. Пароль следует выбрать надёжный;
  • Тип используемого Postfix сервера, — в одноимённом диалоге, — «Internet Site»;
  • В диалоге настройки Postfix следует определиться с почтовым именем. Имеется ввиду полное доменное имя сервера, в нашем примере это mysrv.example.com, его ещё называют FQDN (Fully Qualified Domain Name).

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

aptitude install mailx

или, если недоступен первый вариант прораммы:

aptitude install bsd-mailx

Итак мы установили все необходимые пакеты и готовы перейти к детальной настройке конфигурации.

Настройка MySQL базы данных доменных имён и пользователей

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

mysql -u root -p

После этого должно появиться приглашение к вводу команд MySQL, вроде этого:

mysql>

Создадим базу данных для Postfix и выберем её для дальнейшего использования:

CREATE DATABASE mail;
USE mail;

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

Создадим пользователя с говорящим именем «mail_admin», он у нас будет главный по почте, поэтому наделим его всему привилегиями на всех локальных доменах. ВАЖНО! Сейчас и ниже «mail_admin_password» следует заменить на пароль для этого пользователя, в первой строке он задаётся впервые:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
FLUSH PRIVILEGES;

Далее создаём таблицу в которой будут храниться все активные почтовые домены, доменов может быть сколько угодно и это радует:

CREATE TABLE domains ( domain varchar(50) NOT NULL, PRIMARY KEY (domain) );

Создадим таблицу пересылки почты с ящика на ящик:

CREATE TABLE forwardings ( source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );

Создадим таблицу для хранения почтовых аккаунтов:

CREATE TABLE users ( email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );

И наконец создадим таблицу транспортировки:

CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );

Работа с MySQL на данном этапе завершена, выходим обратно в консоль:

quit

Проверим, что MySQL связана с localhost (127.0.0.1). Для этого откроем файл /etc/mysql/my.cnf и найдём следующую строку:

bind-address = 127.0.0.1

Если MySQL на сервере уже настроен на другой IP адрес, следует это учесть в поледующих шагах настройки Postfix. Не рекомендуется запускать MySQL сервер на публичном IP адресе — это небезопасно.

Чтобы внесённые нами изменения корректно вступили в силу — перезапустим MySQL сервер:

/etc/init.d/mysql restart

На следующем этапе мы настроим Postfix на работу с MySQL.

Настройка Postfix на работу с MySQL

Для каждой таблицы в MySQL нам следует создать файл соответствия для Postfix.

Создадим файл для работы с почтовыми доменами Postfix:

touch /etc/postfix/mysql-virtual_domains.cf

В созданный файл /etc/postfix/mysql-virtual_domains.cf нужно добавить следующие строки, замените пароль «mail_admin_password» на пароль пользователя «mail_admin»:

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain = '%s'
hosts = 127.0.0.1

Создадим похожий файл для настройки пересылки почты с ящика на ящик:

touch /etc/postfix/mysql-virtual_forwardings.cf

В созданный файл /etc/postfix/mysql-virtual_forwardings.cf нужно добавить следующие строки, замените пароль «mail_admin_password» на пароль пользователя «mail_admin»:

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source = '%s'
hosts = 127.0.0.1

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

touch /etc/postfix/mysql-virtual_mailboxes.cf

В созданный файл /etc/postfix/mysql-virtual_mailboxes.cf нужно добавить следующие строки, замените пароль «mail_admin_password» на пароль пользователя «mail_admin»:

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT( SUBSTRING_INDEX(email, '@', -1), '/' , SUBSTRING_INDEX(email, '@', 1), '/' ) FROM users WHERE email = '%s'
hosts = 127.0.0.1

И наконец создаём вспомогательный файл для виртуального отображения почты:

touch /etc/postfix/mysql-virtual_email2email.cf

В созданный файл /etc/postfix/mysql-virtual_email2email.cf нужно добавить следующие строки, замените пароль «mail_admin_password» на пароль пользователя «mail_admin»:

user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email = '%s'
hosts = 127.0.0.1

Установим нужные права и владельца на только что созданные файлы:

chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cf

Добавим почтовую группу и пользователя для передачи почты. Все сообщения виртуальных почтовых ящиков будут храниться в папке /home/vmail на сервере:

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /home/vmail -m

На редактирование файл /etc/postfix/main.cf и убедимся в наличии следующих строк, адрес сервера следует заменить на выбранный ранее:

myhostname = mysrv.example.com
mydestination = mysrv.example.com, localhost, localhost.localdomain
mynetworks = 127.0.0.0/8
message_size_limit = 30720000
virtual_alias_domains =
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/postfix/smtpd.cert
smtpd_tls_key_file = /etc/postfix/smtpd.key
virtual_create_maildirsize = yes
virtual_maildir_extended = yes
proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

На этом мы закончим конфигурировать Postfix и перейдём к настройке SSL и генерации сертификата.

Создание SSL сертификата для Postfix

Нам нужно сгенерировать SSL сертификат для Postfix, чтобы работать с почтой по защищённому соединению. Это гораздо безопаснее нежели обычный доступ по незащищённому каналу. Перейдём в директорию Postfix и создадим там сертификат с приватным ключом:

cd /etc/postfix
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

Сертификат создаётся на год, о чём говорит цифра 365.

На экран будет выведен диалог ввода информации о ключе:

Country Name (2 letter code) [US]: RU
State or Province Name (full name) [Some-State]: Central District
Locality Name (eg, city) []: Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]: MyCompany, LLC
Organizational Unit Name (eg, section) []: Email Services
Common Name (eg, YOUR name) []: mysrv.example.com
Email Address []: [email protected]

Установим права на файл ключа таким образом, чтобы любой доступ был только у владельца, иными словами — отменим права у остальных:

chmod o= /etc/postfix/smtpd.key

На этом создание SSL сертификата завершено, перейдём к настройке saslauthd для доступа к MySQL.

Настройка saslauthd для доступа к MySQL

Saslauthd — это демон аутентификации, который работает посредствам SASL. Нам он нужен, чтобы связать Postfix с MySQL и позволять им совместно работать.

Для начала создадим директорию для saslauthd:

mkdir -p /var/spool/postfix/var/run/saslauthd

Сохраним начальную версию файла:

cp -a /etc/default/saslauthd /etc/default/saslauthd.bak

Откроем на редактирование файл /etc/default/saslauthd и установим в нём следующие значения:

START=yes
DESC="SASL Authentication Daemon"
NAME="saslauthd"
MECHANISMS="pam"
MECH_OPTIONS=""
THREADS=5
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

После этого нам нужно создать файл /etc/pam.d/smtp:

touch /etc/pam.d/smtp

И внести в него следующие строки. Укажите нужный пароль для пользователя «mail_admin», заменив «mail_admin_password» на верное значение:

auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1

Создадим файл /etc/postfix/sasl/smtpd.conf:

touch /etc/postfix/sasl/smtpd.conf

И внесём в него следующие строки, так же заменив пароль на верный:

pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: mail_admin
sql_passwd: mail_admin_password
sql_database: mail
sql_select: SELECT password FROM users WHERE email = '%u'

Установим права на вновь созданные файлы:

chmod o= /etc/pam.d/smtp
chmod o= /etc/postfix/sasl/smtpd.conf

Теперь добавим пользователя postfix в группу sasl и перезапустим сервисы:

adduser postfix sasl
/etc/init.d/postfix restart
/etc/init.d/saslauthd restart

На этом конфигурирование saslauthd завершено. Далее мы настроим Dovecot на использование базы данных MySQL для IMAP/POP3 идентификации.

Настройка Dovecot

Dovecot — это IMAP и POP3 сервер, который позволит нам забирать почту программами сборщиками. Это гибкий и безопасный инструмент в системе Linux.

Нам нужно открыть на редактирование файл /etc/postfix/master.cf и добавить в конце следующие ниже строки:

dovecot unix - n n - - pipe
    flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Сохраним для потомков изначальный конфигурационный файл Dovecot:

cp -a /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.bak

После чего откроем файл /etc/dovecot/dovecot.conf на редактирование и заменим всё его содержимое указанным ниже кодом. Ящик «[email protected]» следует заменить на желаемый:

protocols = imap imaps pop3 pop3s
log_timestamp = "%Y-%m-%d %H:%M:%S "
mail_location = maildir:/home/vmail/%d/%n/Maildir
 
ssl_cert_file = /etc/ssl/certs/dovecot.pem
ssl_key_file = /etc/ssl/private/dovecot.pem
 
namespace private {
  separator = .
  prefix = INBOX.
  inbox = yes
}
 
protocol lda {
  log_path = /home/vmail/dovecot-deliver.log
  auth_socket_path = /var/run/dovecot/auth-master
  postmaster_address = [email protected]
  mail_plugins = cmusieve
  global_script_path = /home/vmail/globalsieverc
}
 
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
}
 
auth default {
  user = root
 
  passdb sql {
    args = /etc/dovecot/dovecot-sql.conf
  }
 
  userdb static {
    args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
  }
 
  socket listen {
    master {
      path = /var/run/dovecot/auth-master
      mode = 0600
      user = vmail
    }
 
    client {
      path = /var/spool/postfix/private/auth
      mode = 0660
      user = postfix
      group = postfix
    }
  }
}

MySQL будет сохранять в себе пароли доступа, поэтому мы сохраним копию первоначального /etc/dovecot/dovecot-sql.conf, а потом произведём настройку:

cp -a /etc/dovecot/dovecot-sql.conf /etc/dovecot/dovecot-sql.conf.bak

Содержимое исходного файла /etc/dovecot/dovecot-sql.conf полностью заменим на нижеуказанное, не забудем поменять пароль «mail_admin_password» на актуальный:

driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email AS user, password FROM users WHERE email = '%u';

На этом настройка Dovecot завершена, следует перезагрузить его:

/etc/init.d/dovecot restart

Проверим файл /var/log/mail.log на отсутсвие ошибок:

tail -50 /var/log/mail.log

И найдём примерно следующие строки:

Feb 13 14:00:17 somevar dovecot: Dovecot v1.0.15 starting up
Jan 21 20:00:18 somevar dovecot: auth-worker(default): mysql: Connected to 127.0.0.1 (mail)

Перед началом тестирования следует установить права и владельца на файл конфигурации Dovecot /etc/dovecot/dovecot.conf:

chgrp vmail /etc/dovecot/dovecot.conf
chmod g+r /etc/dovecot/dovecot.conf

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

telnet localhost pop3

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

Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
+OK Dovecot ready

Выйдем из режима терминала, пока он нам больше не нужен:

quit

С Dovecot разобрались, теперь перейдём к настройке алиасов.

Настройка почтовых алиасов

Откроем на редактирование файл /etc/aliases и убедимся в корректности значений для директив «postmaster» и «root», адрес почты для root следует изменить на желаемый:

postmaster: root
root: [email protected]

Активируем новые алиасы и перезагрузим Postfix:

newaliases
/etc/init.d/postfix restart

На этом настройка алиасов завершена, перейдём к тестированию Postfix.

Тестирование Postfix

Для проверки корректности функционирования SMTP-AUTH и TLS, в консоли введём следующую команду:

telnet localhost 25

После успешного соединения, в терминале должно появиться что-то вроде этого:

220 mysrv.example.com ESMTP Postfix (Debian/GNU)

Далее вводим команду в терминал:

ehlo localhost

После ввода команды, в терминале должно отобразиться нечто вроде этого:

Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 mysrv.example.com ESMTP Postfix (Debian/GNU)
ehlo localhost
250-mysrv.example.com
250-PIPELINING
250-SIZE 30720000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

Для нас важно наличие строки «250-STARTTLS». Вводим в терминал команду «quit» и перейдём к наполнению базы данных MySQL почтовыми доменами и пльзователями.

Настройка почтовых доменов и аккаунтов

На этом этапе нужно иметь настроенные записи DNS для почтовых доменов. Для этого следует создать необходимую запись MX, если её ещё нет, в списках DNS, которая будет указывать на полный домен.

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

mysql -u root -p

Добавим в список доменов наш основной домен и создадим первый почтовый аккаунт, «example.com», «[email protected]» и «password» следует заменить корректными значениями:

USE mail;
INSERT INTO domains (domain) VALUES ('example.com');
INSERT INTO users (email, password) VALUES ('[email protected]', ENCRYPT('password'));
quit

Обратите внимание на команду шифрования пароля, добавлять или менять пароль нужно именно так.

Теперь попробуем отправить почту вновь созданному аккаунту. Это необходимо для создания структуры директорий на диске, которые появяться после получения первого письма. Для отправки почты непосредственно из консоли мы будем использовать mailx или bsd-mailx, в зависимости от того, что установилось выше:

mailx [email protected]

После ввода команды будет предложено ввести тему сообщения. Вводим, нажимаем Enter, после чего нажимаем Ctrl + D. Поле «CC» можно оставить пустым.

Так как почтовых доменов может быть несколько, следует указывать полный почтовый адрес «[email protected]» для сборщика почты, иначе по имени пользователя «info» нельзя будет определить, к какому домену он принадлежит и почта не будет отправлена или получена.

На этом перейдём к следующему шагу — проверке лог файлов.

Проверка логов

После отправки тестового сообщения нам следует проверить логи на остутствие ошибок. Проверим содержимое файла /var/log/mail.log в последних 50 строках:

tail -50 /var/log/mail.log

Мы должны увидеть нечто подобное:

Feb 13 15:07:49 somevar postfix/cleanup[5877]: E1D145803: message-id=
Feb 13 15:07:49 somevar postfix/qmgr[5867]: E1D145803: from=, size=377, nrcpt=1 (queue active)
Feb 13 15:07:49 somevar postfix/pipe[5883]: E1D145803: to=, relay=dovecot, delay=0.05, delays=0.04/0.01/0/0.01, dsn=2.0.0, status=sent (delivered via dovecot service)
Feb 13 15:07:49 somevar postfix/qmgr[5867]: E1D145803: removed

Далее мы проверим лог доставки Dovecot, котрый находится в файле /home/vmail/dovecot-deliver.log и должны увидеть нечто похожее на:

deliver([email protected]): 2011-02-13 17:05:19 Info: msgid=: saved mail to INBOX

Если в логе есть ошибки в работе сервиса cmusieve, не обращайте на них внимания, в конце статьи я расскажу как от них избавиться.

Теперь можно проверить структуру почтового хранилища и директорий на диске.

Проверка структуры директорий на диске

Перейдём в директорию /home/vmail/example.com/sales/Maildir, где «example.com» адрес нашего почтового домена:

cd /home/vmail/example.com/sales/Maildir

Выполним команду поиска:

find

Внутри директории должно содержаться примерно следующее:

./dovecot-uidlist
./cur
./new
./new/1285673545.P4152W0M168494.somevar
./dovecot.index
./dovecot.index.log
./tmp

Просмотреть почту можно прямо из консоли при помощи утилиты mutt:

cd /home/vmail/example.com/sales/Maildir
mutt -f .

Если она не установлена, выполним:

aptitude install mutt

Настройка почтовых программ

Пользователь может забрать почту любой доступной почтовой программой. В качестве IMAP/POP3 и SMTP сервера следует указать домен, записанный в MX записи интерфейса DNS, например «mail.example.com». Логин — это почтовый адрес пользователя, как уже говорилось это необходимо при мультидоменной конфигурации, которую мы и реализовали. Шифрование входящей почты — SSL, исходящей — TLS.

Чтобы забирать почту пользователя root, в нашем примере его почтовый ящик «[email protected]», следует настроить переадресацию в таблице forwardings:

mysql -u root -p

USE mail;
INSERT INTO forwardings (source, destination) VALUES ('[email protected]', '[email protected]');
quit

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

Возможные проблемы

Единственная проблема, замеченная в логах, это несоответствие пакета cmusieve в Debian 6 Squeeze. В файле /home/vmail/ наблюдалось примерно следующее:

2011-02-13 20:23:31 deliver([email protected]): Fatal: Plugin cmusieve not found from directory /usr/lib/dovecot/modules/lda

Дабы исправить положение установим нужный пакет, который теперь называется sieve, в этом собственно и проблема:

aptitude install libsieve2-1

Потом, нужно открыть файл /etc/dovecot/dovecot.conf на редактирование и заменить строку:

mail_plugins = cmusieve

На нижеуказанную:

mail_plugins = sieve

Перезагружаем Dovecot:

/etc/init.d/dovecot restart

После этих несложных действий логи стали чисты.

Список базовых почтовых портов
  • POP3 — port 110
  • IMAP — port 143
  • SMTP — port 25
  • HTTP — port 80
  • Secure SMTP (SSMTP) — port 465
  • Secure IMAP (IMAP4-SSL) — port 585
  • IMAP4 over SSL (IMAPS) — port 993
  • Secure POP3 (SSL-POP) — port 995

Комментарии
]]> ipv6 ready Kiev LUGLinux4MeНостальгияЛичный сайт skeletora ]]>