Установка Postfix+Dovecot+Posfixadmin на Ubuntu 20.04

Просмотры: 4060
Категория: Администрирование
Создано: 30 ноября 2020
Тэги: PostgreSQL Linux Ubuntu

Настройка почтовой системы в Linux считается одной из самых сложных. Такое мнение сложилось ещё со времён, когда единственным MTA был Sendmail. Его конфигурирование действительно сложно. Сегодня у владельцев Linux-серверов есть замечательные альтернативы: Postfix и Exim. Они гораздо проще в настраивании, хотя и требует определённой квалификации со стороны системного администратора. В этой замете я опишу процесс установки и настройки сервера Postfix, который будет работать в связке с Dovecot - IMAP и POP3 сервером. Также мы установим и настроим Postfixadmin - удобный и простой веб-интерфейс к нашей почтовой системе, позволяющий довольно просто создавать почтовые домены и почтовые ящики. В качестве СУБД мы будем использовать PostgreSQL.

Первые шаги

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

sudo nano /etc/hostname

и прописываем имя нашего сервера (например, mail_server). Не забываем, что в системах Ubuntu в именах можно указывать буквы, цифры и знак подчёркивания. Далее, обновляем имя системы:

sudo hostname mail_server

Задаём нужно временную зону. В нашем примере - московскую

sudo cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

Открываем необходимые порты:

sudo ufw allow 25,110,143,465,587,993,995/tcp

Будем считать, что nginx и php-fpm уже установлены в системе. Если нет, то смотрите статью по этому поводу. Переходим в серверный каталог, скачиваем последнюю версию Postfixadmin и распаковываем его.

cd /srv/http

sudo wget https://downloads.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-3.2/postfixadmin-3.2.tar.gz

sudo tar xzvf postfixadmin-3.2.tar.gz

sudo mv postfixadmin-3.2 pfa

Создаём временный каталог templates_c (он необходим для установки Postfixadmin):

mkdir /srv/http/pfa/templates_c

Теперь необходимо создать базу данных postfix и пользователя postfix. Перелогиниваемся в postgres и выполняем необходимые действия:

sudo su - postgres

psql

postgres=# CREATE DATABASE postfix ENCODING 'UTF-8';

postgres=# CREATE USER postfix WITH PASSWORD 'secret_passwd_for_postfix';

postgres=# GRANT ALL PRIVILEGES ON DATABASE postfix TO postfix;

Выходим из интерактивной оболочки PostgreSQL и правим pg_hba.conf:

nano /etc/postgresql/13/main/pg_hba.conf

Дописываем следующую строчку

local   postfix         postfix       md5

Теперь надо перезапустить PostgreSQL. Можно также перечитать этот файл. Один из способов - зайти в интерактивную оболочку:

psql

и выполнить команду

postgres=# SELECT pg_reload_conf();

Выходим из интерактивной оболочки и из аккаунта postgres. Создаём в директории pfa файл config.local.php. В нём переопределяются переменные файла config.inc.php, который по новым указаниям разработчиков трогать не рекомендуется:

sudo nano /srv/http/pfa/config.local.php

И дописываем сюда следующие строки:

<?php

$CONF['configured'] = true;
$CONF['database_type'] = 'pgsql';
$CONF['database_password'] = 'secret_passwd_for_postfix';
$CONF['emailcheck_resolve_domain'] = 'NO';
$CONF['footer_text'] = 'Return to your-site.ru';
$CONF['footer_link'] = 'https://your-site.ru';

Параметр configure говорит о том, администратор закончил конфигурировать PFA; database_type - тип СУБД, в нашем случае PostgreSQL; database_password - пароль пользователя postfix для входа в базу; emailcheck_resolve_domain - задает необходимость проверки домена при создании ящиков и псевдонимов.

Конфигурируем наш сайт так, чтобы его корень указывал на подкаталог public каталога postfixadmin и запускаем установку через браузер по адресу http://postfixadmin.your-site.ru. Происходит проверка подключения к БД, других конфигураций сайта, устанавливаются необходимые таблицы и если всё пройдет успешно, появится форма, где нас попросят дважды ввести пароль установки. Вводим его и копируем хэш, который выглядит где-то так:

$CONF['setup_password'] = '8fd021f0582bbdcc525f627643ngfcae7:47d61745f922a68411dief039b354babehv79d';

Добавляем эту строку (ту, что сгенерировал скрипт) в файл конфигурации config.local.php. На той же странице, где сгенерировался хэш, добавляем суперпользователя для Posfixadmin. Здесь Setup password - тот пароль установки, который мы ввели раньше. Указываем также почтовый адрес администратора, а также дважды его пароль. Нажимаем кнопку "Добавить администратора".

Установка и настройка Postfix

Устанавливаем необходимые сервера (Postfix и Dovecot) с поддержкой PostgreSQL:

sudo apt install postfix postfix-pgsql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-pgsql

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

sudo groupadd -g 1024 vmail

sudo useradd -d /home/mail -g 1024 -u 1024 vmail -m

Здесь пользователь создается с uid 1024 и guid 1024. Если эти идентификаторы уже заняты, меняем на доступные. Открываем на редактирование главный файл конфигурации Postfix:

sudo nano /etc/postfix/main.cf

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

myhostname = mail.your-site.ru
mydomain = your-site.ru
myorigin = $mydomain

Здесь мы указываем, какое доменное имя будет указываться отправителю, если он не указан в поле FROM.

mydestination = $myhostname, localhost.$mydomain, localhost

Указываем для каких доменов принимаем почту.

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
local_recipient_maps = unix:passwd.byname $alias_maps

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

mynetworks = 127.0.0.0/8

Разрешаем отправлять письма локальному пользователю.

inet_interfaces = all
inet_protocols = all

Слушаем все сетевые интерфейсы и работаем по 4-му и 6-му протоколу IP. Можно добавить такие строки

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
unknown_local_recipient_reject_code = 550

Настройки для работы с виртуальными почтовыми ящиками:

virtual_mailbox_base = /home/mail
virtual_alias_maps = proxy:pgsql:/etc/postfix/pgsql_virtual_alias_maps.cf
virtual_mailbox_domains = proxy:pgsql:/etc/postfix/pgsql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:pgsql:/etc/postfix/pgsql_virtual_mailbox_maps.cf
virtual_minimum_uid = 1024
virtual_uid_maps = static:1024
virtual_gid_maps = static:1024
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

Настройки безопасного соединения:

smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

smtpd_tls_cert_file = /etc/postfix/pubkey.pem
smtpd_tls_key_file = /etc/postfix/privkey.pem
smtpd_use_tls = yes

smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3

tls_preempt_cipherlist = yes
smtpd_tls_mandatory_ciphers = high
tls_high_cipherlist = ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:ADH-AES256-GCM-SHA384:ADH-AES256-SHA256:ECDH-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-SHA384:ECDH-ECDSA-AES256-SHA384:AES256-GCM-SHA384:AES256-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:ADH-AES128-GCM-SHA256:ADH-AES128-SHA256:ECDH-RSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-SHA256:AES128-GCM-SHA256:AES128-SHA256:NULL-SHA256

smtpd_tls_auth_only = yes
smtpd_helo_required = yes
smtp_tls_security_level = may
smtp_tls_ciphers = export
smtp_tls_loglevel = 1
smtp_tls_CApath = /etc/ssl/certs
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

Тут в принципе всё ясно, а если какая-то опция непонятна - читаем документацию. Сохраняем файл конфигурации.

Теперь надо создать несколько файлов для работы с базой данных. Файл для обращения к базе с алиасами:

sudo nano /etc/postfix/pgsql_virtual_alias_maps.cf

Вставляем следующие строки, меняя некоторые по свои параметры (пользователь, пароль, база и т.д.):

user = postfix
password = super_secret_password
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active = '1'

Файл для получения информации по виртуальным доменам:

sudo nano /etc/postfix/pgsql_virtual_domains_maps.cf

Он должен быть приблизительно такого содержания:

user = postfix
password = super_secret_password
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain='%u'

Файл для получения информации о почтовых ящиках:

sudo nano /etc/postfix/pgsql_virtual_mailbox_maps.cf

У него такое содержание:

user = postfix
password = super_secret_password
hosts = localhost
dbname = postfix
query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'

Теперь редактируем файл конфигурации master-процесса Postfix'а.

sudo nano /etc/postfix/master.cf

Снимаем комментарии со следующих строк, или дописываем их при необходимости:

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=may
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=/var/spool/postfix/private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_sasl_local_domain=$myhostname
  -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 syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_mynetworks,permit_sasl_authenticated,reject

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

Проверяем Postfix на наличие ошибок:

sudo postfix check

Если ошибок нет, или они все устранены, перезапускаем postfix:

sudo systemctl restart postfix

Настройка Dovecot

Настраиваем способ хранения сообщений:

sudo nano /etc/dovecot/conf.d/10-mail.cf

Меняем следующую строку:

mail_location = maildir:/home/mail/%d/%u/

Остальные не трогаем. Настраиваем слушателя аутентификации:

sudo nano /etc/dovecot/conf.d/10-master.conf

Здесь соответствующие строки приводим к виду:

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

Настраиваем аутентификацию в Dovecot:

sudo nano /etc/dovecot/conf.d/10-auth.conf

Комментируем одну строку, снимаем комментарий с другой.

#!include auth-system.conf.ext
!include auth-sql.conf.ext

Настраиваем шифрование Dovecot

sudo nano /etc/dovecot/conf.d/10-ssl.conf

Здесь указываем путь к сертификатам такой же, как и в файле конфигурации Postfix:

ssl = required
ssl_cert = </etc/postfix/public.pem
ssl_key = </etc/postfix/private.pem

Указываем Dovecot автоматически создавать каталоги при первом подключении клиента:

sudo nano /etc/dovecot/conf.d/15-lda.conf

и пишем следующее

lda_mailbox_autocreate = yes

Теперь настройка подключения к базе данных. Открываем файл

sudo nano /etc/dovecot/conf.d/auth-sql.conf.ext

и записываем

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

Создаём файл с настройками для работы с PostgreSQL:

sudo nano /etc/dovecot/dovecot-sql.conf.ext

Здесь указываем следующее:

driver = pgsql
connect = host=localhost dbname=postfix user=postfix password=super_secret_password
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'
user_query = SELECT CONCAT('/home/mail/',LOWER(domain),'/',LOWER(maildir)),\
                1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'

Наконец, указываем интерфейсы, на которых будет слушать наш Dovecot:

sudo nano vi /etc/dovecot/dovecot.conf

и пишем:

listen = *

Настройка Dovecot завершена. Осталось сгенерировать сертификаты или получить их с помощью Let's Encrypt. Для тестовых целей сгенерируем самоподписанные сертификаты. Мы их положим в /etc/postfix:

openssl req -new -x509 -days 730 -nodes -out /etc/postfix/public.pem -keyout /etc/posfix/private.pem -subj "/C=RU/ST=Msk/L=Msk/O=Local/OU=Mail/CN=mail_server.your-site.ru"

Запускаем Dovecot:

sudo systemctl enable dovecot

sudo systemctl start dovecot

Теперь осталось пойти на Postfixadmin, завести сначала почтовый домен, потом ящик и протестировать нашу почтовую систему, например, с помощью Thunderbird. Отправляем письма себе, другому пользователю в нашей системе. Потом пробуем послать себе письма с Gmail, Yandex, Mail.ru и наблюдаем за поведением системы, изучая логи. Основная настройка почты завершена. Теперь необходимо настроить DKIM, SPF, чтобы другие почтовые системы воспринимали нас как доверенных отправителей. Но об этом я расскажу в другом посте.