Почтовый сервер на AlmaLinux 8

В данной инструкции будет рассмотрена настройка почтового сервера состоящего из: postfix, dovecot, mysql, postfixadmin, roundcube, opendkim. Почтовому серверу будет присвоено имя mta.mailns.ru, установка будет производиться на облачный сервер с операционной системой AlmaLinux 8.

Подготовка системы

Общие настройки

Задаем правильное имя серверу — это важный шаг, так как большинство антиспам систем выполняют проверки, обращаясь к серверу по имени в ожидании ответа, необходимо указать FQDN-имя, которое будет доступно из глобальной сети. В данном примере указано mta.mailns.ru.

hostnamectl set-hostname mta.mailns.ru

Обновление системы

dnf update -y

Удаление SELinux

dnf remove -y selinux*

Локализация

Выводим список доступных локализаций в системе:

localectl list-locales

Проверяем активную локализацию:

localectl

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

dnf install -y glibc-langpack-ru

Устанавливаем русский язык по умолчанию в системе:

localectl set-locale LANG=ru_RU.utf8

Проверяем активную локализацию:

localectl

Изменим раскладку клавиатуру на русскую:

localectl set-x11-keymap ru

Проверим локализацию системы:

locale

Если локализация системы осталась en_US.UTF-8, откроем файл .bashrc (представляет собой файл сценария оболочки, обычно используемый в качестве файла конфигурации для конкретного пользователя).

vi ~/.bashrc

добавим в файл:

export LANG="ru_RU.utf8"
export LC_CTYPE="ru_RU.utf8"
export LC_ALL="ru_RU.utf8"

Перезагрузим ОС:

reboot

Проверим локализацию системы:

locale

Установка репозитория EPEL и REMI

dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Установка утилит

dnf install -y wget mc net-tools unzip htop

Настройка брандмауэра

В качестве межсетевого экрана будет использоваться iptables.

Удаление Firewalld

Остановка сервиса firewalld:

systemctl stop firewalld

Выключение сервиса автозагрузки firewalld:

systemctl disable firewalld

Маскировка сервиса firewalld:

systemctl mask --now firewalld

Удаление firewalld:

dnf remove -y firewalld

Установка и включение iptables

Установка iptables:

dnf install -y iptables-services

Включение сервиса iptables в автозагрузку:

systemctl enable iptables

Запуск сервиса iptables:

systemctl start iptables

Проверка статуса службы iptables:

systemctl status iptables

Перезагрузка ОС:

reboot

Заранее открываем порты на брандмауэре с помощью iptables:

    • 22/tcp — для удалённого доступа по протоколу SSH;
    • 110, 143, 993, 995, 587, 465, 25/tcp — для отправки и получения почтовых сообщений
    • 80, 443/tcp — для доступа к сайтам.

Создадим файл настроек iptables:

mcedit iptables.sh

и внесем в него следующее содержимое:

#!/bin/sh
# - Очищаем таблицы
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
# - Политики по умолчанию
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# - Разрешить трафик по петлевому интерфейсу
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# - Разрешим передавать пакеты, относящиеся к уже установленным соединениям
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# - Разрешить входящий PING
iptables -A INPUT -p icmp -j ACCEPT
# - Разрешить все исходящие
iptables -I OUTPUT 1 -j ACCEPT
# - Доступ по SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# - Разрешить доступ к WEB серверу
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
# - Доступ к почтовому серверу (SMTP, POP3, IMAP, SMTP SSL/TLS, SMTP STARTTLS, IMAP SSL/TLS, POP3 SSL/TLS)
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp --dport 587 -j ACCEPT
iptables -A INPUT -p tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp --dport 995 -j ACCEPT
# - Сохранить настройки
service iptables save

Сохраняем и назначаем права на выполнение:

chmod +x iptables.sh

Выполняем скрипт:

./iptables.sh

Посмотреть список правил iptables можно командой:

iptables --line-numbers -L -v -n

Настройка веб-сервера

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

dnf install -y httpd

Для настройка Apache работы в связке с Nginx открываем конфигурационный файл:

mcedit /etc/httpd/conf/httpd.conf

Находим параметр Listen 80 и меняем значение на Listen 8080.

Apache будет слушать порт 8080, так как на порту 80 будет работать Nginx.

Включение сервиса Apache в автозагрузку:

systemctl enable httpd

Запуск сервиса Apache:

systemctl start httpd

Проверка статуса сервиса Apache:

systemctl status httpd

Открываем браузер и вводим в адресную строку IP-адрес или DNS имя сервера и добавляем :8080 (http://<IP-адрес нашего сервера>:8080). Откроется тестовая страница.

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

dnf install -y nginx

Внесем небольшую корректировку в конфигурационный файл Ngnix:

mcedit /etc/nginx/nginx.conf

В секцию http добавим строку: server_names_hash_bucket_size 64;

На практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию.

Включение сервиса Nginx в автозагрузку:

systemctl enable nginx

Запуск сервиса Nginx:

systemctl start nginx

Проверка статуса сервиса Nginx:

systemctl status nginx

Открываем браузер и вводим в адресную строку IP-адрес или DNS имя сервера (http://<IP-адрес нашего сервера>). Должна откроется страница приветствия.

Установим PHP 8.0 из репозитория Remi:

dnf module install -y php:remi-8.0

Устанавливаем дополнительные модули расширений для PHP:

dnf install -y php-mysqli php-mbstring php-imap

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

dnf install -y @mysql

Включение сервиса mysql в автозагрузку:

systemctl enable mysqld

Запуск сервиса mysql:

systemctl start mysqld

Проверим статус сервиса mysql:

systemctl status mysqld

Сразу создаем пароль для учетной записи root:

mysqladmin -u root password

Вводим новый пароль, например:

Ekyj6ZfHabq97MvQ64Nc3@

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

Создадим директорию для сайта:

mkdir -p /var/www/html/postfixadmin.mta.mailns.ru

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

mcedit /etc/nginx/conf.d/postfixadmin.mta.mailns.ru.conf

И добавляем следующее содержимое (для HTTP):

server {
listen 80;
server_name postfixadmin.mta.mailns.ru;
root /var/www/html/postfixadmin.mta.mailns.ru;
index index.php index.html index.htm;
access_log /var/log/nginx/postfixadmin.mta.mailns.ru.access.log main;
error_log /var/log/nginx/postfixadmin.mta.mailns.ru.error.log;

location / {
root /var/www/html/postfixadmin.mta.mailns.ru;
proxy_pass http://127.0.0.1:8080/;
proxy_redirect     off;
proxy_force_ranges on;
proxy_set_header   Host            $host;
proxy_set_header   X-Real-IP       $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache off;
proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
proxy_cache_valid 3s;
proxy_cache_min_uses 2;
client_body_buffer_size    128k;
client_max_body_size       1024m;
proxy_connect_timeout      180;
proxy_send_timeout         180;
proxy_read_timeout         180;
send_timeout               180;
proxy_buffer_size          4k;
proxy_buffers              8 32k;
proxy_busy_buffers_size    68k;
proxy_temp_file_write_size 10m;
}

location ~ /\. {
deny all; 
}

}

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

mcedit /etc/httpd/conf.d/postfixadmin.mta.mailns.ru.conf

добавляем следующее содержимое:

<VirtualHost *:8080>
ServerName postfixadmin.mta.mailns.ru
DocumentRoot /var/www/html/postfixadmin.mta.mailns.ru
SetEnvIf X-Forwarded-Proto https HTTPS=on
<IFModule proxy_fcgi_module>
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "/var/www/html/postfixadmin.mta.mailns.ru%{reqenv:SCRIPT_NAME}"
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
</FilesMatch>
</IFModule>
ErrorLog /var/log/httpd/postfixadmin.mta.mailns.ru.error.log
CustomLog /var/log/httpd/postfixadmin.mta.mailns.ru.access.log common
<Directory /var/www/html/postfixadmin.mta.mailns.ru>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>

Для проверки, создадим файл index.php, с выводом информации о php.

echo '<?php phpinfo(); ?>' > /var/www/html/postfixadmin.mta.mailns.ru/index.php

Назначаем владельца директории:

chown -R apache:apache /var/www/html/postfixadmin.mta.mailns.ru

Перезапускаем Ngnix:

systemctl restart nginx

Перезапускаем Apache:

systemctl restart httpd

Открываем браузер, и заходим по адресу нашего сайта, должна открытся страница с информацией о php.

В данном примере:

http://postfixadmin.mta.mailns.ru/

Скачиваем Postfixadmin

wget -P /var/www/html/postfixadmin.mta.mailns.ru https://github.com/postfixadmin/postfixadmin/archive/refs/tags/postfixadmin-3.3.11.zip

Переходим в каталог:

cd /var/www/html/postfixadmin.mta.mailns.ru

Распакуем архив:

unzip postfixadmin-3.3.11.zip

Переносим содержимое распакованного архива в директорию сайта:

mv postfixadmin-postfixadmin-3.3.11/* /var/www/html/postfixadmin.mta.mailns.ru

Создаем каталог templates_c внутри папки портала (без него не запустится установка):

mkdir -p /var/www/html/postfixadmin.mta.mailns.ru/templates_c

Создаем базу данных postfix и учетную запись в mysql:

mysql -u root -p
CREATE DATABASE postfix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'UeBEPphUuKjnI3xKj5bk';
GRANT ALL ON postfix.* TO 'postfix'@'localhost';
exit

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

mcedit /var/www/html/postfixadmin.mta.mailns.ru/config.local.php
<?php
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'UeBEPphUuKjnI3xKj5bk';
$CONF['database_name'] = 'postfix';
$CONF['configured'] = true;
$CONF['default_language'] = 'ru';
?>

database_* — параметры для подключения к базе данных;
configured — говорит приложению, что администратор закончил его конфигурирование;
default_language — используемый язык по умолчанию;

Назначаем владельца директории:

chown -R apache:apache /var/www/html/postfixadmin.mta.mailns.ru

Запускаем браузер и вводим адрес http://<IP-адрес сервера>/public/setup.php

http://postfixadmin.mta.mailns.ru/public/setup.php

Откроется страница для установки PostfixAdmin.

Задаем дважды пароль установки и генерируем хэш, кликнув по Generate setup_password hash.

После перезагрузки страницы копируем хэш.

Открываем конфигурационный файл:

mcedit /var/www/html/postfixadmin.mta.mailns.ru/config.local.php

И добавляем строку:

$CONF['setup_password'] = '$2y$10$3JlILs8D0M43MlV6gf4UwOS8Qm3TkTosAZ/9byE9869t/vGFXnEz2';

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

Setup password — пароль, установки;
Админ — учетная запись для входа в панель управления PostfixAdmin;
Пароль — новый пароль для создаваемой учетной записи.

Добавляем суперпользователя PostfixAdmin

Переходим в браузере на страницу http://<IP-адрес сервера>/public/

http://postfixadmin.mta.mailns.ru/public/

Вводим логин и пароль для созданного пользователя.

Мы должны войти в postfix.admin:

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

Установка выполняется командой:

dnf install -y postfix postfix-mysql

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

groupadd -g 1024 vmail

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

Открываем на редактирование конфигурационный файл почтового сервера:

mcedit /etc/postfix/main.cf

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

myorigin = $mydomain
...
mydestination = localhost.$mydomain, localhost, localhost.localdomain
...
local_recipient_maps = unix:passwd.byname $alias_maps
...
mynetworks = 127.0.0.0/8 111.111.111.111/32, localhost
...
inet_interfaces = all
...
inet_protocols = all
...
smtpd_tls_cert_file = /etc/ssl/mail/public.pem
...
smtpd_tls_key_file = /etc/ssl/mail/private.key

myorigin — указывает, какой домен подставлять отправителю, если он не указан в заголовке FROM.
mydestination — указываем, для каких доменов принимаем входящую почту.
local_recipient_maps — указываем, откуда брать список локальных пользователей.
mynetworks — разрешаем отправлять сообщения локальному серверу (111.111.111.111/32 — IP-адрес сервера.
inet_interfaces — необходимо убедиться, что postfix будет слушать на всех необходимых интерфейсах, в данном случае, на всех (all). Также можно задать варианты loopback-only (127.0.0.1) или конкретный IP-адрес интерфейса.
inet_protocols — данный параметр задаст протокол для работы postfix. В данном примере на всех (all). Также можно задать значения ipv4 или ipv6.
smtpd_tls_cert_file — полный путь до публичного сертификата.
smtpd_tls_key_file — полный путь до приватного сертификата.

Если имя сервера отличается от имени, по которому сервер будет зарегистрирован в DNS, задаем опцию:

myhostname = mx.mta.mailns.ru

Теперь в конец конфигурационного файла допишем следующе:

virtual_mailbox_base = /home/mail
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql_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

smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = no
smtpd_helo_required = yes

virtual_mailbox_base — базовый путь хранения почтовых ящиков в системе UNIX.
virtual_alias_maps — формат и путь хранения алиасов для виртуальных пользователей.
virtual_mailbox_domains — формат и путь хранения доменов виртуальных пользователей.
virtual_mailbox_maps — формат и путь хранения почтовых ящиков для виртуальных пользователей.
virtual_minimum_uid — с какого номера присваивать идентификаторы пользователям.
virtual_uid_maps — идентификатор пользователя, от которого записываются сообщения.
virtual_gid_maps — идентификатор группы, от которой записываются сообщения.
virtual_transport — задает доставщика сообщений.
dovecot_destination_recipient_limit — передача сообщений от Postfix в Dovecot выполняется по заданному количеству (в нашем примере, по 1 шт.).
smtpd_sasl_auth_enable — разрешает sasl аутентификацию.
smtpd_sasl_exceptions_networks — исключение сетей от использования шифрования.
smtpd_sasl_security_options — дополнительные опции настройки sasl.
broken_sasl_auth_clients — эту опцию прописываем для клиентов MS Outlook.
smtpd_sasl_type — указывает тип аутентификации.
smtpd_sasl_path — путь до временных файлов обмена информацией с Dovecot. Указывается либо абсолютный путь, либо относительный queue_directory (по умолчанию /var/spool/postfix). Итого, полный путь — /var/spool/postfix/private/auth.
smtp_use_tls — по возможности, нужно ли передавать сообщения по защищенному каналу.
smtpd_use_tls — указывает клиентам на наличие поддержки TLS.
smtpd_tls_auth_only — не использовать только TLS.
smtpd_helo_required — требовать начинать сессию с приветствия.

Создаем файл с настройками обращения к базе с алиасами:

mcedit /etc/postfix/mysql_virtual_alias_maps.cf

Содержимое:

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

user и password — логин и пароль для подключения к MySQL;
hosts — имя сервера баз данных (в нашем случае, локальный сервер); dbname — имя базы данных;
query — шаблон запроса к данным.

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

mcedit /etc/postfix/mysql_virtual_domains_maps.cf

Содержимое:

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

И файл с почтовыми ящиками:

mcedit /etc/postfix/mysql_virtual_mailbox_maps.cf

Содержимое:

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

Открываем файл master.cf:

mcedit /etc/postfix/master.cf

добавляем в самом конце файла:

submission inet n - n - - smtpd
 -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

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_sasl_authenticated,reject

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

необходимо убедиться, что в содержимом файла нет других раскомментированных опций для submission, smtps и dovecot (по умолчанию, их нет). В данном случае, мы настроили работу postfix на портах 25, 465 и 587. В файле master.cf мы настраиваем работу вспомогательных сервисов для Postfix. Описание каждого сервиса начинается с новой строки без отступа. Затем идут настройки для сервиса и параметры запуска. Для примера, рассмотрим первую добавленную строку — submission inet n — n — — smtpd:

submission — имя сервиса. Возможно использование заранее определенных в postfix служб или создание своих. В данном примере submission для подключения MUA по порту 587 при отправке почты.
inet — тип обслуживания. Возможны варианты inet (сокет TCP/IP), unix (потоковый сокет), unix-dgram (сокет дейтаграммы), fifo (именованный канал очереди), pass (потоковый сокет UNIX-домена).
первый «n» — является ли сервис частным и должен быть ограниченным. Возможны варианты y или n. Для типа обслуживания inet может быть только n.
первый «-« — работает ли служба с правами root. Возможны варианты y, n и -. Прочерк означает неприменимость данного параметра к конкретному сервису.
второй «n» — должна ли служба работать в окружении chroot. Возможны варианты y или n.
второй «-« — через какое время в секундах пробудить службу, если она неактивна.
третий «-« — максимальное количество одновременно выполняемых процессов, которые может запустить данный сервис.
smtpd — выполняемая команда.

после команды идут аргументы ее запуска. Они могут переопределять параметры, заданные в main.cf. Каждый аргумент записывается с новой строки и начинается с двух пробелов. В данном примере мы используем следующие аргументы:

smtpd_tls_security_level — задает уровень безопасности с применением TLS. В данном примере may говорит о возможности его использования.
smtpd_sasl_auth_enable — разрешает sasl аутентификацию.
smtpd_sasl_type — указывает тип аутентификации.
smtpd_sasl_path — путь до временных файлов обмена информацией с сервером хранения почты (в нашем случае Dovecot). Указывается либо абсолютный путь, либо относительный queue_directory.
smtpd_sasl_security_options — дополнительные опции настройки sasl.
smtpd_sasl_local_domain — добавить домен для пользователей, которые проходят smtp-аутентификацию.
syslog_name — префикс названия службы при занесении ее в системный журнал.
smtpd_tls_wrappermode — запускать ли службу в нестандартном режиме (для поддержки TLS).
smtpd_client_restrictions — настройки ограничения клиентских соединений. В данном примере разрешить только авторизованных.

Генерируем сертификаты безопасности. Для этого создаем каталог, в котором их разместим:

mkdir -p /etc/ssl/mail

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

openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/mail/public.pem -keyout /etc/ssl/mail/private.key -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=mta.mailns.ru"

сертификат сгенерирован на 1461 день, ключи subj могут быть произвольными, CN необходимо указать в соответствии с именем сервера, по которому мы будем подключаться к почте.

Добавляем postfix в атозагрузку:

systemctl enable postfix

Запускаем postfix:

systemctl start postfix

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

Устанавливаем Dovecot с компонентом для работы с СУБД:

dnf install -y dovecot dovecot-mysql

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

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

в данном примере сообщения будут храниться в продвинутом формате maildir в каталоге /home/mail/<почтовый домен>/<логин пользователя.

Настраиваем слушателя для аутентификации:

mcedit /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 
 }
}

в данном примере мы настраиваем сервис для аутентификации и создаем два прослушивателя: /var/spool/postfix/private/auth — для возможности постфиксом использовать авторизацию через Dovecot (обращаем внимание, что /var/spool/postfix/private/auth — это тот же private/auth, который был прописан нами в postfix); auth-userdb — сокет для авторизации через dovecot-lda. Опция mode задает права на сокет, например, 666 позволит любому пользователю к нему подключиться; user и group задает пользователя и группу владельцев на сокет.

А также в этом файле добавим строки:

service stats {
  unix_listener stats-reader {
    user = vmail
    group = vmail
    mode = 0660
  }
  unix_listener stats-writer {
    user = vmail
    group = vmail
    mode = 0660
  }
}

в противном случае, мы увидим в логе ошибку error net_connect_unix(/var/run/dovecot/stats-writer) failed permission denied, так как у пользователя vmail не будет прав.

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

mcedit /etc/dovecot/conf.d/10-auth.conf

Содержимое:

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

в данном случае мы просто комментируем обычную аутентификацию и снимаем комментарий для использования sql-аутентификации.

Настраиваем использование шифрования:

mcedit /etc/dovecot/conf.d/10-ssl.conf

Редактируем следующие строки:

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

ssl = required — укажет dovecot требовать от клиентов использования шифрования;
ssl_cert — путь до открытого сертификата (также нами указывался в postfix); ssl_key — путь к закрытому ключу.

Настроим автоматическое создание каталогов при первом подключении пользователя к ящику:

mcedit /etc/dovecot/conf.d/15-lda.conf

Приведем следующий параметр к виду:

lda_mailbox_autocreate = yes

Настраиваем подключение к базе данных:

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

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

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

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

Создаем файл с настройками работы с mysql:

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

Содержимое:

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=UeBEPphUuKjnI3xKj5bk
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/',LCASE(`domain`),'/',LCASE(`maildir`)), 1024 AS uid, 1024 AS gid FROM mailbox WHERE username = '%u'

в данном примере настроен запрос на получение данных из базы mysql (mariadb). password_query — запрос на получение пароля из таблицы mailbox; user_query — запрос на получение данных пользователя (домашняя почтовая директория, идентификатор 1024 (идентификатор созданного нами ранее пользователя vmail).

Настраиваем интерфейс, на котором будет слушать dovecot:

mcedit /etc/dovecot/dovecot.conf

Приводим параметр listen к следующему значению:

listen = *

по умолчанию, dovecot слушает также на ipv6 (listen = *, ::). Если на сервере не используется 6-я версия протокола TCP/IP, в логах dovecot появятся ошибки:
master: Error: service(imap-login): listen(::, 143) failed: Address family not supported by protocol
master: Error: service(imap-login): listen(::, 993) failed: Address family not supported by protocol

Добавляем dovecot в атозагрузку и запускаем:

systemctl enable dovecot --now

Создаем почтовый ящик и проверяем работу сервера

Переходим в браузере на страницу Postfixadmin:

http://postfixadmin.mta.mailns.ru/public/

Вводим логин и пароль от административной учетной записи. Перед нами появится страница управления учетными записями.

Переходим в Список доменовНовый домен.

Заполняем формы и нажимаем Добавить домен:

Теперь переходим в ОбзорСоздать ящик.

Вводим данные нового пользователя и нажимаем Создать ящик:

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

Параметры для подключения:

    • Сервер: имя сервера или его IP-адрес (не желательно, так как сертификат выдается по доменному имени).
    • IMAP: 143 STARTTLS или 993 SSL/TLS
    • POP3: 110 STARTTLS или 995 SSL/TLS
    • SMTP: 25 STARTTLS или 465 SSL/TLS или 587 STARTTLS

для корректной работы сервера на портах 993, 995, 465 (SSL/TLS) необходим правильный сертификат (для нашего домена и выпущенный доверенным центром сертификации).

Устанавливаем и настраиваем Roundcube Webmail

Создадим директорию для сайта:

mkdir -p /var/www/html/mta.mailns.ru

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

mcedit /etc/nginx/conf.d/mta.mailns.ru.conf

И добавляем следующее содержимое (для HTTP):

server {
listen 80;
server_name mta.mailns.ru;
root /var/www/html/mta.mailns.ru;
index index.php index.html index.htm;
access_log /var/log/nginx/mta.mailns.ru.access.log main;
error_log /var/log/nginx/mta.mailns.ru.error.log;

location / {
root /var/www/html/mta.mailns.ru;
proxy_pass http://127.0.0.1:8080/;
proxy_redirect     off;
proxy_force_ranges on;
proxy_set_header   Host            $host;
proxy_set_header   X-Real-IP       $remote_addr;
proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache off;
proxy_cache_key "$request_method|$http_if_modified_since|$http_if_none_match|$host|$request_uri";
proxy_cache_valid 3s;
proxy_cache_min_uses 2;
client_body_buffer_size    128k;
client_max_body_size       1024m;
proxy_connect_timeout      180;
proxy_send_timeout         180;
proxy_read_timeout         180;
send_timeout               180;
proxy_buffer_size          4k;
proxy_buffers              8 32k;
proxy_busy_buffers_size    68k;
proxy_temp_file_write_size 10m;
}

location ~ /\. {
deny all; 
}

}

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

mcedit /etc/httpd/conf.d/mta.mailns.ru.conf

добавляем следующее содержимое:

<VirtualHost *:8080>
ServerName mta.mailns.ru
DocumentRoot /var/www/html/mta.mailns.ru
SetEnvIf X-Forwarded-Proto https HTTPS=on
<IFModule proxy_fcgi_module>
ProxyFCGISetEnvIf "true" SCRIPT_FILENAME "/var/www/html/mta.mailns.ru%{reqenv:SCRIPT_NAME}"
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
</FilesMatch>
</IFModule>
ErrorLog /var/log/httpd/mta.mailns.ru.error.log
CustomLog /var/log/httpd/mta.mailns.ru.access.log common
<Directory /var/www/html/mta.mailns.ru>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>

Для проверки, создадим файл index.php, с выводом информации о php.

echo '<?php phpinfo(); ?>' > /var/www/html/mta.mailns.ru/index.php

Назначаем владельца директории:

chown -R apache:apache /var/www/html/mta.mailns.ru

Перезапускаем Ngnix:

systemctl restart nginx

Перезапускаем Apache:

systemctl restart httpd

Открываем браузер, и заходим по адресу нашего сайта, должна открытся страница с информацией о php.

http://mta.mailns.ru/

Установим пакет tar:

dnf install -y tar

На официальном сайте заходим на страницу загрузки Roundcube. Копируем ссылку на необходимую версию продукта и скачиваем архив:

wget -P /var/www/html/mta.mailns.ru https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz

Распаковываем скачанный архив в директорию сайта:

tar -zvxf /var/www/html/mta.mailns.ru/roundcubemail-1.5.2-complete.tar.gz -C /var/www/html/mta.mailns.ru

Переносим содержимое распакованного архива в директорию сайта:

mv /var/www/html/mta.mailns.ru/roundcubemail-1.5.2/* /var/www/html/mta.mailns.ru/

Назначаем владельца

chown -R apache:apache /var/www/html/mta.mailns.ru

Создаем базу данных roundcubemail и учетную запись в mysql:

mysql -u root -p
CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
CREATE USER 'roundcube'@'localhost' IDENTIFIED BY 'KJHFf4gld8gh5DFG';
GRANT ALL ON roundcubemail.* TO 'roundcube'@'localhost';
exit

Устанавливаем компоненты, необходимые для работы Roundcube:

dnf install -y php-pear php-mcrypt php-intl php-ldap php-pear-Net-SMTP php-zip php-imagick php-gd

Укажем временную зону в php, для этого откроем php.ini:

mcedit /etc/php.ini

Изменим параметр:

date.timezone = "Asia/Yekaterinburg"

Можно приступать к настройке, откроем в браузере адрес сайта:

http://mta.mailns.ru/installer/

Должна открыться страница первого шага настройки: Check environment

Требования соответсвуют для установки нажимаем: Next.

Второй шаг настройка конфигурации: Create config

Настраиваем имя компании, подключение к базе данных, указываем язык, подключаем необходимые плагины.

Нажимаем: Creare config

Конфигурация создана, и сохранена.

Нажимаем: Continue

Третий шаг тестирование: Test config

Инициализируем базу данных и проводим тесты IMAP и SMTP.

После установки в файле конфигурации запрещаем установку и удаляем папку с файлами инсталляции.

Открываем конфигурационный файл roundcube:

mcedit /var/www/html/mta.mailns.ru/config/config.inc.php

Запрещаем установку портала:

$config['enable_installer'] = false;

После удаляем папку с установочными скриптами:

\rm -R /var/www/html/mta.mailns.ru/installer

Заходим в браузере по адресу http://mta.mailns.ru — должна открыться страница аутентификации пользователя. Вводим в качестве логина адрес почты созданного пользователя и его пароль.

Авторизуемся и переходим в веб-интерфейс Roundcube Webmail.

Настройки DNS для сервера

А-запись

Необходимо, чтобы имя сервера, которым представляется почтовый сервер разрешалось в IP-адрес.

Для этого заходим в консоль управления зоной домена и создаем запись типа А для сопоставления имени сервера с IP-адресом, на котором слушает запросы данный сервер.

MX-запись

MX-запись указывает на сервер, принимающий почту для вашего домена.

SPF-запись

Специальная TXT-запись в DNS, в которой указано с каких почтовых серверов может быть отправлена почта для домена.

DKIM-запись

Технология подтверждения почтового домена. Используется для уменьшения общего объема СПАМа и почтового фишинга. Расшифровывается как DomainKeys Identified Mail. Про DKIM важно знать, что она не защищает Вас от СПАМа — она делает так, что Ваши письма меньше попадают в СПАМ.

DMARC-запись

Политика обработки почтовых сообщений на основе SPF и DKIM. С помощью нее администратор почты может самостоятельно определять, что делать с письмами, которые не прошли доменную проверку на чужих серверах. Таким образом, не почтовая система делает выбор, как поступить с «плохими» сообщениями, а владелец домена. Настраивается путем создания TXT-записи в DNS. Расшифровывается как Domain-based Message Authentication, Reporting and Conformance.

Настройка DKIM

Устанавливаем opendkim и утилиту opendkim-tools:

dnf install -y opendkim opendkim-tools

Создаем каталог для размещения ключей домена:

mkdir -p /etc/opendkim/keys

Назначаем владельца каталога:

chown -R opendkim:opendkim /etc/opendkim

Задаем права:

chmod -R go-wrx /etc/opendkim/keys

Приводим конфигурационный файл opendkim к виду:

mcedit /etc/opendkim.conf

Содержимое:

AutoRestart Yes
AutoRestartRate 10/1h
PidFile /var/run/opendkim/opendkim.pid
Mode sv
Syslog yes
SyslogSuccess yes
#LogWhy yes
UserID opendkim:opendkim
Socket inet:8891@localhost
Umask 022
Canonicalization relaxed/relaxed
Selector default
Background yes
MinimumKeyBits 1024
KeyFile /etc/opendkim/keys/mta.mailns.ru/default
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts

Открываем конфигурационный файл postfix:

mcedit /etc/postfix/main.cf

Добавляем:

milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

Добавляем opendkim в атозагрузку:

systemctl enable opendkim

Запускаем opendkim:

systemctl start opendkim

Перегружаем postfix

systemctl restart postfix

Создаем каталог, генерируем ключ с помощью утилиты opendkim-genkey:

mkdir /etc/opendkim/keys/mta.mailns.ru

opendkim-genkey -D /etc/opendkim/keys/mta.mailns.ru/ -d mta.mailns.ru -s default

Меняем владельца на сгенерированный ключ и переименовываем его:

chown -R opendkim:opendkim /etc/opendkim/keys/mta.mailns.ru

mv /etc/opendkim/keys/mta.mailns.ru/default.private /etc/opendkim/keys/mta.mailns.ru/default

Добавляем правило для нашего домена в файл со списком ключей, доступных для подписи (/etc/opendkim/KeyTable):

echo -e "default._domainkey.mta.mailns.ru mta.mailns.ru:default:/etc/opendkim/keys/mta.mailns.ru/default" >> /etc/opendkim/KeyTable

Добавляем правило для нашего домен в файл со списком доменов и аккаунтов доступных для подписи (/etc/opendkim/SingleTable):

echo -e "*@mta.mailns.ru default._domainkey.mta.mailns.ru" >> /etc/opendkim/SigningTable

Добавляем наши домены в файл со списком доверенных доменов при подписывании или проверке (/etc/opendkim/TrustedHosts):

echo -e "mta.mailns.ru\mx.mta.mailns.ru" >> /etc/opendkim/TrustedHosts

Перегружаем postfix и opendkim:

systemctl restart postfix

systemctl restart opendkim

При генерации сертификата, утилита opendkim-genkey создала файл с данными, которые надо прописать в наш DNS:

cat /etc/opendkim/keys/mta.mailns.ru/default.txt

Отправка почты

Для проверки корректности настройки сервера, воспользуемся ресурсом: https://www.mail-tester.com.

Копируем адрес письма из поля:

Отправим письмо на указанный адрес:

Затем проверяем результат:

Ссылки
Почтовый сервер на CentOS 8 с виртуальными доменами, системой управления, веб-доступом и другими возможностями
Roundcube SMTP error 250 authentication failed – Here’s how to fix it