Установка Postfix+Dovecot+Posfixadmin на Ubuntu 20.04
- Просмотры: 4060
- Категория: Администрирование
- Создано: 30 ноября 2020
- Тэги:
Настройка почтовой системы в 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, чтобы другие почтовые системы воспринимали нас как доверенных отправителей. Но об этом я расскажу в другом посте.