Установка и настройка почтового сервера postfix с хранением почтовых паролей в БД

Установка веб-сервера и сервера БД
Устанавливаем и настраиваем postfixadmin
Устанавливаем и настраиваем postfix
Устанавливаем и настраиваем dovecot

 

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

Установка веб-сервера и сервера БД

Если на сервере уже установлен веб-сервер и БД mysql/mariadb, то установку пакетов нужно пропустить и перейти к пункту «Устанавливаем и настраиваем postfixadmin».

 

Для Centos:

yum install epel-release -y
yum install mariadb mariadb-server php php-imap php-mysqli php-mbstring httpd -y

Устанавливаем пароль root, на все вопросы жмём enter, при запросе нового пароля (шаг 2) придумываем и вводим новый пароль для пользователя root:

/usr/bin/mysql_secure_installation

Запускаем веб-сервер и включаем автозагрузку:

systemctl start httpd
systemctl enable httpd

Запускаем сервер БД и включаем автозагрузку:

systemctl start mariadb
systemctl enable mariadb

 

Для Debian/Ubuntu:

apt install mysql-server mysql-client apache2 libapache2-mod-php php php-imap php-mysqli php-mbstring

 

Для Debian 8:

apt install mysql-server mysql-client apache2 libapache2-mod-php5 php5 php5-imap php5-mysql -y

При установке в Debian 8 и Ubuntu 16.04 нужно будет также придумать и указать, какой пароль root будет у БД:

В Ubuntu 18.04 и Debian 9 пароль пользователя root указывается пустой при установке.

Запускаем веб-сервер и включаем автозагрузку:

systemctl start apache2
systemctl enable apache2

Запускаем сервер БД и включаем автозагрузку:

systemctl start mysql
systemctl enable mysql

Устанавливаем и настраиваем postfixadmin

Postfixadmin — это веб-интерфейс управления почтовым сервером. В нём можно создать почтовые домены и почтовые ящики.

 

Создаём БД:

Подключаемся к консоли mysql, используя пароль пользователя root в mysql:

mysql -uroot -p

В консоли mysql вводим следующие команды:

create database postfix;
create user postfix@localhost identified by 'ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ';
grant all privileges on *.* to postfix@localhost;
flush privileges;
exit;

Устанавливаем postfixadmin:

wget https://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz
tar -zxf postfixadmin.tar.gz
mv postfixadmin-* /usr/share/postfixadmin
mkdir /usr/share/postfixadmin/templates_c

Centos:

chown -R apache:apache /usr/share/postfixadmin/

Debian/Ubuntu:

chown -R www-data:www-data /usr/share/postfixadmin/

 

Символическая ссылка должна вести в директорию сайта (укажите путь до своего сайта), если на сервере нет сайтов, то нужно оставить текущую команду:

ln -s /usr/share/postfixadmin/public/ /var/www/html/postfixadmin

Создаем локальный файл конфигурации:

touch /usr/share/postfixadmin/config.local.php

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

<?php
$CONF['configured'] = true;
$CONF['setup_password'] = 'changeme';
$CONF['default_language'] = 'ru';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_БД';
$CONF['database_name'] = 'postfix';
$CONF['admin_email'] = 'root@ВАШ_ПОЧТОВЫЙ_ДОМЕН';
$CONF['encrypt'] = 'md5crypt';
$CONF['default_aliases'] = array (
 'abuse' => 'root',
 'hostmaster' => 'root',
 'postmaster' => 'root',
 'webmaster' => 'root'
);
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'YES';
?>

 

Далее переходим по адресу: http://ВАШ_ПОЧТОВЫЙ_ДОМЕН/postfixadmin/setup.php

После чего откроется страница с проверкой настроек — все параметры должны быть OK.

Если по итогам проверки есть замечания, их нужно устранить. Если замечаний нет, придумайте и введите пароль установки в форме внизу страницы (пароль должен содержать обязательно 2 цифры и быть длиннее 5 символов), нажмите кнопку — «Generate password hash». Страница обновится и появится хеш, который выделен красным:

Полученный хеш указываем в локальном файле настроек — /usr/share/postfixadmin/config.local.php. Нужно заменить значение строки (3 строка):

$CONF['setup_password'] = 'changeme'

на

$CONF['setup_password'] = 'ВАШ_ХЕШ'

 

Перезагружаем страницу и теперь можем создать учётную запись администратора:

Пишем в первой строке пароль от установки, который вводили ранее, и указываем почтовый ящик root@ВАШ_ПОЧТОВЫЙ_ДОМЕН и пароль к нему, если все сделано правильно, то пользователь будет добавлен:

Создаём почтовый домен, в интерфейсе postfixadminhttp://ВАШ_ПОЧТОВЫЙ_ДОМЕН/postfixadmin/login.php. Переходим в меню: Список доменовНовый домен и создаём почтовый домен.

Создаём почтовый ящик: ОбзорСоздать ящик:

Устанавливаем и настраиваем postfix

Устанавливаем postfix на сервер:

Для Centos (обычно в Centos 7 он уже установлен):

yum install postfix -y

Для Debian/Ubuntu:

apt install postfix postfix-mysql -y

Далее отобразится окно, где нужно выбрать Internet Site:

И в следующем окне указать ваш домен, с которого будет отправляться почта:

Запускаем и добавляем в автозагрузку службу postfix:

systemctl start postfix
systemctl enable postfix

Вносим изменения в настройку postfix, в консоли вводим следующие команды:

postconf -e 'inet_interfaces=all'
postconf -e 'mydestination='
postconf -e 'myhostname=mailtest.fvds.ru'
postconf -e 'virtual_transport=lmtp:unix:private/dovecot-lmtp'
postconf -e 'relay_domains = mysql:/etc/postfix/mysql/relay_domains.cf'
postconf -e 'virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf,mysql:/etc/postfix/mysql/virtual_alias_domain_maps.cf'
postconf -e 'virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_mailbox_domains.cf'
postconf -e 'virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf'
postconf -e 'virtual_mailbox_base=/var/mail/vmail/'
postconf -e 'local_recipient_maps=$virtual_mailbox_maps'

postconf -e 'smtpd_sasl_auth_enable=yes'
postconf -e 'smtpd_sasl_type=dovecot'
postconf -e 'smtpd_sasl_path=private/auth'
postconf -e 'broken_sasl_auth_clients=yes'
postconf -e 'smtpd_sasl_security_options=noanonymous'

postconf -e 'smtpd_use_tls=yes'
postconf -e 'smtpd_tls_cert_file=/etc/postfix/certs/cert.pem'
postconf -e 'smtpd_tls_key_file=/etc/postfix/certs/key.pem'
postconf -e 'smtpd_sasl_tls_security_options=noanonymous'
postconf -e 'smtpd_tls_auth_only=yes'

postconf -e 'smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination'

postconf -e 'smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_non_fqdn_helo_hostname,reject_non_fqdn_sender,reject_unknown_sender_domain,reject_non_fqdn_recipient,reject_unknown_recipient_domain'

postconf -e 'smtpd_banner=$myhostname ESMTP'
postconf -e 'biff=no'
postconf -e 'strict_rfc821_envelopes=yes'
postconf -e 'disable_vrfy_command=yes'
postconf -e 'smtpd_helo_required=yes'

Конфигурация будет добавлена в файл /etc/postfix/main.cf.

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

submission inet n - n - - smtpd
 -o smtpd_tls_security_level=encrypt
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_sasl_type=dovecot
 -o smtpd_sasl_path=private/auth
 -o syslog_name=postfix/submission
 -o smtpd_tls_wrappermode=no
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
 -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
 -o milter_macro_daemon_name=ORIGINATING

smtps inet n - n - - smtpd
 -o smtpd_sasl_auth_enable=yes
 -o smtpd_sasl_type=dovecot
 -o smtpd_sasl_path=private/auth
 -o syslog_name=postfix/smtps
 -o smtpd_tls_wrappermode=yes
 -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
 -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,defer_unauth_destination
 -o milter_macro_daemon_name=ORIGINATING

Для Centos в конец этого же файла нужно добавить:

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

Для Debian/Ubuntu в конец этого же файла нужно добавить:

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

Создадим директорию для хранения файлов подключения к mysql:

mkdir /etc/postfix/mysql

 

Создадим файлы конфигурации mysql:

Создаём файл:

touch /etc/postfix/mysql/relay_domains.cf

В созданный файл добавляем:

hosts = 127.0.0.1
user = postfix
password = ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_БД
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'

Создаём файл:

touch /etc/postfix/mysql/virtual_alias_domain_maps.cf

В созданный файл добавляем:

hosts = 127.0.0.1
user = postfix
password = ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_БД
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1

Создаём файл:

touch /etc/postfix/mysql/virtual_alias_maps.cf

В созданный файл добавляем:

hosts = 127.0.0.1
user = postfix
password = ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_БД
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

Создаём файл:

touch /etc/postfix/mysql/virtual_mailbox_domains.cf

В созданный файл добавляем:

hosts = 127.0.0.1
user = postfix
password = ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_БД
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'

Создаём файл:

touch /etc/postfix/mysql/virtual_mailbox_maps.cf

В созданный файл добавляем:

hosts = 127.0.0.1
user = postfix
password = ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_БД
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = '1'

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

mkdir /etc/postfix/certs
openssl req -new -x509 -days 3650 -nodes -out /etc/postfix/certs/cert.pem -keyout /etc/postfix/certs/key.pem

Вот пример выполнения команды:

Если у вас есть платный сертификат на домен с не истекшим сроком действия, используйте его. Файлы сертификата нужно разместить в директории /etc/postfix/certs/ и заменить имена файлов на свои в конфигурационном файле postfix /etc/postfix/main.cf в следующих строках: 

smtpd_tls_cert_file
smtpd_tls_key_file

 

Проверить корректность настроек postfix можно через команду:

postfix check

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

systemctl restart postfix

Устанавливаем и настраиваем dovecot

Centos:

yum install dovecot dovecot-mysql -y

Debian/Ubuntu:

apt install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql -y

Активируем службу и добавляем в автозапуск:

systemctl start dovecot
systemctl enable dovecot

Создаём локальный файл настроек:

touch /etc/dovecot/local.conf

Открываем файл текстовым редактором и указываем в нём следующие настройки:

protocols = pop3 imap lmtp
auth_mechanisms = plain login
mail_gid = vmail
mail_uid = vmail
first_valid_uid = 5000
last_valid_uid = 5000

mail_location = maildir:/var/mail/vmail/%d/%n/

mbox_write_locks = fcntl
disable_plaintext_auth = yes

passdb {
  args = scheme=ssha512 username_format=%u /etc/dovecot/users
  driver = passwd-file
}

userdb {
  args = username_format=%u /etc/dovecot/users
  driver = passwd-file
}

service auth {
  unix_listener /var/spool/postfix/private/auth {
    group = postfix
    mode = 0660
    user = postfix
  }
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0600
    user = postfix
  }
  user = vmail
}
protocol lmtp {
  postmaster_address = postmaster@mailtest.fvds.ru
}

ssl = required
ssl_cert = </etc/postfix/certs/cert.pem
ssl_key = </etc/postfix/certs/key.pem
ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
ssl_dh_parameters_length = 2048
ssl_prefer_server_ciphers = yes

 

Создадим файл:

touch /etc/dovecot/dovecot-mysql.conf

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

driver = mysql
default_pass_scheme = CRYPT
connect = host=127.0.0.1 dbname=postfix user=postfix password=ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_БД
user_query = SELECT '/var/mail/vmail/%d/%u' as home, 'maildir:/var/mail/vmail/%d/%u' as mail, 5000 AS uid, 5000 AS gid, concat('*:bytes=', quota) AS quota_rule FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password, '/var/mail/vmail/%d/%u' as userdb_home, 'maildir:/var/mail/vmail/%d/%u' as userdb_mail, 5000 as userdb_uid, 5000 as userdb_gid, concat('*:bytes=', quota) AS userdb_quota_rule FROM mailbox WHERE username = '%u' AND active = '1'

 

Сертификат используется тот, что генерировали при настройке postfix, если используете свой сертификат, то нужно указать путь до него в следующих строках конфигурационного файла dovecot /etc/dovecot/local.conf:

ssl_cert
ssl_key

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

systemctl restart dovecot

 

На этом настройку почтового сервера можно было бы и завершить — получение и отправка писем работают, можно пользоваться. Если бы не одно «но». Почтовые сервисы, вроде gmail.com или yandex.ru, будут отправлять не прошедшие проверку письма в спам, если не выполнить ещё пару настроек, о которых мы расскажем в следующей статье.