Почтовый сервер Postfix на CentOS 7 с виртуальными доменами, системой управления, веб-доступом и многим другим

Автор: | 03.11.2018

В данной инструкции выполнена настройка полноценного почтового сервера. Список всех особенностей и возможностей:

Почтовая система на базе Postfix;
Поддержка виртуальных доменов;
Хранение почты на сервере;
Подключение к почтовым ящикам по POP3 и IMAP (Dovecot);
Поддержка шифрования;
Хранение части настроек в MariaDB;
Защита от СПАМа и вирусов;
Доступ к почте с помощью веб-интерфейса (Roundcube);
Возможность управление почтовыми ящиками с помощью PostfixAdmin.

1. Преднастройка системы
Напоминаю, данная инструкция написана под систему Linux CentOS версии 7.

Задаем правильное имя серверу — это важный шаг, так как большинство антиспам систем выполняют проверки, обращаясь к серверу по имени в ожидании ответа.

* необходимо указать FQDN-имя, которое будет доступно из глобальной сети. В данном примере указано relay.guwi.ru.
После вводим такую команду:

Устанавливаем служебные пакеты (они понадобятся в процессе настройки сервера):

* ntpdate для возможности синхронизировать время на сервере; wget — клиент для загрузки файлов.
Задаем временную зону (в данном примере московское время):

Синхронизируем время:

Обновляем систему:

Заранее открываем порты на брандмауэре:

* где мы откроем следующие порты:
25 — стандартный SMTP через STARTTLS;
80 — HTTP для порталов Postfixadmin и Roundcube;
110 — стандартный POP3 через STARTTLS;
143 — стандартный IMAP через STARTTLS;
443 — защищенный HTTPS для порталов Postfixadmin и Roundcube;
465 — защищенный SMTP через SSL/TLS;
587 — защищенный SMTP через STARTTLS;
993 — защищенный IMAP через SSL/TLS;
995 — защищенный POP3 через SSL/TLS.

2. Настройка веб-сервера: NGINX + PHP + MariaDB
Система управления PostfixAdmin работает как веб-приложение, разработанное на PHP, а информацию хранит в базе данных. В нашем примере будет использоваться веб-сервер на NGINX, а база данных — MariaDB.

Установка NGINX
Добавляем репозиторий с нужным пакетом:

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

Разрешаем автозапуск сервиса и запускаем его:

Проверяем работоспособность веб-сервера, обратившись к нему в браузере по IP-адресу. Если видим заголовок «Welcome to nginx!», NGINX настроен верно.

PHP + PHP-FPM + NGINX
Устанавливаем php и php-fpm:

Настраиваем NGINX:

* где /usr/share/nginx/html — каталог для размещения портала управления Postfix.

Настраиваем PHP-FPM:

* здесь мы поменяли строку 127.0.0.1:9000.

Запускаем сервисы:

* если в процессе перезапуска nginx выскочит ошибка nginx: [emerg] a duplicate default server, необходимо найти настройку виртуального домена, в которой также указана опция default_server — опцию нужно убрать. Или можно самостоятельно настроить другой виртуальный домен.

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

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

MariaDB
Устанавливаем сервер баз данных следующей командой:

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

Задаем пароль для пользователя sql root:

3. Установка и настройка PostfixAdmin
Устанавливаем дополнительные компоненты для PHP:

Для применения установленных пакетов, перезапускаем обработчик скриптов:

Скачиваем PostfixAdmin:

В директории сайтов nginx создаем каталог для postfixadmin и распаковываем в него архив:

Задаем права на каталог:

* несмотря на то, что мы используем веб-сервер nginx, php-fpm по умолчанию, запускается от пользователя apache.

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

* где postfix — имя базы.

* где postfix — имя учетной записи; postfix123 — пароль; localhost разрешает подключение только с локального сервера.

Выходим из командной оболочки MariaDB:

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

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

Запускаем браузер и вводим адрес http://IP-адрес сервера/postfixadmin/setup.php
Начнется процесс проверки конфигурации и установки портала PostfixAdmin. После ее окончания вводим дважды пароль и генерируем хэш:

Вводим дважды пароль после установки PostfixAdmin
После перезагрузки страницы копируем хэш:

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

Находим строчку:

И меняем ее на:

* где ‘7a8e14…c26’ — скопированный хэш.

После, на той же странице, где показан хэш, добавляем суперпользователя PostfixAdmin:
* где Setup password — пароль, который мы ввели на предыдущей странице; Пароль — новый пароль для создаваемой учетной записи.

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

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

Готово.

4. Настройка Postfix
По умолчанию, Postfix уже установлен в CentOS 7. Но если встретится сервер без него, выполним установку простой командой:

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

* сначала мы создаем группу vmail и guid 1024, после — пользователя vmail с uid 1024 и домашней директорией /home/mail. Обратите внимание, что в некоторых системах идентификатор группы и пользователя 1024 может быть занят. В таком случае необходимо создать другой, а в данной инструкции ниже заменить все 1024 на альтернативный.

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

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

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

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

* указываем, откуда брать список локальных пользователей.

* разрешаем отправлять сообщения локальному серверу.

* указываем, откуда брать список алиасов.

* необходимо убедиться, что postfix будет слушать на всех необходимых интерфейсах, в данном случае, на всех.

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

* где:
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.
smtpd_tls_cert_file — полный путь до публичного сертификата.
smtpd_tls_key_file — полный путь до приватного сертификата.
smtpd_use_tls — указывает клиентам на наличие поддержки TLS.
smtpd_tls_auth_only — использовать только TLS.
smtpd_helo_required — требовать начинать сессию с приветствия.
Создаем файл с настройками обращения к базе с алиасами:

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

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

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

Открываем файл master.cf и дописываем в самый конец:

* необходимо убедиться, что в содержимом файла нет других раскомментированных опций для submission, smtps и dovecot (по умолчанию, их нет). В данном случае, мы настроили работу postfix на портах 25, 465 и 587.

Перезапустим postfix:

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

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

* в данном примере сообщения будут храниться в продвинутом формате maildir.

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

* обращаем внимание, что /var/spool/postfix/private/auth — это тот же private/auth, который был прописан нами в postfix.

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

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

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

* данная настройка укажет dovecot требовать от клиентов использования шифрования.

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

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

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

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

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

* по умолчанию, dovecot слушает также на ipv6 (listen = *, ::). Если на сервере не используется 6-я версия протокола TCP/IP, в логах dovecot появятся ошибки:

Генерируем сертификаты безопасности
Создаем каталог, в котором разместим сертификаты:

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

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

Запускаем dovecot:

6. Создаем первый почтовый ящик и проверяем работу сервера
В браузере вводим в адресной строке путь до Postfixadmin — http:///postfixadmin/.

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

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

Создаем новый домен в Postfixadmin

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

Данные домена

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

Создаем новый почтовый ящик через Postfixadmin

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

Заполняем данные для создания нового ящика

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

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

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

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

Создаем каталог, где будут размещаться файлы портала:

И распаковываем скачанный архив:

Копируем шаблон конфига:

И открываем его на редактирование:

* первую строку мы редактируем, а вторую добавляем. В первой строке roundcube:roundcube123 — логин и пароль для доступа к базе данных; localhost — сервер базы данных; roundcubemail — имя базы данных.

Задаем владельца apache на папку портала:

Создаем в MariaDB базу для roundcubemail:

И загружаем в созданную базу данные:

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

Настроим php:

Перезагружаем php-fpm:

Теперь открываем браузер и переходим по адресу http:///webmail/installer/. В самом низу нажимаем по кнопке Next. Если кнопка будет неактивна, проверяем, что нет ошибок (NOT OK).

Проверяем, что все пункты находятся в состоянии OK.

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

И заходим в браузере по адресу http:///webmail/.

8. Защищаемся от вирусов
Установка и настройка ClamAV
Устанавливаем антивирус:

Настраиваем postfix:

* где content_filter указывает на приложение, которое будет сканировать сообщения; receive_override_options позволяет увидеть оригинальные email адреса писем с вирусами.

Теперь редактируем master.cf:

Дописываем следующее:

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

Конфигурируем clamsmtpd:

* где ClamAddress указываем на путь к сокетному файлу — он должен совпадать с путем в конфигурационном файле для clam scan; TempDirectory — путь для хранения временных файлов.

Редактируем конфигурационный файл для clam scan:

* где PidFile — путь для pid-файла сервиса; LocalSocket — путь до сокетного файла для взаимодействия с clamsmtp; User — пользователь, от которого будет запускаться clamd.

Редактируем владельца на каталог для сокетного файла:

Теперь разрешаем запуск антивируса и запускаем его:

Обновление
Открываем конфиг freshclam и ставим комментарий напротив Example:

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

Запускаем обновление:

Для настройки автоматического обновления, редактируем cron:

* в данном примере, каждый день в 03:15 будет запускаться процесс обновления clamav.

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

Письмо не должно дойти.

9. Боремся со СПАМом
Проверка контента с помощью Spamassassin
Устанавливаем spamassassin

Редактируем master.cf:

Для smtp добавляем следующую опцию:

И добавить следующее:

Обновляем spamassassin:

Разрешаем его запуск и стартуем сервис:

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

Для автоматического обновления добавим в cron следующее:

* обновление будет происходить каждый день в 03:30.

Для проверки работы контентного антиспама, отправляем письмо со следующим содержимым:

Антиспам средствами Postfix
В MTA Postfix встроен свой механизм проверки заголовков входящих сообщений. Правила размещаются в 6 секций, обработка которых выполняется в следующем порядке:

client -> helo -> sender -> relay -> recipient -> data

И так, для настройки антиспама в конфигурационный файл main.cf добавляем:

* это более или менее мягкие правила. Их можно использовать первое время, пока тестируем сервер.

Для усиления защиты добавляем:

* где:

reject_unknown_client_hostname — проверяет наличие PRT-записи отправителя и наличие рабочей А-записи в соответствие PTR.
reject_invalid_helo_hostname — проверяет синтаксис HELO-приветствия.
reject_non_fqdn_helo_hostname — требует правильного FQDN-имени во время HELO-приветствия.
reject_unknown_helo_hostname — запрещает представляться именами, для которых нет А-записи или MX.
reject_rbl_client — проверяет наличие отправителя в черных списках.
После внесения всех правок, необходима перезагрузка Postfix:

Сервер настроен — можно пользоваться.