Почтовый сервер Postfix. Часть 1 (Postfix + dovecot + SSL + Vimbadmin + Roundcube)

Сегодня будем заниматься настройкой сервера Postfix и Dovecot под высокую нагрузку с подписями DKIM, SPF, управлением и доступом через web-интерфейс и SSL-шифрованием. Подписи нам нужны, чтобы письма с нашего сервера не попадали в спам и набирали максимальное количество баллов лояльности других почтовых серверов.

Генерация SSL-сертификатов

cd /etc/ssl

Для начала, сгенерируем SSL-сертификаты для нашего будущего почтового сервера.

openssl genrsa -out mmail.lanlinux.ru.key 2048
openssl req -new -key mail.lanlinux.ru.key -out mail.lanlinux.ru.csr
openssl x509 -req -days 365 -in mail.lanlinux.ru.csr -signkey mail.lanlinux.ru.key -out mail.lanlinux.ru.crt

Настройка Postfix

Теперь приступим к первичной настройке самого Postfix-сервера. Для начала, установим все необходимые пакеты.
apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql mysql-server dovecot-sieve dovecot-managesieved mc
Правим конфиг мастера
mcedit /etc/postfix/master.cf
submission inet n - - - - smtpd
smtps inet n - - - - smtpd

Затираем main.conf и вносим туда свою конфигурацию.
>/etc/postfix/main.cf
mcedit /etc/postfix/main.cf


myhostname = mail.lanlinux.ru
myorigin = /etc/mailname
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/ssl-bundle.crt
smtpd_tls_key_file=/etc/ssl/mail.lanlinux.ru.key
smtpd_use_tls=yes
#Handle SMTP authentication using Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
mydestination = localhost
# using Dovecot's LMTP for mail delivery and giving it path to store mail
virtual_transport = lmtp:unix:private/dovecot-lmtp
# virtual mailbox setups
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = mysql:/etc/postfix/mysql/virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/virtual_mailbox_maps.cf

Создадим дирректорию, где будут лежать наши запросы к mariadb (mysql)
mkdir /etc/postfix/mysql
mcedit /etc/postfix/mysql/virtual_alias_maps.cf

и добавляем наши основные запросы.
user = vimbadmin
password = password
hosts = 127.0.0.1
dbname = vimbadmin
query = SELECT goto FROM alias WHERE address = '%s' AND active = '1'

mcedit /etc/postfix/mysql/virtual_domains_maps.cf

user = vimbadmin
password = password
hosts = 127.0.0.1
dbname = vimbadmin
query = SELECT domain FROM domain WHERE domain = '%s' AND backupmx = '0' AND active = '1'

mcedit /etc/postfix/mysql/virtual_mailbox_maps.cf

user = vimbadmin
password = password
hosts = 127.0.0.1
dbname = vimbadmin
query = SELECT maildir FROM mailbox WHERE username = '%s' AND active = '1'

Настройка Dovecot

Теперь приступим к первичной настройке Dovecot. Для начала, создадим группу и пользователя для dovecot, где он будет хранить письма.

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

Выбираем, какие протоколы будем использовать. Сразу добавим sieve, так как в дальнейшем он нам все-равно понадобится.
mcedit /etc/dovecot/dovecot.conf

!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp sieve

> /etc/dovecot/conf.d/10-mail.conf

Письма будем хранить в специальном формате dovecot_а — mdbox. Планируется, что в почтовых ящиках будет хранить по несколько тысяч писем. С таким форматом будет удобнее =)

mcedit /etc/dovecot/conf.d/10-mail.conf
mail_location = mdbox:/var/vmail/%d/%n

namespace inbox {
inbox = yes
}

Правим настройки аутентификации
mcedit /etc/dovecot/conf.d/10-auth.conf

disable_plaintext_auth = no
auth_mechanisms = plain login

Комментируем #!include auth-system.conf.ext чтобы выключить стандартную аутентификацию. У нас все будет через mysql

passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=5000 gid=5000 home=/var/vmail/%d/%n allow_all_users=yes
}

mcedit /etc/dovecot/dovecot-sql.conf.ext

Добавим запрос к SQL-серверу на получение данных о наших пользователях.

driver = mysql
connect = host=127.0.0.1 dbname=vimbadmin user=vimbadmin password=password
password_query = \
SELECT username AS user, password, \
homedir AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \
FROM mailbox WHERE username = '%u'
iterate_query = SELECT username AS user FROM mailbox

И, наконец, праивм master.conf
>/etc/dovecot/conf.d/10-master.conf
mcedit /etc/dovecot/conf.d/10-master.conf

service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
}
user = dovecot
}
service auth-worker {
user = vmail
}

Перезагружаем наши демоны, чтобы изменения вступили в силу.
service dovecot restart
service postfix restart

Настройка ViMbAdmin

Переходим к настройке Vimbadmin. Он нам нужен, чтобы администрировать наш сервер через web-интерфейс без доступа к консоли. Права на создание учеток можно выдать HR-отделу, чтобы снять с админов обязанности по работе с новыми сотрудниками.

Для начала, склонируем себе git-репозиторий vimbadmin_а.
cd /usr/local
apt-get install subversion git-core
git clone git://github.com/opensolutions/ViMbAdmin.git vimbadmin
cd /usr/local/vimbadmin

Затем, установим все необходимые пакеты.
apt-get install nginx php7.0-fpm php7.0-mysql php7.0-pspell php7.0-curl php7.0-xml php7.0-xmlrpc

Разработчики данного софта рекомендую ставить его через php-композер. Так с сделаем.
curl -sS https://getcomposer.org/installer | php
php composer.phar install
chown -R www-data: /usr/local/vimbadmin

Создадим базу данных и пользователя vimbadmin

CREATE DATABASE `vimbadmin`;
GRANT ALL ON `vimbadmin`.* TO `vimbadmin`@`localhost` IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
quit

Приступаем к правке конфигурационных файлов.
cp application/configs/application.ini.dist application/configs/application.ini
mcedit application/configs/application.ini

defaults.mailbox.uid = 5000
defaults.mailbox.gid = 5000
defaults.mailbox.homedir = "/var/vmail/"
resources.doctrine2.connection.options.driver = 'pdo_mysql'
resources.doctrine2.connection.options.dbname = 'vimbadmin'
resources.doctrine2.connection.options.user = 'vimbadmin'
resources.doctrine2.connection.options.password = 'password'
resources.doctrine2.connection.options.host = 'localhost'

mv public/.htaccess.dist public/.htaccess
./bin/doctrine2-cli.php orm:schema-tool:create
chown -R www-data:www-data /usr/local/vimbadmin

Выставим часовой пояс в настройках PHP. У меня MSK.
mcedit /etc/php/7.0/fpm/php.ini
date.timezone = "Europe/Moscow"

создадим симлинки, чтобы потом не искать, что где находится
ln -s /usr/local/vimbadmin/ /var/www/
и рестартуем php-fpm.
service php7.0-fpm restart

Далее создаем vhost nginx_а.
mcedit /etc/nginx/sites-available/vimbadmin

server {
server_name mail.lanlinux.ru;
access_log /var/log/nginx/vimbadmin.log;
error_log /var/log/nginx/vimbadmin.error.log;
root /usr/local/vimbadmin/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

Создаем симлинк и рестартуем nginx.
ln -s /etc/nginx/sites-available/vimbadmin /etc/nginx/sites-enabled/
service nginx restart

Вносим последние правки в конфиг vimbadmin. Данные получаем из web-инсталлера. Заодно, сразу выберем тип шифрования паролей. Этого просит наш dovecot.
mcedit application/configs/application.ini

securitysalt = ""
resources.auth.oss.rememberme.salt = ""
defaults.mailbox.password_salt = ""
defaults.mailbox.password_scheme = "dovecot:MD5-CRYPT"

Настройка Web-интерфейса Roundcube для доступа пользователей к почтовым ящикам

И, наконец, приступим к настройке web-интерфейса для наших пользователей, чтобы не ставить всем подряд почтовые клиенты. Я предпочитаю Roundcube; скачаем его.

cd /tmp
wget https://github.com/roundcube/roundcubemail/releases/download/1.2.1/roundcubemail-1.2.1-complete.tar.gz
tar xvzf roundcubemail-1.2.1-complete.tar.gz
mv roundcubemail-1.2.1 /var/www/roundcube
chown -R www-data.root /var/www/roundcube/

Создадим vhost для roundcube

mcedit /etc/nginx/sites-available/roundcube

server {
server_name mail.lanlinux.ru;
access_log /var/log/nginx/roundcube.log;
error_log /var/log/nginx/roundcube.error.log;
root /var/www/roundcube;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

Создаем симлинк и перезагружаем сервис. Так и не привыкну никак к systemctl =)
ln -s /etc/nginx/sites-available/roundcube /etc/nginx/sites-enabled/
service nginx restart

Добавим необходимые для roundcube модули PHP.
apt install php7.0-mbstring php7.0-intl

Открываем в браузере http://mail.lanlinux.ru/installer/ и продолжаем инсталляцию.

Да, и не забываем создать базу для roundcube =)
CREATE DATABASE `roundcube`;
GRANT ALL ON `roundcube`.* TO `roundcube`@`localhost` IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
quit

Продолжение следует =)