Pre-loader


Великий поштовий сервер на Ubuntu Server

Використовувані терміни: Postfix, POP3, SMTP, IMAP, MariaDB, Ubuntu, PostfixAdmin, Dovecot, Roundcube

У цій інструкції налаштовано повноцінний поштовий сервер на Linux Ubuntu Server (протестовано на версії 20.04). Список усіх особливостей та можливостей:

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

Зміст

1. Передналаштування системи
2. Налаштування веб-сервера: NGINX + PHP + MariaDB
3. Встановлення та налаштування PostfixAdmin
4. Налаштування Postfix
5. Налаштування Dovecot
6. Перевірка роботи сервера
7. Налаштування Roundcube Webmail
8. Захист від вірусів та СПАМу
Clamav + Amavisd
Налаштування Postfix
Оновлення антиспаму
Перевірка налаштування
Пересилання СПАМу та вірусів на іншу скриньку
Антиспам засобами Postfix
Навчання антиспаму
9. Надсилання пошти без влучення в СПАМ
10. Налаштування DKIM
11. Налаштування дискових квот
12. Автоматичне налаштування поштових клієнтів
13. Відображення папок IMAP в Outlook українською
14. Додаткові налаштування
Налаштування лімітів
Зміна email
15. Можливі проблеми

І так, ця інструкція написана під Linux Ubuntu Server. Попередньо виконаємо наступні дії.


Загальні налаштування

Оновлюємо систему:

apt-get update && apt-get upgrade

Задаємо правильне ім’я серверу – це важливий крок, оскільки більшість антиспам систем виконують перевірки, звертаючись до сервера на ім’я в очікуванні відповіді:

hostnamectl set-hostname relay.corp2.eu

* необхідно вказати FQDN-ім’я, яке буде доступне з глобальної мережі. У цьому прикладі вказано relay.corp2.eu. Встановлюємо пакет для синхронізації часу:

apt-get install chrony

Задаємо тимчасову зону (у цьому прикладі київський час):

timedatectl set-timezone Europe/Kiev

* Щоб отримати список всіх можливих зон, вводимо timedatectl list-timezones. Дозволяємо сервіс для оновлення часу:

systemctl enable chrony

Налаштування безпеки

Заздалегідь відкриваємо порти на брандмауері за допомогою iptables:

iptables -I INPUT 1 -p tcp --match multiport --dports 25,110,143,465,587,993,995 -j ACCEPT
iptables -I INPUT 1 -p tcp --match multiport --dports 80,443 -j ACCEPT

* де ми відкриємо такі порти:

  • 25 – стандартний SMTP через STARTTLS;
  • 110 – стандартний POP3 через STARTTLS;
  • 143 – стандартний IMAP через STARTTLS;
  • 465 – захищений SMTP через SSL/TLS;
  • 587 – захищений SMTP через STARTTLS;
  • 993 – захищений IMAP через SSL/TLS;
  • 995 – захищений POP3 через SSL/TLS.
  • 80 – HTTP для порталів Postfixadmin і Roundcube;
  • 443 – захищений HTTPS для порталів Postfixadmin та Roundcube;

Для збереження правил встановимо пакет:

apt-get install iptables-persistent

І виконуємо команду:

netfilter-persistent save

2. Налаштування веб-сервера: NGINX + PHP + MariaDB

Система керування PostfixAdmin працює як веб-додаток, розроблений на PHP, а інформацію зберігає у базі даних. У нашому прикладі використовуватиметься веб-сервер на NGINX, а база даних — MariaDB.
Установка NGINX

Встановлюємо nginx командою:

apt-get install nginx

Дозволяємо автозапуск сервісу:

systemctl enable nginx

Перевіряємо працездатність веб-сервера, звернувшись до нього у браузері за адресою http://. Якщо бачимо заголовок “Welcome to nginx!”, NGINX налаштовано правильно.

PHP + PHP-FPM + NGINX

Встановлюємо php та php-fpm:

apt-get install php php-fpm

Налаштовуємо NGINX:

vi /etc/nginx/sites-enabled/default

У розділах http – server вказуємо, щоб першим індексним файлом був index.php, а також додаємо налаштування для обробки запитів php (location):

server {
        listen 80 default_server;
        listen [::]:80 default_server;
        ...

        index index.php ...
        ...

        location ~ .php$ {
            set $root_path /var/www/html;
            fastcgi_pass unix:/run/php/php7.4-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_param DOCUMENT_ROOT $root_path;
        }
} 

* де /var/www/html – каталог для розміщення даних nginx за замовчуванням; /run/php/php7.4-fpm.sock – шлях до сокет-файлу php-fpm (зверніть увагу, що точне значення залежить від використовуваної вервії php).

Дозволяємо автозапуск php-fpm:

systemctl enable php7.4-fpm

* де php7.4-fpm залежить від версії php, яку можна подивитися командою php -v.

Перезапускаємо nginx:

systemctl restart nginx

Для перевірки, створюємо індексний файл у директорії сайту з таким вмістом:

vi /var/www/html/index.php
#k2-1#?php phpinfo(); #k2-2#?

MariaDB

Встановлюємо сервер баз даних наступною командою:

apt-get install mariadb-server

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

systemctl enable mariadb

Задаємо пароль для користувача sql root:

mysqladmin -u root password

3. Встановлення та налаштування PostfixAdmin

Встановлюємо додаткові компоненти для PHP:

apt-get install php-mysql php-mbstring php-imap

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

systemctl restart php7.4-fpm

Завантажуємо PostfixAdmin:

wget https://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz

У директорії сайтів nginx створюємо каталог для postfixadmin та розпаковуємо в нього архів:

mkdir /var/www/html/postfixadmin
tar -C /var/www/html/postfixadmin -xvf postfixadmin.tar.gz --strip-components 1

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

mkdir /var/www/html/postfixadmin/templates_c

* в іншому випадку, при спробі зайти в панель керування після її встановлення ми отримаємо помилку ERROR: the templates_c directory не існує або не задано для веб-сервера.

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

chown -R www-data:www-data /var/www/html/postfixadmin

* незважаючи на те, що ми використовуємо веб-сервер nginx, php-fpm за замовчуванням, запускається від користувача www-data.

Створюємо базу даних postfix та обліковий запис mariadb:

mysql -u root -p
> CREATE DATABASE postfix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;

* де postfix – ім’я бази.

> GRANT ALL ON postfix.* TO `postfix`@`localhost` IDENTIFIED BY `postfix123`;

* де postfix – ім’я облікового запису; postfix123 – пароль; localhost дозволяє підключення лише з локального сервера.

Виходимо з командної оболонки MariaDB:

> q

Створюємо файл конфігурації postfixadmin:

vi /var/www/html/postfixadmin/config.local.php

* У попередніх версіях використовувався файл config.inc.php. У нових версіях його не рекомендується редагувати, а використовувати config.local.php, який перевизначає налаштування.

І додаємо наступне:

#k2-1#?php

$CONF[`configured`] = true;
$CONF[`default_language`] = `ru`;
$CONF[`database_password`] = `postfix123`;
$CONF[`emailcheck_resolve_domain`]=`NO`;

#k2-2#?

* де configured говорить програмі, що адміністратор закінчив його конфігурування; default_language — мова, що використовується за замовчуванням; database_password – пароль для бази даних, який ми задали на попередньому кроці; emailcheck_resolve_domain – задає необхідність перевірки домену при створенні ящиків та псевдонімів.

Запускаємо браузер і вводимо адресу http:///postfixadmin/public/setup.php — відкриється сторінка для встановлення PostfixAdmin.

Задаємо двічі пароль установки і генеруємо хеш, клацнувши Generate setup_password hash:

Після копіюємо хеш, який з’явиться під кнопкою:

Відкриваємо конфігураційний файл:

 vi /var/www/html/postfixadmin/config.local.php

І додаємо рядок:

...
$CONF[`setup_password`] = `$2y$10$D...R32`;

* де ‘$2y$10$D…R32’ — скопійований хеш.

Перезавантажуємо сторінку http:///postfixadmin/public/setup.php — тепер у нас з’явиться форма для введення нашого пароля, створеного на попередньому етапі. Вводимо його та клацаємо по Login with setup_password:

Буде виконано встановлення PostfixAdmin.

Якщо в процесі встановлення система виведе помилки, необхідно самостійно розібратися з ними. Як правило, вони можуть зводитись до відсутності необхідних пакетів, яких може не опинитися в системі за промовчанням.

Після встановлення в нижній частині сторінки має бути форма додавання суперкористувача – вводимо дані:

* де Setup password – пароль, який ми ввели на попередній сторінці; Адмін — обліковий запис для входу до панелі керування PostfixAdmin; Пароль — новий пароль для облікового запису, що створюється.

Встановлення завершено. Переходимо в браузері на сторінку http:///postfixadmin/public/login.php

Вводимо логін та пароль для створеного користувача. Ми повинні увійти до postfix.admin.

Однак, в моєму випадку, користувач не створювався при установці системи і необхідно було створити адміністратора вручну. Якщо це потрібно, в консолі сервера підключаємося до СУБД:

mysql -uroot -p

Переходимо до використання бази postfix:

> use postfix

Додаємо адміністратора запитом:

> INSERT INTO admin (`username`, `password`, `superadmin`, `active`) VALUES (`root@corp2.eu`, `$1$1b7ff416$/KKYqdyAd3viA3.PNu5hh/`, `1`, `1`);

Виходимо з sql-оболонки:

> quit

Тепер переходимо на сторінку http:///postfixadmin/public/login.php вводимо логін root@corp2.eu та пароль qwe12345 — ми повинні опинитися в системі керування поштою. Перш за все, переходимо в Список адмінів – Новий адмін:

Створюємо свого користувача. Після чого можна видалити те, що створили через командний рядок.


4. Встановлення та налаштування Postfix

Установка Postfix в Ubuntu виконується командою:

apt-get install postfix postfix-mysql

* крім самого postfix, ми також встановимо postfix-mysql для роботи з СУБД.

У процесі установки має з’явитися вікно Postfix Configuration — залишаємо Internet Site:

У наступному вікні залишаємо ім’я сервера та натискаємо Enter.

Після встановлення пакетів створюємо обліковий запис, від якого ми будемо працювати з каталогом віртуальних поштових скриньок:

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

* спочатку ми створюємо групу vmail і guid 1024, після – користувача vmail з uid 1024 та домашньою директорією /home/mail – у ній у нас буде зберігатися пошта. Зверніть увагу, що в деяких системах ідентифікатор групи та користувача 1024 може бути зайнятий. У такому випадку необхідно створити інший, а в даній інструкції нижче замінити всі 1024 альтернативний.

Якщо директорія для пошти раніше вже була створена, необхідно задати як власника нашого створеного користувача:

chown vmail:vmail /home/mail

Відкриваємо на редагування конфігураційний файл поштового сервера:

vi /etc/postfix/main.cf

І редагуємо наступні рядки:

mydestination = localhost.$mydomain, localhost, localhost.localdomain
...
inet_protocols = ipv4
...
smtpd_tls_cert_file = /etc/ssl/mail/public.pem
smtpd_tls_key_file = /etc/ssl/mail/private.key

* де:

  • mydestination – вказуємо, для яких доменів приймаємо вхідну пошту.
  • inet_protocols – цей параметр задасть протокол для роботи postfix. У цьому прикладі на ipv4 — якщо в нашій системі не використовується IPv6, можуть виникнути проблеми з маршрутизацією пошти. Також можна встановити значення all або ipv6.
  • smtpd_tls_cert_file – повний шлях до публічного сертифікату.
  • smtpd_tls_key_file – повний шлях до приватного сертифікату.

Якщо ім’я сервера відрізняється від імені, за яким сервер буде зареєстровано в DNS, задаємо опцію:

myhostname = relay.corp2.eu

Тепер до кінця конфігураційного файлу допишемо наступне:

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 = yes
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 — по можливості використовувати шифроване з’єднання для підключення до іншого сервера SMTP при надсиланні листа.
– smtpd_use_tls – вказує клієнтам на наявність підтримки TLS.
– smtpd_tls_auth_only – використовувати тільки TLS.
– smtpd_helo_required – вимагати розпочинати сесію з вітання.

Створюємо файл із налаштуваннями звернення до бази з аліасами:

vi /etc/postfix/mysql_virtual_alias_maps.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT goto FROM alias WHERE address=`%s` AND active = `1`

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

Створюємо файл з інструкцією отримання даних щодо віртуальних доменів:

vi /etc/postfix/mysql_virtual_domains_maps.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT domain FROM domain WHERE domain=`%u`

І файл із поштовими скриньками:

vi /etc/postfix/mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix123
hosts = localhost
dbname = postfix
query = SELECT CONCAT(domain,`/`,maildir) FROM mailbox WHERE username=`%s` AND active = `1`

Відкриваємо файл master.cf і дописуємо до кінця:

vi /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/lib/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

* сертифікат згенерований на 1461 день, ключі subj можуть бути довільними, CN необхідно вказати відповідно до імені сервера, яким ми будемо підключатися до пошти.
* якщо ми хочемо використовувати сертифікат, який проходитиме всі перевірки безпеки, його потрібно купити або запросити у Let’s Encrypt.

Дозволяємо запуск postfix:

systemctl enable postfix

Перезапускаємо його:

systemctl restart postfix

5. Налаштування Dovecot

Встановлюємо Dovecot із компонентом для роботи з СУБД:

apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql

Налаштовуємо спосіб зберігання повідомлень:

vi /etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:/home/mail/%d/%u/

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

Налаштовуємо слухача для автентифікації:

vi /etc/dovecot/conf.d/10-master.conf
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
group = vmail
}
} 

* в даному прикладі ми налаштовуємо сервіс для аутентифікації і створюємо два прослуховувачі: /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:

vi /etc/dovecot/conf.d/10-auth.conf
#!include auth-system.conf.ext
!include auth-sql.conf.ext

* в даному випадку ми просто коментуємо звичайну автентифікацію та знімаємо коментар для використання SQL-аутентифікації.

Налаштовуємо використання шифрування:

vi /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = 

ssl = required вкаже dovecot вимагати від клієнтів використання шифрування; ssl_cert – шлях до відкритого сертифікату (також нами вказувався у postfix); ssl_key – шлях до закритого ключа.

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



vi /etc/dovecot/conf.d/15-lda.conf
lda_mailbox_autocreate = yes

Налаштовуємо підключення до нашої бази даних:



vi /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:



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

У самий низ додамо:



driver = mysql
connect = host=localhost dbname=postfix user=postfix password=postfix123
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:



vi /etc/dovecot/dovecot.conf
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

Перезапускаємо dovecot:



systemctl restart dovecot

6. Створюємо першу поштову скриньку та перевіряємо роботу сервера

У браузері вводимо в адресному рядку шлях до Postfixadmin – http:///postfixadmin/public/.

Вводимо логін та пароль від адміністративного облікового запису, який ми створили на кроці 3. Перед нами з’явиться сторінка керування обліковими записами.

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

Заповнюємо форми і натискаємо Додати домен:

Тепер переходимо в Огляд – Створити скриньку:

Вводимо дані нового користувача і натискаємо на Створити скриньку:

Тепер можна підключитися до сервера за допомогою будь-якої поштової програми, наприклад 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) потрібен правильний сертифікат (для нашого домену та випущений довіреним центром сертифікації).

7. Встановлюємо та налаштовуємо Roundcube Webmail

У цьому посібнику ми розберемо використання веб-клієнта Roundcube. За потреби можна встановити інший, наприклад, WebMail Lite або кілька одночасно.

На офіційному сайті заходимо на сторінку завантаження Roundcube. Дивимось посилання на версію продукту з тривалою підтримкою (LTS):

Використовуємо посилання, щоб завантажити архів програми:

wget https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz

Створюємо каталог, де розміщуватимуться файли порталу:

mkdir /var/www/html/webmail

І розпаковуємо завантажений архів:

tar -C /var/www/html/webmail -xvf roundcubemail-*.tar.gz --strip-components 1

Копіюємо шаблон конфігу:

cp /var/www/html/webmail/config/config.inc.php.sample /var/www/html/webmail/config/config.inc.php

І відкриваємо його на редагування:

vi /var/www/html/webmail/config/config.inc.php
$config[`db_dsnw`] = `mysql://roundcube:roundcube123@localhost/roundcubemail`;
$config[`enable_installer`] = true;

* Перший рядок ми редагуємо, а другий додаємо. У першому рядку roundcube:roundcube123 — логін та пароль для доступу до бази даних; localhost – сервер бази даних; roundcubemail – ім’я бази даних. Другий рядок дозволяє установку порталу.

Також дописуємо до конфігураційного файлу наступне:

$config[`drafts_mbox`] = `Drafts`;
$config[`junk_mbox`] = `Junk`;
$config[`sent_mbox`] = `Sent`;
$config[`trash_mbox`] = `Trash`;
$config[`create_default_folders`] = true;

* Налаштування $config[‘create_default_folders’] = true створює папки за промовчанням, якщо їх немає:

  • Drafts – Чернівці.
  • Junk – СПАМ.
  • Sent – Надіслані.
  • Trash – Кошик.

* Без налаштування, якщо не створювалися папки іншим клієнтом, веб-клієнт буде видавати помилки при переміщенні листів, наприклад, при їх видаленні.

Задаємо власника apache на папку порталу:

chown -R www-data:www-data /var/www/html/webmail

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

mysql -uroot -p
> CREATE DATABASE roundcubemail DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY `roundcube123`;
> quit

І завантажуємо у створену базу дані:

mysql -uroot -p roundcubemail < /var/www/html/webmail/SQL/mysql.initial.sql

Встановлюємо компоненти, необхідні для роботи Roundcube:

apt-get install php-pear php-intl php-ldap php-net-smtp php-gd php-imagick php-zip

У Ubuntu немає можливості встановити компонент mcrypt з репозиторію – для початку встановимо пакети, необхідні для збирання його вихідних джерел:

apt-get install php-dev libmcrypt-dev

Виконуємо команди:

pecl channel-update pecl.php.net
pecl install mcrypt-1.0.4

Створимо файл із налаштуванням нового модуля:

vi /etc/php/7.4/fpm/conf.d/99-mcrypt.ini
extension=mcrypt.so

Налаштуємо php:

vi /etc/php/7.4/fpm/php.ini
date.timezone = "Europe/Kiev"
...
post_max_size = 30M
...
upload_max_filesize = 30M

* в даному прикладі ми задаємо московський час і можливість завантажувати файл розміром 30 Мб (це буде максимальним обсягом вкладень, які можна відправляти через веб-інтерфейс).

Перезавантажуємо php-fpm:

systemctl restart php7.4-fpm

Налаштуємо nginx:

vi /etc/nginx/nginx.conf

Додамо рядок до розділу http:

http {
...
client_max_body_size 30M;
...

* даною установкою ми також дозволимо завантаження файлів розміром 30 Мб.

Перезапустимо nginx для застосування налаштування:

systemctl restart nginx

Тепер відкриваємо браузер і переходимо на адресу http:///webmail/installer/. У самому низу натискаємо на кнопку Next. Якщо кнопка буде неактивною, перевіряємо, що немає помилок (NOT OK).

На наступній сторінці перевіряємо, що всі пункти перебувають у стані OK. Встановлення виконано.

Відкриваємо конфігураційний файл roundcube:

vi /var/www/html/webmail/config/config.inc.php

Забороняємо встановлення порталу:

$config[`enable_installer`] = false;

Після видаляємо папку з настановними скриптами:


m -R /var/www/html/webmail/installer

І заходимо в браузері за адресою http:///webmail/. Вводимо як логін адресу пошти створеного користувача та його пароль.

8. Захищаємось від вірусів та СПАМу

Антивірус потребує багато ресурсів. Будьте готові, що після запуску сервер почне працювати повільніше і знадобиться додати ресурси.

Встановлення та налаштування Clamav + Amavisd

Встановлюємо необхідні для роботи антивірусу та антиспаму компоненти:

apt-get install amavisd-new clamav clamav-daemon spamassassin

Додаємо користувача clamav до групи amavis:

usermod -a -G amavis clamav

Відкриваємо конфігураційний файл amavis:

vi /etc/amavis/conf.d/15-content_filter_mode

Знімаємо коментарі для рядків:

...
@bypass_virus_checks_maps = (
\%bypass_virus_checks, @bypass_virus_checks_acl, $bypass_virus_checks_re);
...
@bypass_spam_checks_maps = (
\%bypass_spam_checks, @bypass_spam_checks_acl, $bypass_spam_checks_re);
...

* за замовчуванням amavis не виконуємо жодних перевірок – для включення сканування на віруси знімаємо коментар з bypass_virus_checks_maps, а для сканування на СПАМ – bypass_spam_checks_maps.

Потім відкриваємо на редагування:

vi /etc/amavis/conf.d/50-user

Додамо рядки:

$allowed_header_tests{`multiple`} = 0;
$allowed_header_tests{`missing`} = 0;

* Дані опції дозволять програмі Outlook без помилок відправляти тестове повідомлення.

Дозволяємо запуск антивірусу та amavis:

systemctl enable clamav-daemon clamav-freshclam amavis

Перезапускаємо послуги:

systemctl restart amavis clamav-daemon clamav-freshclam

Налаштування Postfix

Додаємо до postfix:

vi /etc/postfix/main.cf
content_filter = scan:[127.0.0.1]:10024

* де content_filter вказує на програму, яка буде сканувати повідомлення;

Тепер редагуємо master.cf:

vi /etc/postfix/master.cf

Дописуємо наступне:

scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
-o smtp_enforce_tls=no

127.0.0.1:10025 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8

* Отже, даним налаштуванням ми створимо два допоміжні сервіси scan і 127.0.0.1:10025 (сервіс без імені, він просто слухатиме на порту 10025 – це порт за замовчуванням, на який відправляє повідомлення amavis після виконання перевірки). Також, ми використовуємо такі опції:

  • smtp_send_xforward_command — щоб надсилати повідомлення зі вихідним ім’ям клієнта та IP-адресою. У цьому прикладі, так.
  • smtp_enforce_tls – чи вимагати TLS.
  • content_filter — програма для сканування. У цьому прикладі сканування вимкнено.
  • receive_override_options перевизначає опції в main.cf. У нашому випадку no_unknown_recipient_checks відключає спроби з’ясувати, чи є одержувач невідомим; no_header_body_checks відключає перевірки заголовків та тала листів.
  • порожні значення для smtpd_helo_restrictions, smtpd_client_restrictions, smtpd_sender_restrictions відключають обмеження для цих опцій.
  • smtpd_recipient_restrictions — контролює відповідь Postfix на команду SMTP RCPT TO. Тут ми дозволяємо лише з’єднання від вузлів, перерахованих у моїх мережах.
  • mynetworks_style=host вказує postfix, що він повинен надсилати пошту тільки з локального комп’ютера.
  • smtpd_authorized_xforward_hosts вкаже, які віддалені клієнти можуть використовувати XFORWARD. У разі локальний комп’ютер.

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

systemctl restart postfix

Налаштування оновлень антиспаму

Для оновлення бази антиспаму виконуємо команду:

sa-update --nogpg --verbose

Для налаштування автоматичного оновлення редагуємо cron:

crontab -e
30 3 * * * /usr/bin/sa-update

* в даному прикладі, щодня о 03:30 запускатиметься процес оновлення антиспаму.


Перевірка

Для перевірки антивірусу надсилаємо повідомлення з таким вмістом:

X5O!P%@AP[4PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Більшість поштових систем екранінують вірусну послідовність і лист нормально пройде повз наш антивірус. Щоб зробити коректний тест, необхідно надіслати листа командами SMTP.

Лист не повинен дійти, а в лозі (/var/log/maillog) ми побачимо рядок:

... amavis[17688]: (17688-04) Blocked INFECTED (Eicar-Signature) {DiscardedOutbound,Quarantined}, MYNETS LOCAL ...
... relay=127.0.0.1[127.0.0.1]:10024, delay=0.25, delays=0.19/0/0/0.06, dsn=2.7.0, status=sent (250 2.7.0 Ok, discarded, id=17688-04 - INFECTED: Eicar-Signature)

Для перевірки роботи контентного антиспаму надсилаємо листа з наступним вмістом:

XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X

У результаті лист не повинен прийти, а в логах ми побачимо:

... amavis[17689]: (17689-04) Blocked SPAM {DiscardedOutbound,Quarantined}, MYNETS LOCAL ...
... status=sent (250 2.7.0 Ok, discarded, id=17689-04 - spam)

Пересилання СПАМу та вірусів на іншу скриньку

Всі листи зі спамом та вірусами переміщатимуться до карантину. Якщо ми хочемо перенаправляти всі подібні повідомлення на спеціальну скриньку, необхідно налаштувати amavis.

Відкриваємо конфігураційний файл:

vi /etc/amavis/conf.d/50-user

Додаємо такі опції:

$spam_quarantine_to = "spam@corp2.eu";
$virus_quarantine_to = "virus@corp2.eu";

* де $spam_quarantine_to вказуємо на адресу для перенаправлення СПАМ-листів; $virus_quarantine_to — пошта для листів із виявленими вірусами.

Після перезавантажимо amavis:

systemctl restart amavis

Пробуємо надіслати повідомлення з тестовими сигнатурами на СПАМ та вірус – листи мають бути перенаправлені на вказані адреси.


Антиспам засобами Postfix

У MTA Postfix вбудований механізм перевірки заголовків вхідних повідомлень. Правила розміщуються у 7 секцій, обробка яких виконується в наступному порядку:

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

Щоб краще зрозуміти принцип, ми повинні знати SMTP-команди під час надсилання пошти. І так порядок, наступний:

  1. З’єднання із сервером.
  2. Команда HELO. Привітання, в якому відправник називає своє ім’я, за яким можна перевірити, чи воно відповідає правилам іменування і своїй IP-адресі.
  3. MAIL FROM – вказує адресу відправника. Виконується для sender та relay.
  4. RCPT TO – кому надсилаємо листа.
  5. DATA — команда повідомляє про готовність надіслати лист із заголовками та текстом.
  6. END-OF-DATA — надсилання листа.

Отже, для налаштування антиспаму відкриваємо конфігураційний файл main.cf:

vi /etc/postfix/main.cf

Коментуємо рядок:

#smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination

І додаємо:

smtpd_client_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        reject_unauth_pipelining
        permit

smtpd_helo_restrictions =
        permit

smtpd_sender_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        reject_non_fqdn_sender
        reject_unknown_sender_domain
        permit

smtpd_relay_restrictions =
        permit_mynetworks
        permit_sasl_authenticated
        defer_unauth_destination

smtpd_recipient_restrictions = 
        permit_mynetworks
        permit_sasl_authenticated
        reject_non_fqdn_recipient
        reject_unauth_destination
        reject_unknown_recipient_domain
        reject_unverified_recipient
        permit

smtpd_data_restrictions =
        permit

smtpd_end_of_data_restrictions =
        permit

* де параметри:

  1. smtpd_client_restrictions — Налаштування обмежень під час здійснення клієнтських з’єднань із поштовим сервером.
  2. smtpd_helo_restrictions – обмеження у контексті клієнтської команди HELO.
  3. smtpd_sender_restrictions – обмеження будуть застосовуватися під час виконання клієнтської команди MAIL FROM.
  4. smtpd_relay_restrictions — обмеження надсилання пошти в контексті клієнтської команди RCPT TO.
  5. smtpd_recipient_restrictions – обмеження в контексті клієнтської команди RCPT TO після пересилання (smtpd_relay_restrictions).
  6. smtpd_data_restrictions – обмеження будуть застосовуватися під час виконання команди DATA.
  7. smtpd_end_of_data_restrictions — обмеження для виконання команди END-OF-DATA.

… і значення для них:

  • permit_mynetworks – дозволяє всі адреси, перелічені в налаштуванні mynetworks.
  • permit_sasl_authenticated – дозволяє запити всіх успішно авторизованих клієнтів.
  • reject_unauth_pipelining — забороняє надсилання листів, які надсилаються заздалегідь (пропускаючи правильний ланцюжок сесії SMTP). reject_non_fqdn_sender — відхилити з’єднання, якщо адреса відправника вказана неправильно (відповідно до RFC).
  • reject_unknown_sender_domain — забороняє запит, якщо Postfix не є кінцевим пунктом призначення для адреси відправника, а домен MAIL FROM не має: довжини.
  • reject_non_fqdn_recipient — заборонити з’єднання, якщо адреса одержувача вказана неправильно (відповідно до RFC).
  • reject_unauth_destination — відхилити з’єднання, якщо лист не надсилається згідно з правилом relay_domains або сервер не є адресою призначення. Іншими словами, забороняє використання нашого сервера як Open relay.
  • reject_unknown_recipient_domain — відхилити запит, якщо Postfix не є кінцевим пунктом призначення для домену одержувача, а домен RCPT TO не має 1) DNS-запису MX та DNS-запису A або 2) невірно сформованого MX-запису, такого як запис з ім’ям хоста MX довжини.
  • reject_unverified_recipient — відхилити запит, якщо відомо, що пошта на адресу RCPT TO відхиляється або коли адреса одержувача недоступна.
  • permit – дозволяє з’єднання. Ставимо на кінець кожного блоку обмежень (якщо обмеження не спрацювали, то дозволяємо).

  * це більш менш м’які правила. Їх можна використовувати спочатку, поки тестуємо сервер. Для посилення захисту додаємо:

smtpd_recipient_restrictions =
...
reject_unknown_client_hostname
reject_invalid_helo_hostname
reject_non_fqdn_helo_hostname
reject_unknown_helo_hostname
reject_rbl_client bl.spamcop.net
reject_rbl_client cbl.abuseat.org
reject_rbl_client dul.ru
reject_rbl_client dnsbl.abuse.ch
permit

* де:

  • 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.org/postconf.5.html.

Після внесення всіх правок, необхідне перезавантаження Postfix:

systemctl restart postfix

Навчання антиспаму

Ми встановили amavis, котрий перевіряє пошту на СПАМ засобами spamassassin. Останній без навчання, практично, марний. Синтаксис команди для навчання наступний:

sa-learn --spam <папка с нежелательными письмами>
sa-learn --ham <папка письмами, которые ошибочно определены как СПАМ>

Таким чином, перша команда вкаже spamassassin які листи є небажаними, а друга — не несуть рекламного характеру.

Хорошою практикою буде домовитися з користувачами про ручне розміщення небажаної пошти з СПАМ, що входять до папки. Тоді ми зможемо пройтися скриптом по всіх ящиках на сервері та навчати антиспам. Наприклад, такою командою:

sa-learn --spam /home/mail/dmosk.local/*/{.&BCEEPwQwBDw-,.Spam,.Junk E-mail,.Junk}/cur

* у даному прикладі ми сказали spamassassin знайти в каталогах користувачів папки Спам, Spam, Junk, Junk E-mail (дані каталоги є типовими для приміщення СПАМу) та провести навчання.

Щоб мінімізувати кількість помилкових спрацьовувань, необхідно проводити навчання із ключем –ham. У нашому прикладі ми надсилаємо всі небажані листи на скриньку spam. У такому разі необхідно вручну знаходити помилкові спрацьовування та переносити їх у спеціальну папку, наприклад Ham. Тоді команда для навчання буде такою:

sa-learn --ham /home/mail/dmosk.local/spam@dmosk.local/.Ham/cur

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

sa-learn --dump magic

9. Надсилання пошти назовні

Для надсилання пошти на інші поштові сервери необхідно правильно налаштувати сервер, щоб листи не потрапляли до СПАМу. Щоб це зробити, виконуємо інструкції нижче.


Установки DNS для сервера

Багато поштових серверів роблять запити в систему доменних імен для перевірки легітимності поштового сервера, що надсилає пошту. При налаштуванні MTA дуже важливо правильно додати необхідні записи до DNS.

1. rDNS. Зворотна зона використовується для перевірки відповідності імені сервера у привітанні з ім’ям, яке повертає сервер NS при запиті по PTR-запису.

І так, для створення запису в зворотній зоні, необхідно написати листа Інтернет провайдеру, до мережі якого підключений сервер або хостеру, якщо поштовий сервер налаштований на VPS. IP-адреса нашого сервера повинна вести на ім’я, яким вітається наша postfix — можна подивитися командою:

postconf -n smtpd_banner

Якщо ми отримаємо порожню відповідь, то вводимо:

postconf -n myhostname

Якщо і цей варіант не поверне відповідь, вводимо:

hostname

2. А-запис. Також необхідно, щоб ім’я сервера, яким представляється поштовий сервер, дозволялося в IP-адресу.

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


Установки DNS для домену

Для кожного домену, для якого надсилатимемо пошту створюємо записи:

  1. SPF.
  2. DMARC.
  3. DKIM

Для перевірки коректності налаштування сервера скористаємося ресурсами:

https://www.mail-tester.com
https://spamtest.smtp.bz

10. Налаштування DKIM

Підпис листів не є обов’язковим, але допомагає не потрапляти до СПАМу. DKIM налаштовується для кожного домену, а також має створюватися спеціальний запис DNS. Розглянемо створення та налаштування DKIM в amavisd.

Створюємо каталог для зберігання ключів:

mkdir -p /var/lib/dkim

Генеруємо послідовність для нашого домену:

amavisd-new genrsa /var/lib/dkim/corp2.eu.pem 1024

* де corp2.eu – домен, для якого ми згенеруємо підпис dkim.

Задаємо права на створений файл:

chown amavis:amavis /var/lib/dkim/*.pem
chmod 0400 /var/lib/dkim/*.pem

Відкриваємо конфігураційний файл amavisd:

vi /etc/amavis/conf.d/20-debian_defaults

Редагуємо запис:

#$inet_socket_port = 10024;
$inet_socket_port = [10024,10026];

* у цьому прикладі ми закоментували перший рядок і розкоментували другий. Це вкаже amavis, що він повинен запускатися та працювати на двох портах.

А також додамо:

$forward_method = `smtp:[127.0.0.1]:10025`;
$notify_method = $forward_method;
$interface_policy{`10026`} = `ORIGINATING`;
$policy_bank{`ORIGINATING`} = {
    originating => 1,
    smtpd_discard_ehlo_keywords => [`8BITMIME`],
    os_fingerprint_method => undef,
    bypass_banned_checks_maps => [1],
    bypass_header_checks_maps => [1],
    bypass_banned_checks_maps => [1],
    virus_admin_maps => ["virusalert@$mydomain"],
};

Відкриваємо файл:

vi /etc/amavis/conf.d/50-user

Додаємо записи:

$enable_dkim_verification = 1;
$enable_dkim_signing = 1;

dkim_key(`corp2.eu`, "dkim", "/var/lib/dkim/corp2.eu.pem");

@dkim_signature_options_bysender_maps = ( {
   "corp2.eu" => { d => "corp2.eu", a => `rsa-sha256`, ttl => 10*24*3600 },
});

* де corp2.eu – домен, для якого ми налаштовуємо dkim; /var/lib/dkim/corp2.eu.pem – шлях до згенерованого файлу з послідовністю.

Перезапускаємо amavis:

systemctl restart amavis

Подивитися послідовність DKIM для нового домену можна командою:

amavisd-new showkeys

Ми повинні побачити щось на кшталт:

; key#1 1024 bits, i=dkim, d=corp2.eu, /var/lib/dkim/corp2.eu.pem
dkim._domainkey.corp2.eu.        3600 TXT (
  "v=DKIM1; p="
  "MIGfMA0SDFqGSIb3DQEBAQUAA4GNADCBiQKBgQC44iOK+99mYBxsnIl1Co8n/Oeg"
  "4+x90sxqWzoGW42d/GCP4wiYqVqncc37a2S5Berv0OdoCGcmkDkKWh4CHhFD4blk"
  "x6eMYXsp1unAdo2mk/OVK7M2ApraIkh1jVbGBZrREVZYTE+uPOwtAbXEeRLG/Vz5"
  "zyQuIpwY2Nx3IgEMgwIDAQAB")

Тепер нам потрібно на основі цього висновку створити DNS запис TXT. У цьому прикладі, потрібно створити запис з іменем dkim._domainkey в зоні corp2.eu і значенням “v=DKIM1; p=MIGfMA0SD…wIDAQAB”.

Перевірити коректність налаштування DKIM можна за допомогою команди:

amavisd-new testkeys

Переходимо до налаштування Postfix. Ми повинні додати відправку всіх вихідних листів на перевірку в amavis на порт 10026 та приймати назад листи на порт 10027.

Відкриваємо файл:

vi /etc/postfix/master.cf

Відредагуємо submission та smtps, додавши content_filter:

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=scan:[127.0.0.1]:10026
  ...

submission   inet  n  -  n  -  -  smtpd
  -o content_filter=scan:[127.0.0.1]:10026
  ...

smtps   inet  n  -  n  -  -  smtpd
  -o content_filter=scan:[127.0.0.1]:10026
  ...

І додамо:

127.0.0.1:10027   inet  n  -  n  -  16  smtpd
  -o content_filter=
  -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks_style=host
  -o smtpd_authorized_xforward_hosts=127.0.0.0/8

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

systemctl restart postfix

Налаштовуємо Roundcube:

vi /var/www/html/webmail/config/config.inc.php

Знаходимо рядки:

$config[`smtp_server`] = ``;
...
$config[`smtp_port`] = 25;

… і міняємо її на:

$config[`smtp_server`] = `tls://localhost`;
...
$config[`smtp_port`] = 587;

* у цьому прикладі ми вказали, що з’єднання для надсилання пошти має бути захищеним. Це важливо для нашої установки DKIM.

Пробуємо надіслати листа — у заголовках ми маємо побачити:

dkim=pass header.d=corp2.eu

11. Налаштування квот

У PostfixAdmin у нас є можливість задати квоти на поштові скриньки, але вони не працюватимуть, оскільки про них нічого не знає Dovecot.

Процес налаштування не складний та описаний окремо у статті Налаштування квот у Dovecot + PostfixAdmin.

Після застосування квот ми зможемо спостерігати в поштовому клієнті Roundcube інформацію про дисковий простір, що залишився:

… або у Webmail Lite:

12. Автоматичне налаштування поштових клієнтів

Для автоматичного конфігурування поштових клієнтів потрібно настроїти сервіс autodiscover. Для цього налаштовуємо веб-сервер, який повертатиме поштові налаштування для домену.

Докладніше про процес налаштування описано у статті Налаштування Autodiscover для свого поштового сервера.

13. Папки російською в Outlook

За замовчуванням, всі поштові клієнти, крім Outlook, розпізнають службові папки IMAP:

  • Drafts – чернетки.
  • Junk – СПАМ.
  • Sent – надіслані.
  • Trash – віддалені.

Дані каталоги перекладаються російською мовою та коректно відображаються в клієнті. В Outlook ці папки відображаються як є англійською мовою.

Для вирішення проблеми ми маємо відкрити файл:

vi /etc/dovecot/conf.d/15-mailboxes.conf

Знайти блок налаштувань namespace inbox. Для кожного зі службового каталогу налаштувати таке:

namespace inbox {
  ...
  mailbox Чернетки {
    auto = subscribe
    special_use = Drafts
  }
  mailbox Drafts {
    auto = no
    special_use = Drafts
  }

  mailbox Спам {
    auto = subscribe
    special_use = Junk
  }
  mailbox Junk {
    auto = no
    special_use = Junk
  }
  mailbox Spam {
    auto = no
    special_use = Junk
  }
  mailbox "Junk E-mail" {
    auto = no
    special_use = Junk
  }

  mailbox Видалені {
    auto = subscribe
    special_use = Trash
  }
  mailbox Trash {
    auto = no
    special_use = Trash
  }
  mailbox "Deleted Messages" {
    auto = no
    special_use = Trash
  }

  mailbox Надіслані {
    auto = subscribe
    special_use = Sent
  }
  mailbox Sent {
    auto = no
    special_use = Sent
  }
  mailbox "Sent Messages" {
    auto = no
    special_use = Sent
  }
  mailbox "Sent Items" {
    auto = no
    special_use = Sent
  }
  ..
} 

* і так, ми задали кілька варіантів службових каталогів:

  • Чернетки — на сервері можуть бути папки Чернетки та Drafts. За замовчуванням відображається та створюється Чернетки.
  • Спам – на сервері Спам, Junk, Spam, Junk E-mail.
  • Видалені — на сервері Видалені, Trash, Deleted Messages.
  • Надіслані — на сервері Надіслані, Sent, Sent Messages, Sent Items.

Для застосування налаштувань перезапускаємо dovecot:

systemctl restart dovecot

14. Різне

Розглянемо додаткові параметри для нашого сервера.

Налаштування обмежень

Також важливо налаштувати деякі обмеження, наприклад:

максимальний розмір вкладення.

кількість повідомлень, яку можна надіслати за певний період часу.

налаштування черги (час зберігання листів).

таймаути відправлення.

Докладніше, інформацію можна знайти у статті Ліміти у Postfix.

Зміна email адреси

Припустимо, ми зробили помилку в написанні адреси електронної пошти, але не хочемо видаляти обліковий запис та створювати його за новою. Розглянемо зміну email-адреси з прикладу sekretar@corp2.eu -> secretar@corp2.eu.

Нам потрібно внести зміни до бази даних — для цього заходимо в оболонку sql:

mysql -uroot -p

Вводимо пароль, який створювали після встановлення СУБД.

Використовуємо базу postfix:

> use postfix

Редагуємо аліаси командою:

> UPDATE alias SET `address`=`secretar@corp2.eu`, `goto`=REPLACE(`goto`, `sekretar@corp2.eu`, `secretar@corp2.eu`) WHERE `address`=`sekretar@corp2.eu`;

Редагуємо поштову скриньку:

> UPDATE mailbox SET `username`=`secretar@corp2.eu`, `local_part`=`secretar`, `maildir`=REPLACE(`maildir`, `/sekretar/`, `/secretar/`) WHERE `username`=`sekretar@corp2.eu`;

І квоту:

> UPDATE quota2 SET `username`=`secretar@corp2.eu` WHERE `username`=`sekretar@corp2.eu`;

З базою даних закінчили – виходимо з SQL:

> quit

Переходимо в каталог із поштовими скриньками користувачів для нашого домену:

cd /home/mail/corp2.eu/

Переміщуємо папку з поштою старої скриньки до нової:

mv sekretar@corp2.eu secretar@corp2.eu

Перевіряємо роботу через веб-інтерфейс. Якщо використовуємо поштового клієнта, змінюємо налаштування для використання нової email-адреси.

15. Можливі проблеми

Не підключатися до сервера IMAP в Outlook на старих системах Windows

При спробі підключення до сервера ми можемо побачити помилку «Неможливо встановити безпечне з’єднання з сервером IMAP».

Причина: у старих системах використовується за замовчуванням TLS 1.0, підтримка якого відсутня.

Рішення: необхідно виконати 3 дії.

1. Встановлюємо оновлення KB3140245.

2. Створюємо дві гілки реєстру:

  • HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.1Client
  • HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.2Client

Це можна виконати вручну в утиліті regedit або ввести команди:

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.1Client"
reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.2Client"

У створених гілках створюємо параметр DisabledByDefault з типом DWORD (32 біти) та значенням 0. Це можна виконати командами:

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.1Client" /v DisabledByDefault /t REG_DWORD /d 0
reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSchannelProtocolsTLS 1.2Client" /v DisabledByDefault /t REG_DWORD /d 0

3. Перезавантажуємо комп’ютер.

Що таке SPF-запис

спеціальний TXT-запис у DNS, в якому зазначено з яких поштових серверів може бути надіслано пошту для домену. З її допомогою можна знизити загальну кількість СПАМу, зменшити ймовірність того, що домен буде скомпрометований та захиститись від СПАМу, який використовує поле зворотної адреси. Розшифровується як Sender Policy Framework чи інфраструктура політики відправника.

Синтаксис SPF-запису приблизно такий:

corp2.eu. IN TXT "v=spf1 +a +mx -all"

* де corp2.eu – домен, для якого налаштовується запис; v = spf1 – покажчик на те, що цей TXT-запис є SPF версії 1; a дозволяє або забороняє відправлення від IP-адреси, якій відповідає А-запис самого домену (у даному прикладі corp2.eu); mx дозволяє чи ні відправлення від IP-адрес записів MX для нашого домену; -all забороняє надсилання листів для всіх, хто не пройшов перевірку (якщо записати ~all дозволяти надсилання чи ні буде на вибір поштової системи). знак «+» дозволяє (може бути втрачений під час запису); знак “-” вказує на заборону.

Ще один приклад запису:

corp.eu. IN TXT "v=spf1 ip4:193.93.93.93 include:_spf.mailsystem.net ~all"

* тут ми прямо вказали IP-адресу, з якої можна надсилати пошту (ip4), а також все, що включено до запису _spf.mailsystem.net.

Також можна додавати підмережі:

corp2.eu. IN TXT "v=spf1 ip4:93.93.93.0/24 ~all"

А ось приклад з IPv6:

corp2.eu. IN TXT "v=spf1 ip6:2a01:233:2::111 ~all"

І конструкція з перенапрямком (Redirect):

corp2.eu. IN TXT "v=spf1 redirect=_spf.mailsystem.net"

* у цьому прикладі, ми використовуємо чужі налаштування, перенаправивши запити на _spf.mailsystem.net.

Перевірити правильність установки просто – потрібно надіслати повідомлення собі на пошту mail.ru, yandex.ru або gmail.com. Відкрити лист та подивитися заголовки: якщо бачимо Received-SPF: pass — SPF налаштована правильно.

SPF-запис не є єдиним засобом, що підтверджує легітимність поштового домену. Читайте також про DKIM і PTR, щоб мати уявлення про додаткові способи захисту доменів.

Що таке DMARC

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

Працює це так: лист перевіряється за SPF та DKIM. Якщо воно не проходить за одним із критеріїв перевірки, застосовується політика DMARC.

Схема роботи DMARC від Mail RU Group

Приклад простої політики DMARC наступний:

_dmarc.corp2.eu. 3600 IN TXT "v=DMARC1; p=quarantine; sp=none; pct=100; fo=0; rua=mailto:postmaster@corp2.eu"
  • _dmarc.corp.eu – dmarc запис для домену corp2.eu.
  • v=DMARC1 йде як позначення, що запис txt відноситься до DMARC.
  • p – політика на домен. Приймаються такі варіанти: none – нічого не робити; quarantine – надіслати листа до СПАМу; reject – відкинути листа.
  • sp – політика на субдомени домену. Має такі самі значення, як і p.
  • pct – який відсоток повідомлень піде під правила.
  • fo — у яких випадках надсилати звіт. 0 – завжди якщо не пройдено жодного критерію перевірки; 1 – якщо не пройдено хоча б один критерій; d – не пройдено перевірку DKIM; s – не пройдено SPF.
  • rua – поштова адреса для звітів.

Оскільки налаштування виконується лише на сервері NS, немає значення, для якого поштового сервера її налаштовувати. DMARC працює для Postfix, Exim, Exchange та багатьох інших поштових систем. Безкоштовні поштові сервіси від Mail RU Group, Яндекс, Google і так далі підтримують політики DMARC, обробляючи повідомлення відповідно до настройок.

Докладніша інструкція щодо роботи з DMARC на datatracker.ietf.org. Для перевірки правильності налаштування політики можна скористатися сторонніми сервісами, наприклад, mxtoolbox.com.

Налаштування квот у Dovecot + PostfixAdmin

При установці поштового сервера на базі Postfix + Dovecot та використанні панелі керування поштовими скриньками PostfixAdmin, за замовчуванням, квотування не налаштоване – його можна задавати в останній, але квоти працювати не будуть. Потрібне додаткове налаштування…

Налаштовуємо квоти у Dovecot

Перевіряємо, що квоти працюють

Надсилаємо повідомлення користувачам

Налаштування Dovecot

Відкриваємо конфігураційний файл10-mail.conf:

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

Знаходимо рядок з mail_plugins і наводимо його до вигляду:

...
mail_plugins = $mail_plugins quota
...

* Цей рядок підключає до плагінів додатково плагін для управління квотами (quota). Якщо опція закоментована, знімаємо коментар.

Відкриваємо конфігураційний файл 20-imap.conf:

vi /etc/dovecot/conf.d/20-imap.conf

* Опція mail_plugins може бути коментована. Якщо це так, то коментар знімаємо.

Відкриваємо конфігураційний файл 10-master.conf:

vi /etc/dovecot/conf.d/10-master.conf

Знаходимо опцію service dict, в ній unix_listener dict і наводимо її до вигляду:

service dict {
    unix_listener dict {
    mode = 0660
    user = vmail
    group = vmail
  }
} 

Відкриваємо файл 90-quota.conf:

vi /etc/dovecot/conf.d/90-quota.conf

Додаємо:

plugin {
  quota = dict:User quota::proxy::quota
} 

* або знімаємо коментар з відповідного рядка quota = dict:User quota::proxy::quota.

Відкриваємо основний конфігураційний файл для dovecot:

vi /etc/dovecot/dovecot.conf

Знаходимо розділ dict і знімаємо коментар або додаємо:

dict {
  quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
} 

Тепер створюємо файл для налаштування вивантаження квот:

vi /etc/dovecot/dovecot-dict-sql.conf.ext

connect = host=localhost dbname=postfix user=postfix password=postfix123
map {
  pattern = priv/quota/storage
  table = quota2
  username_field = username
  value_field = bytes
}
map {
  pattern = priv/quota/messages
  table = quota2
  username_field = username
  value_field = messages
} 

* де host – сервер mysql, до якого будемо підключатися; dbname – ім’я бази даних, у якій знаходяться користувачі postfix; user – користувач, під яким ми підключаємось до бази; password – пароль для підключення до бази. У цьому прикладі ми підключимося до СУБД, яка знаходиться на тому ж сервері (localhost) до бази postfix під користувачем postfix з паролем postfix123.

Відкриємо наш файл, в якому ми описуємо налаштування вибірки даних з користувачів з бази даних:

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

Знаходимо запит user_query і дописуємо в SELECT CONCAT(‘*:bytes=’, quota) AS quota_rule – у мене вийшло:

user_query = SELECT CONCAT(`/home/mail/`,LCASE(`domain`),`/`,LCASE(`maildir`)), 1024 AS uid, 1024 AS gid, CONCAT(`*:bytes=`, quota) AS quota_rule FROM mailbox WHERE username = `%u`

* якщо в файлі запитів є кілька рядків user_query, то необхідно дописати запит для останньої.

Перевіряємо конфігураційний файл dovecot:

doveconf

… і якщо команда не поверне помилку, перезапускаємо його:

systemctl restart dovecot

Перевірка роботи квот


Для початку в командному рядку вводимо:

doveadm quota get -u user@domain.net

user@domain.net – поштовий користувач, для якого потрібно показати квоту.

Ця команда відображає квоту для користувача, наприклад:

Quota name Type    Value Limit                %
User quota STORAGE  16420  50000               32
User quota MESSAGE    14     -                0

* У цьому прикладі поштова скринька займає близько 16 Мб, а квота близько 50 Мб – скриньку заповнений на 32%.

Тепер відкриваємо PostfixAdmin – заходимо в налаштування поштової скриньки та ставимо невеликий ліміт, наприклад, у 5 Мб:

Тепер обсяг ящика перевищує ліміт:

Тепер обсяг ящика перевищує ліміт:

Quota name Type    Value Limit                %
User quota STORAGE  16420  5000               328
User quota MESSAGE    14     -                0

* Обсяг перевищений, майже, втричі.

Деякі поштові клієнти покажуть перевищення ліміту, наприклад Thunderbird:

Оповіщення при перевищенні квоти


Відкриваємо конфігураційний файл 90-quota.conf:

vi /etc/dovecot/conf.d/90-quota.conf
plugin {
  quota_warning = storage=95%% quota-warning 95 %u
  quota_warning2 = storage=80%% quota-warning 80 %u
} 

* У цьому прикладі ми вказуємо на необхідність робити 2 попередження – перше при досягненні обсягу ящика в 80%, друге – 95%. Сервіс dovecot, який це забезпечуватиме, називається quota-warning.

Тепер знаходимо розділ service quota-warning і наводимо його до вигляду:

service quota-warning {
  executable = script /usr/local/bin/quota-warning.sh
  user = dovecot
  unix_listener quota-warning {
    user = vmail
  }
} 

* ми створили сервіс quota-warning, який запускатиме прихований /usr/local/bin/quota-warning.sh.

Створюємо сам скрипт quota-warning.sh:

vi /usr/local/bin/quota-warning.sh

cat << EOF | /usr/libexec/dovecot/dovecot-lda -d $2 -o "plugin/quota=maildir:User quota:noenforcing"
Content-Type: text/html; charset=utf-8
From: Администратор почты 
Subject: Предупреждение о превышении квоты на почтовый ящик
X-Priority: 2

Размер Вашего почтового ящика составляет $1% от установленного ограничения. Чтобы уменьшить его размер Вы можете удалить большие письма с вложениями, старые письма или почистить корзину.

EOF

* де postmaster@corp2.eu – адміністративний поштовий ящик. Сам текст повідомлення можна перетворити, щоб воно було більш презентабельним.

Задаємо права на виконання скрипту:

chmod +x /usr/local/bin/quota-warning.sh

Перевіряємо, що нам надходять повідомлення, запустивши скрипт:

/usr/local/bin/quota-warning.sh 80 user@domain.net

* де user@domain.net — наша поштова скринька, на яку має відправитися повідомлення.

Перезапускаємо службу dovecot:

systemctl restart dovecot

Налаштування Autodiscover для свого поштового сервера

Розберемо процес створення інфраструктури для автоматичного настроювання поштових клієнтів. Для коректної роботи Autodiscover потрібен комплексний підхід, оскільки різні поштові клієнти мають свої вимоги.

Для MS Outlook

Для Mozilla Thunderbird

Через SRV DNS

1. Microsoft Outlook

Для автоматичного налаштування поштового клієнта йде https POST-запит до документа autodiscover.xml. При цьому, Outlook спочатку спробує знайти сервер запису в DNS autodiscover.server.domain, потім просто до домену server.domain і потім – до SRV-запису _autodiscover._tcp.server.domain. Таким чином, необхідно настроїти DNS та веб-сервер.

DNS

З DNS все просто – створюємо А-(або CNAME-) та SRV-записи. Приклад таких записів у bind:

autodiscover    IN      A       111.111.111.111

* де 111.111.111.111 — IP-адреса на наш веб-сервер, який повертатиме документ XML.

_autodiscover._tcp      IN SRV 0 0 443 autodiscover.corp2.eu.

* де autodiscover.corp2.eu – наш запис autodiscover в домені corp2.eu.

Веб-сервер

Як приклад, налаштування виконаємо на веб-сервері NGINX, який працює на Linux. Якщо він не встановлений, виконуємо інсталяцію.

а) якщо сервер під CentOS/Red Hat:

yum install epel-release

yum install nginx

б) якщо сервер під Debian/Ubuntu:

apt-get install nginx

Після дозволяємо автозапуск і стартуємо сервіс:

systemctl enable nginx
systemctl start nginx

Потім створюємо віртуальний домен:

vi /etc/nginx/conf.d/autodiscover.conf

server {
    listen       443;
    server_name  autodiscover.corp2.eu;
    root /usr/share/nginx/html/autodiscover;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/corp2.eu/cert.pem;
    ssl_certificate_key /etc/letsencrypt/live/corp2.eu/privkey.pem;

    error_page  405     =200 $uri;
} 

* дане налаштування дозволить нашому серверу nginx приймати запити на 443 порту (https); як домашня директорія ми будемо використовувати каталог /usr/share/nginx/html/autodiscover, куди і помістимо потрібний нам XML; /etc/letsencrypt/live/corp2.eu/cert.pem та /etc/letsencrypt/live/corp2.eu/privkey.pem — шляхи до сертифікатів (у даному прикладі я використав сертифікати від Let’s encrypt — щоб їх отримати, читайте статтю Отримання безкоштовного SSL-сертифіката Let’s Encrypt). Оскільки NGINX забороняє POST-запити до статичних файлів, повертаючи помилку 405, ми її ігноруватимемо, замінюючи кодом 200.

Перевіряємо коректність налаштування:

nginx -t

Якщо помилок немає, перечитуємо конфіг:

systemctl reload nginx

Створюємо каталог, у якому буде наш XML:

mkdir -p /usr/share/nginx/html/autodiscover/autodiscover

Створимо сам XML:

vi /usr/share/nginx/html/autodiscover/autodiscover/autodiscover.xml

#k2-1#?xml version="1.0" encoding="UTF-8"#k2-2#?

    
        
            corp2.eu
        
        
            email
            settings
            
                IMAP
                imap.corp2.eu
                993
                info@corp2.eu
                on
                on
                on
                on
                SSL
            
            
                POP
                pop.corp2.eu
                995
                info@corp2.eu
                on
                on
                on
                on
                SSL
            
            
                SMTP
                smtp.corp2.eu
                587
                info@corp2.eu
                on
                on
                on
                on
                TLS
            
        
    

* де з основних параметрів на потрібні:

  • Type — тип протоколу, використовуючи який ми будемо підключатися до поштової системи.
  • Server – сервер для підключення. Для кожного типу протоколу може бути заданий свій сервер або той самий.
  • Port – порт, на якому слухає сервіс. Як правило, для
    • IMAP: 143, 993.
    • POP: 110, 995.
    • SMTP: 25, 465, 587.
  • LoginName — це логін, який використовується для авторизації. Зазвичай відповідає адресі електронної пошти.
  • AuthRequired — вимога автентифікації користувача для підключення до сервісу.
  • DomainRequired – вимога використання домену для логіну авторизації. Необхідно, якщо сервер обслуговує мультидоменну систему.
  • SPA – безпечна перевірка пароля.
  • SSL — Використання SSL. Для портів 465, 993, 995.
  • Encryption – тип шифрування: SSL або TLS.

Відкриваємо браузер і переходимо за адресою https://autodiscover.corp2.eu/autodiscover/autodiscover.xml, де замість corp2.eu має бути Ваш домен. Ми маємо побачити наш XML.

Тепер відкриваємо MS Outlook та отримуємо автоматично налаштування для info@corp2.eu.

Всі адреси

Наш конфігураційний файл розрахований лише на налаштування однієї адреси. Тепер потрібно налаштувати його обслуговування будь-якого email. Для цього необхідно написати скрипт, наприклад, на php і трохи доналаштувати сервер.

PHP та php-fpm

Встановимо php і php-fpm, потім дозволяємо автозапуск php-fpm і стартуємо його:

а) якщо сервер під CentOS/Red Hat:

yum install php php-fpm

systemctl enable php-fpm

systemctl start php-fpm

б) якщо сервер під Debian/Ubuntu:

apt-get install php php-fpm

systemctl enable php7.2-fpm

systemctl start php7.2-fpm

* де 7.2 – версія встановленої php (перевіряється командою php -v).

Налаштуємо php-fpm

а) якщо сервер під CentOS/Red Hat:

vi /etc/php-fpm.d/www.conf

...
listen = /var/run/php-fpm/php-fpm.sock
...

systemctl restart php-fpm

б) якщо сервер під Debian/Ubuntu:

vi /etc/php/7.2/fpm/pool.d/www.conf

...
listen = /var/run/php-fpm/php-fpm.sock
...

systemctl restart php7.2-fpm

NGINX

Внесемо налаштування до нашого віртуального домену:

vi /etc/nginx/conf.d/autodiscover.conf

...
    error_page  405     =200 $uri;

    location ~ .php$ {
        set $root_path /usr/share/nginx/html/autodiscover;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_param DOCUMENT_ROOT $root_path;
    }
...

* ми додали обробку скриптів php за допомогою php-fpm.

Перезапускаємо наш сервер:

systemctl reload nginx

Готуємо скрипт
Створимо скрипт php:

vi /usr/share/nginx/html/autodiscover/autodiscover/autodiscover.php

#k2-1#?php
//get raw POST data so we can extract the email address
$data = file_get_contents("php://input");
preg_match("/(.*?)/", $data, $matches);

//set Content-Type
header("Content-Type: application/xml");
#k2-2#?
#k2-1#?php echo `#k2-1#?xml version="1.0" encoding="utf-8" #k2-2#?`; #k2-2#?

    
        
            email
            settings
            
                IMAP
                imap.corp2.eu
                993
                #k2-1#?php echo $matches[1]; #k2-2#?
                on
                on
                on
                on
                SSL
            
            
                POP3
                imap.corp2.eu
                995
                #k2-1#?php echo $matches[1]; #k2-2#?
                on
                on
                on
                on
                SSL
            
            
                SMTP
                imap.corp2.eu
                587
                #k2-1#?php echo $matches[1]; #k2-2#?
                on
                on
                on
                on
                on
                TLS
            
        
    

Відкриваємо браузер і переходимо на адресу https://autodiscover.corp2.eu/autodiscover/autodiscover.php — повинен завантажитися XML-документ. У тегах LoginName має бути порожнім.

Переадресація з xml на php

Тепер налаштуємо, щоб наш веб-сервер перекладав запити xml на скрипт php. Відкриваємо налаштування нашого віртуального домену:

vi /etc/nginx/conf.d/autodiscover.conf

… і додамо:

...
    location = /autodiscover/autodiscover.xml {
        rewrite ^/autodiscover/autodiscover.xml$ /autodiscover/autodiscover.php;
    }
...

Перезапускаємо nginx:

systemctl reload nginx

Відкриваємо браузер і переходимо на адресу https://autodiscover.dmosk.ru/autodiscover/autodiscover.xml – повинен завантажитися XML-документ. У тегах LoginName має бути порожнім. Значить, перенапрямок спрацював.

Тепер можна відкривати Outlook та перевіряти автонастройку для інших поштових скриньок.

2. Mozilla Thunderbird

Механізм автоналаштування від Mozilla схожий на Microsoft. Необхідні налаштування повинні бути надані веб-сервером у вигляді XML-документа. Однак запит не є https, а http; і не POST, а GET. Також звернення йде спочатку у форматі server.domain/mail/config-v1.1.xml?emailaddress=user@server.domain, і якщо відповіді не буде отримано — autoconfig.server.domain/mail/config-v1.1.xml ?emailaddress=user@server.domain.

Також, як із Outlook, необхідно налаштувати DNS та веб-сервер.

DNS

створюємо А-запис (або CNAME). Приклад bind:

autoconfig    IN      A       111.111.111.111

* де 111.111.111.111 — IP-адреса на наш веб-сервер, який повертатиме документ XML.

Веб-сервер

Настроюючи autodiscovery для Microsoft, ми вже налаштували веб-сервер NGINX. Тепер потрібно додати віртуальний домен та створити відповідний документ.

Відкриємо вже створений файл конфігурації:

vi /etc/nginx/conf.d/autodiscover.conf

… і додамо до нього:

...

server {
    listen       80;
    server_name  autoconfig.corp2.eu;
    root /usr/share/nginx/html/autodiscover;
} 

Створюємо каталог для зберігання XML:

mkdir -p /usr/share/nginx/html/autodiscover/mail

Створюємо документ:

vi /usr/share/nginx/html/autodiscover/mail/config-v1.1.xml

#k2-1#?xml version="1.0" encoding="UTF-8"#k2-2#?

        
                corp2.eu
                Почта corp2.eu
                corp2.eu
                
                        imap.corp2.eu
                        143
                        STARTTLS
                        password-cleartext
                        %EMAILADDRESS%
                
                
                        pop.corp2.eu
                        995
                        SSL
                        password-cleartext
                        %EMAILADDRESS%
                
                
                        smtp.corp2.eu
                        587
                        STARTTLS
                        password-cleartext
                        %EMAILADDRESS%
                
        

* де:

  • hostname – ім’я сервера для підключення. Для кожного типу протоколу може бути заданий свій сервер або той самий.
  • port — порт, у якому слухає сервіс. Як правило, для
    • IMAP: 143, 993.
    • POP: 110, 995.
    • SMTP: 25, 465, 587.
  • socketType – спосіб обміну даними. Можливі варіанти:
    • plain – без шифрування.
    • SSL – SSL або TLS шифрування на окремому порту (465, 993, 995).
    • STARTTLS – TLS шифрування через STARTTLS на звичайному порту.
  • authentication – метод аутентифікації.
  • username – логін для входу. Приймається змінна %EMAILADDRESS%, яка підставляється із запиту, який робить поштовий клієнт.

3. DNS SRV

Це спосіб, покликаний бути універсальним. Понад те, він описаний стандартом RFC.

Суть полягає у створенні SRV-записів у DNS. Цей запис створюється за наступним синтаксисом:

_<ім`я служби>._<протокол> <пріоритет> <вага> <порт> <хост>

* де:

  • <ім’я служби> – ім’я сервісу (наприклад, imap).
  • <протокол> – мережевий протокол (TCP, UDP, TLS).
  • <Пріоритет> – порядок, в якому йде облік рядка.
  • <вага> – якщо пріоритети збігаються у служб, порядок визначається за їхньою вагою.
  • <порт> — це порт, на якому слухає служба.
  • <хост> — ім’я сервера, на який записуватиметься.

Приклад записів для налаштування пошти:

Запис Пріоритет Вага Порт Хост Опис
_smtp._tcp 10 10 25 smtp.corp2.eu. Протокол для надсилання пошти на інші сервери.
_pop3._tcp 10 10 110 pop.corp2.eu. Завантаження пошти із сервера.
_imap._tcp 10 10 143 imap.corp2.eu. Робота з поштою на віддаленому сервері.
_smtps._tcp 30 10 465 smtp.corp2.eu. Надсилання пошти із захистом з’єднання.
_submission._tcp 20 10 587 smtp.corp2.eu. Надсилання пошти із захистом з’єднання.
_imaps._tcp 20 10 993 imap.corp2.eu. Робота з поштою із захистом з’єднання.
_pop3s._tcp 20 10 995 pop.corp2.eu. Завантаження пошти із захистом з’єднання.

* у цьому прикладі ми віддаємо пріоритет більш захищеним засобам підключення (smtps, imaps, pop3s).

Приклад записів у DNS Bind:

_smtp._tcp              IN SRV  10 0 25  smtp.corp2.eu.
_pop3._tcp              IN SRV  20 0 110 pop.corp2.eu.
_imap._tcp              IN SRV  10 0 143 imap.corp2.eu.
_smtps._tcp             IN SRV   0 0 465 smtp.corp2.eu.
_submission._tcp        IN SRV   0 0 587 smtp.corp2.eu.
_imaps._tcp             IN SRV   0 0 993 imap.corp2.eu.
_pop3s._tcp             IN SRV  10 0 995 pop.corp2.eu.

Генерація сертифіката за допомогою Let’s Encrypt

Встановлюємо програму для генерації сертифікатів:

sudo apt-get install certbot

Генеруємо сертифікат за допомогою перевірки через DNS:

sudo certbot -d test121.duckdns.org --manual --preferred-challenges dns certonly

У процесі потрібно ввести Y та натиснути Enter:

Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Obtaining a new certificate Performing the following challenges: dns-01 challenge for test121.duckdns.org - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NOTE: The IP of this machine will be publicly logged as having requested this certificate. If you`re running certbot in manual mode on a machine that is not your server, please ensure you`re okay with that. Are you OK with your IP being logged? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y

Далі ми побачимо рядок/значення ресурсного запису типу TXT, яку нам потрібно буде вказати в DNS:

VHaDQNmoNVAgFFhkf34oQTCEsgp_m6WO44oygWpoSFY
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Please deploy a DNS TXT record under the name _acme-challenge.test121.duckdns.org 
with the following value: VHaDQNmoNVAgFFhkf34oQTCEsgp_m6WO44oygWpoSFY Before continuing, 
verify the record is deployed. 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
Press Enter to Continue  

Потрібно в DNS налаштуваннях відмітити код та назву домену.

_acme-challenge.test121.duckdns.org     TXT      VHaDQNmoNVAgFFhkf34oQTCEsgp_m6WO44oygWpoSFY

Після того, як налаштуєте DNS, натисніть ENTER і запуститься генерація сертифіката.

Після цього можна в налаштуваннях пошти використовувати даний сертифікат.

Де вказувати SSL сертифікати можете прочитати вище в цій статті.

Автор: Рудюк С.А. 2023. K2 Cloud ERP.