Використовувані терміни: Postfix, POP3, SMTP, IMAP, MariaDB, Ubuntu, PostfixAdmin, Dovecot, Roundcube
У цій інструкції налаштовано повноцінний поштовий сервер на Linux Ubuntu Server (протестовано на версії 20.04). Список усіх особливостей та можливостей:
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
* де ми відкриємо такі порти:
Для збереження правил встановимо пакет:
apt-get install iptables-persistent
І виконуємо команду:
netfilter-persistent save
Система керування PostfixAdmin працює як веб-додаток, розроблений на PHP, а інформацію зберігає у базі даних. У нашому прикладі використовуватиметься веб-сервер на NGINX, а база даних — MariaDB.
Установка NGINX
Встановлюємо nginx командою:
apt-get install nginx
Дозволяємо автозапуск сервісу:
systemctl enable nginx
Перевіряємо працездатність веб-сервера, звернувшись до нього у браузері за адресою http://
Встановлюємо 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#?
Встановлюємо сервер баз даних наступною командою:
apt-get install mariadb-server
Включаем автозапуск сервиса баз данных:
systemctl enable mariadb
Задаємо пароль для користувача sql root:
mysqladmin -u root password
Встановлюємо додаткові компоненти для 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://
Задаємо двічі пароль установки і генеруємо хеш, клацнувши 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.
Якщо в процесі встановлення система виведе помилки, необхідно самостійно розібратися з ними. Як правило, вони можуть зводитись до відсутності необхідних пакетів, яких може не опинитися в системі за промовчанням.
Після встановлення в нижній частині сторінки має бути форма додавання суперкористувача – вводимо дані:
* де Setup password – пароль, який ми ввели на попередній сторінці; Адмін — обліковий запис для входу до панелі керування PostfixAdmin; Пароль — новий пароль для облікового запису, що створюється.
Встановлення завершено. Переходимо в браузері на сторінку http://
Вводимо логін та пароль для створеного користувача. Ми повинні увійти до 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://
Створюємо свого користувача. Після чого можна видалити те, що створили через командний рядок.
Установка 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
* де:
Якщо ім’я сервера відрізняється від імені, за яким сервер буде зареєстровано в 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:
* Після команди йдуть аргументи її запуску. Вони можуть перевизначати параметри, задані main.cf. Кожен аргумент записується з нового рядка і починається з двох прогалин. У цьому прикладі ми використовуємо такі аргументи:
Генеруємо сертифікати безпеки. Для цього створюємо каталог, в якому їх розмістимо:
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
Встановлюємо 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://
Вводимо логін та пароль від адміністративного облікового запису, який ми створили на кроці 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) потрібен правильний сертифікат (для нашого домену та випущений довіреним центром сертифікації).
У цьому посібнику ми розберемо використання веб-клієнта 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 створює папки за промовчанням, якщо їх немає:
* Без налаштування, якщо не створювалися папки іншим клієнтом, веб-клієнт буде видавати помилки при переміщенні листів, наприклад, при їх видаленні.
Задаємо власника 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://
На наступній сторінці перевіряємо, що всі пункти перебувають у стані OK. Встановлення виконано.
Відкриваємо конфігураційний файл roundcube:
vi /var/www/html/webmail/config/config.inc.php
Забороняємо встановлення порталу:
$config[`enable_installer`] = false;
Після видаляємо папку з настановними скриптами:
m -R /var/www/html/webmail/installer
І заходимо в браузері за адресою http://
Антивірус потребує багато ресурсів. Будьте готові, що після запуску сервер почне працювати повільніше і знадобиться додати ресурси.
Встановлення та налаштування 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 після виконання перевірки). Також, ми використовуємо такі опції:
Перезапускаємо 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
Пробуємо надіслати повідомлення з тестовими сигнатурами на СПАМ та вірус – листи мають бути перенаправлені на вказані адреси.
У MTA Postfix вбудований механізм перевірки заголовків вхідних повідомлень. Правила розміщуються у 7 секцій, обробка яких виконується в наступному порядку:
client -> helo -> sender -> relay -> recipient -> data -> end_of_data
Щоб краще зрозуміти принцип, ми повинні знати SMTP-команди під час надсилання пошти. І так порядок, наступний:
Отже, для налаштування антиспаму відкриваємо конфігураційний файл 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
* де параметри:
… і значення для них:
* це більш менш м’які правила. Їх можна використовувати спочатку, поки тестуємо сервер. Для посилення захисту додаємо:
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
* де:
* Докладніший опис опцій для захисту можна знайти на сторінці 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
Для надсилання пошти на інші поштові сервери необхідно правильно налаштувати сервер, щоб листи не потрапляли до СПАМу. Щоб це зробити, виконуємо інструкції нижче.
Багато поштових серверів роблять запити в систему доменних імен для перевірки легітимності поштового сервера, що надсилає пошту. При налаштуванні MTA дуже важливо правильно додати необхідні записи до DNS.
1. rDNS. Зворотна зона використовується для перевірки відповідності імені сервера у привітанні з ім’ям, яке повертає сервер NS при запиті по PTR-запису.
І так, для створення запису в зворотній зоні, необхідно написати листа Інтернет провайдеру, до мережі якого підключений сервер або хостеру, якщо поштовий сервер налаштований на VPS. IP-адреса нашого сервера повинна вести на ім’я, яким вітається наша postfix — можна подивитися командою:
postconf -n smtpd_banner
Якщо ми отримаємо порожню відповідь, то вводимо:
postconf -n myhostname
Якщо і цей варіант не поверне відповідь, вводимо:
hostname
2. А-запис. Також необхідно, щоб ім’я сервера, яким представляється поштовий сервер, дозволялося в IP-адресу.
Для цього заходимо в консоль управління зоною нашого домену і створюємо запис типу А для зіставлення імені сервера з IP-адресою, на якій слухає запити на цей сервер.
Для кожного домену, для якого надсилатимемо пошту створюємо записи:
Для перевірки коректності налаштування сервера скористаємося ресурсами:
https://www.mail-tester.com
https://spamtest.smtp.bz
Підпис листів не є обов’язковим, але допомагає не потрапляти до СПАМу. 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
У PostfixAdmin у нас є можливість задати квоти на поштові скриньки, але вони не працюватимуть, оскільки про них нічого не знає Dovecot.
Процес налаштування не складний та описаний окремо у статті Налаштування квот у Dovecot + PostfixAdmin.
Після застосування квот ми зможемо спостерігати в поштовому клієнті Roundcube інформацію про дисковий простір, що залишився:
… або у Webmail Lite:
Для автоматичного конфігурування поштових клієнтів потрібно настроїти сервіс autodiscover. Для цього налаштовуємо веб-сервер, який повертатиме поштові налаштування для домену.
Докладніше про процес налаштування описано у статті Налаштування Autodiscover для свого поштового сервера.
За замовчуванням, всі поштові клієнти, крім Outlook, розпізнають службові папки IMAP:
Дані каталоги перекладаються російською мовою та коректно відображаються в клієнті. В 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
}
..
}
* і так, ми задали кілька варіантів службових каталогів:
Для застосування налаштувань перезапускаємо dovecot:
systemctl restart dovecot
Розглянемо додаткові параметри для нашого сервера.
Також важливо налаштувати деякі обмеження, наприклад:
максимальний розмір вкладення.
кількість повідомлень, яку можна надіслати за певний період часу.
налаштування черги (час зберігання листів).
таймаути відправлення.
Докладніше, інформацію можна знайти у статті Ліміти у Postfix.
Припустимо, ми зробили помилку в написанні адреси електронної пошти, але не хочемо видаляти обліковий запис та створювати його за новою. Розглянемо зміну 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-адреси.
Не підключатися до сервера IMAP в Outlook на старих системах Windows
При спробі підключення до сервера ми можемо побачити помилку «Неможливо встановити безпечне з’єднання з сервером IMAP».
Причина: у старих системах використовується за замовчуванням TLS 1.0, підтримка якого відсутня.
Рішення: необхідно виконати 3 дії.
1. Встановлюємо оновлення KB3140245.
2. Створюємо дві гілки реєстру:
Це можна виконати вручну в утиліті 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. Перезавантажуємо комп’ютер.
спеціальний 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, щоб мати уявлення про додаткові способи захисту доменів.
політика обробки поштових повідомлень на основі 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"
Оскільки налаштування виконується лише на сервері NS, немає значення, для якого поштового сервера її налаштовувати. DMARC працює для Postfix, Exim, Exchange та багатьох інших поштових систем. Безкоштовні поштові сервіси від Mail RU Group, Яндекс, Google і так далі підтримують політики DMARC, обробляючи повідомлення відповідно до настройок.
Докладніша інструкція щодо роботи з DMARC на datatracker.ietf.org. Для перевірки правильності налаштування політики можна скористатися сторонніми сервісами, наприклад, mxtoolbox.com.
При установці поштового сервера на базі Postfix + Dovecot та використанні панелі керування поштовими скриньками PostfixAdmin, за замовчуванням, квотування не налаштоване – його можна задавати в останній, але квоти працювати не будуть. Потрібне додаткове налаштування…
Налаштовуємо квоти у 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 потрібен комплексний підхід, оскільки різні поштові клієнти мають свої вимоги.
Для MS Outlook
Для Mozilla Thunderbird
Через SRV DNS
Для автоматичного налаштування поштового клієнта йде https POST-запит до документа autodiscover.xml. При цьому, Outlook спочатку спробує знайти сервер запису в DNS autodiscover.server.domain, потім просто до домену server.domain і потім – до SRV-запису _autodiscover._tcp.server.domain. Таким чином, необхідно настроїти 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
* де з основних параметрів на потрібні:
Відкриваємо браузер і переходимо за адресою 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. Відкриваємо налаштування нашого віртуального домену:
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 та перевіряти автонастройку для інших поштових скриньок.
Механізм автоналаштування від 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 та веб-сервер.
створюємо А-запис (або 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%
* де:
Це спосіб, покликаний бути універсальним. Понад те, він описаний стандартом RFC.
Суть полягає у створенні SRV-записів у DNS. Цей запис створюється за наступним синтаксисом:
_<ім`я служби>._<протокол> <пріоритет> <вага> <порт> <хост>
* де:
Приклад записів для налаштування пошти:
Запис | Пріоритет | Вага | Порт | Хост | Опис |
_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.
Встановлюємо програму для генерації сертифікатів:
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.