Переклад та редагування,
збір інформації в одне ціле:
Рудюк Сергій Анатолійович
Email: rs@corp2.net
Viber: +38 (067) 901-63-22
Використовувані терміни: 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. Попередньо виконаємо наступні дії.
Загальні налаштування
Оновлюємо систему:
1 |
apt-get update && apt-get upgrade |
Задаємо правильне ім’я серверу – це важливий крок, оскільки більшість антиспам систем виконують перевірки, звертаючись до сервера на ім’я в очікуванні відповіді:
1 |
hostnamectl set-hostname relay.corp2.eu |
* необхідно вказати FQDN-ім’я, яке буде доступне з глобальної мережі. У цьому прикладі вказано relay.corp2.eu. Встановлюємо пакет для синхронізації часу:
1 |
apt-get install chrony |
Задаємо тимчасову зону (у цьому прикладі київський час):
1 |
timedatectl set-timezone Europe/Kiev |
* Щоб отримати список всіх можливих зон, вводимо timedatectl list-timezones. Дозволяємо сервіс для оновлення часу:
1 |
systemctl enable chrony |
Налаштування безпеки
Заздалегідь відкриваємо порти на брандмауері за допомогою iptables:
1 2 |
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;
Для збереження правил встановимо пакет:
1 |
apt-get install iptables-persistent |
І виконуємо команду:
1 |
netfilter-persistent save |
2. Налаштування веб-сервера: NGINX + PHP + MariaDB
Система керування PostfixAdmin працює як веб-додаток, розроблений на PHP, а інформацію зберігає у базі даних. У нашому прикладі використовуватиметься веб-сервер на NGINX, а база даних — MariaDB.
Установка NGINX
Встановлюємо nginx командою:
1 |
apt-get install nginx |
Дозволяємо автозапуск сервісу:
1 |
systemctl enable nginx |
Перевіряємо працездатність веб-сервера, звернувшись до нього у браузері за адресою http://<IP-адреса сервера>. Якщо бачимо заголовок “Welcome to nginx!”, NGINX налаштовано правильно.
PHP + PHP-FPM + NGINX
Встановлюємо php та php-fpm:
1 |
apt-get install php php-fpm |
Налаштовуємо NGINX:
1 |
vi /etc/nginx/sites-enabled/default |
У розділах http – server вказуємо, щоб першим індексним файлом був index.php, а також додаємо налаштування для обробки запитів php (location):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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:
1 |
systemctl enable php7.4-fpm |
* де php7.4-fpm залежить від версії php, яку можна подивитися командою php -v.
Перезапускаємо nginx:
1 |
systemctl restart nginx |
Для перевірки, створюємо індексний файл у директорії сайту з таким вмістом:
1 2 |
vi /var/www/html/index.php <?php phpinfo(); ?> |
MariaDB
Встановлюємо сервер баз даних наступною командою:
1 |
apt-get install mariadb-server |
Включаем автозапуск сервиса баз данных:
1 |
systemctl enable mariadb |
Задаємо пароль для користувача sql root:
1 |
mysqladmin -u root password |
3. Встановлення та налаштування PostfixAdmin
Встановлюємо додаткові компоненти для PHP:
1 |
apt-get install php-mysql php-mbstring php-imap |
Для застосування встановлених пакетів перезапускаємо обробник скриптів:
1 |
systemctl restart php7.4-fpm |
Завантажуємо PostfixAdmin:
1 |
wget https://sourceforge.net/projects/postfixadmin/files/latest/download -O postfixadmin.tar.gz |
У директорії сайтів nginx створюємо каталог для postfixadmin та розпаковуємо в нього архів:
1 2 |
mkdir /var/www/html/postfixadmin tar -C /var/www/html/postfixadmin -xvf postfixadmin.tar.gz --strip-components 1 |
Створюємо каталог templates_c усередині папки порталу (без нього не запуститься установка):
1 |
mkdir /var/www/html/postfixadmin/templates_c |
* в іншому випадку, при спробі зайти в панель керування після її встановлення ми отримаємо помилку ERROR: the templates_c directory не існує або не задано для веб-сервера.
Задаємо права на каталог:
1 |
chown -R www-data:www-data /var/www/html/postfixadmin |
* незважаючи на те, що ми використовуємо веб-сервер nginx, php-fpm за замовчуванням, запускається від користувача www-data.
Створюємо базу даних postfix та обліковий запис mariadb:
1 2 |
mysql -u root -p > CREATE DATABASE postfix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; |
* де postfix – ім’я бази.
1 |
> GRANT ALL ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'postfix123'; |
* де postfix – ім’я облікового запису; postfix123 – пароль; localhost дозволяє підключення лише з локального сервера.
Виходимо з командної оболонки MariaDB:
1 |
> \q |
Створюємо файл конфігурації postfixadmin:
1 |
vi /var/www/html/postfixadmin/config.local.php |
* У попередніх версіях використовувався файл config.inc.php. У нових версіях його не рекомендується редагувати, а використовувати config.local.php, який перевизначає налаштування.
І додаємо наступне:
1 2 3 4 5 6 7 8 |
<?php $CONF['configured'] = true; $CONF['default_language'] = 'ru'; $CONF['database_password'] = 'postfix123'; $CONF['emailcheck_resolve_domain']='NO'; ?> |
* де configured говорить програмі, що адміністратор закінчив його конфігурування; default_language — мова, що використовується за замовчуванням; database_password – пароль для бази даних, який ми задали на попередньому кроці; emailcheck_resolve_domain – задає необхідність перевірки домену при створенні ящиків та псевдонімів.
Запускаємо браузер і вводимо адресу http://<IP-адреса сервера>/postfixadmin/public/setup.php — відкриється сторінка для встановлення PostfixAdmin.
Задаємо двічі пароль установки і генеруємо хеш, клацнувши Generate setup_password hash:
Після копіюємо хеш, який з’явиться під кнопкою:
Відкриваємо конфігураційний файл:
1 |
vi /var/www/html/postfixadmin/config.local.php |
І додаємо рядок:
1 2 |
... $CONF['setup_password'] = '$2y$10$D...R32'; |
* де ‘$2y$10$D…R32’ — скопійований хеш.
Перезавантажуємо сторінку http://<IP-адреса сервера>/postfixadmin/public/setup.php — тепер у нас з’явиться форма для введення нашого пароля, створеного на попередньому етапі. Вводимо його та клацаємо по Login with setup_password:
Буде виконано встановлення PostfixAdmin.
Якщо в процесі встановлення система виведе помилки, необхідно самостійно розібратися з ними. Як правило, вони можуть зводитись до відсутності необхідних пакетів, яких може не опинитися в системі за промовчанням.
Після встановлення в нижній частині сторінки має бути форма додавання суперкористувача – вводимо дані:
* де Setup password – пароль, який ми ввели на попередній сторінці; Адмін — обліковий запис для входу до панелі керування PostfixAdmin; Пароль — новий пароль для облікового запису, що створюється.
Встановлення завершено. Переходимо в браузері на сторінку http://<IP-адреса сервера>/postfixadmin/public/login.php
Вводимо логін та пароль для створеного користувача. Ми повинні увійти до postfix.admin.
Однак, в моєму випадку, користувач не створювався при установці системи і необхідно було створити адміністратора вручну. Якщо це потрібно, в консолі сервера підключаємося до СУБД:
1 |
mysql -uroot -p |
Переходимо до використання бази postfix:
1 |
> use postfix |
Додаємо адміністратора запитом:
1 |
> INSERT INTO admin (`username`, `password`, `superadmin`, `active`) VALUES ('root@corp2.eu', '$1$1b7ff416$/KKYqdyAd3viA3.PNu5hh/', '1', '1'); |
Виходимо з sql-оболонки:
1 |
> quit |
Тепер переходимо на сторінку http://<IP-адреса сервера>/postfixadmin/public/login.php вводимо логін root@corp2.eu та пароль qwe12345 — ми повинні опинитися в системі керування поштою. Перш за все, переходимо в Список адмінів – Новий адмін:
Створюємо свого користувача. Після чого можна видалити те, що створили через командний рядок.
4. Встановлення та налаштування Postfix
Установка Postfix в Ubuntu виконується командою:
1 |
apt-get install postfix postfix-mysql |
* крім самого postfix, ми також встановимо postfix-mysql для роботи з СУБД.
У процесі установки має з’явитися вікно Postfix Configuration — залишаємо Internet Site:
У наступному вікні залишаємо ім’я сервера та натискаємо Enter.
Після встановлення пакетів створюємо обліковий запис, від якого ми будемо працювати з каталогом віртуальних поштових скриньок:
1 2 |
groupadd -g 1024 vmail useradd -d /home/mail -g 1024 -u 1024 vmail -m |
* спочатку ми створюємо групу vmail і guid 1024, після – користувача vmail з uid 1024 та домашньою директорією /home/mail – у ній у нас буде зберігатися пошта. Зверніть увагу, що в деяких системах ідентифікатор групи та користувача 1024 може бути зайнятий. У такому випадку необхідно створити інший, а в даній інструкції нижче замінити всі 1024 альтернативний.
Якщо директорія для пошти раніше вже була створена, необхідно задати як власника нашого створеного користувача:
1 |
chown vmail:vmail /home/mail |
Відкриваємо на редагування конфігураційний файл поштового сервера:
1 |
vi /etc/postfix/main.cf |
І редагуємо наступні рядки:
1 2 3 4 5 6 |
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, задаємо опцію:
1 |
myhostname = relay.corp2.eu |
Тепер до кінця конфігураційного файлу допишемо наступне:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 – вимагати розпочинати сесію з вітання.
Створюємо файл із налаштуваннями звернення до бази з аліасами:
1 2 3 4 5 6 |
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 — шаблон запиту даних.
Створюємо файл з інструкцією отримання даних щодо віртуальних доменів:
1 2 3 4 5 6 |
vi /etc/postfix/mysql_virtual_domains_maps.cf user = postfix password = postfix123 hosts = localhost dbname = postfix query = SELECT domain FROM domain WHERE domain='%u' |
І файл із поштовими скриньками:
1 2 3 4 5 6 |
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 і дописуємо до кінця:
1 |
vi /etc/postfix/master.cf |
1 2 3 4 5 6 7 |
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 |
1 2 3 4 5 |
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 |
1 2 |
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 — Налаштування обмеження з’єднання клієнта. У цьому прикладі дозволити лише авторизованих.
Генеруємо сертифікати безпеки. Для цього створюємо каталог, в якому їх розмістимо:
1 |
mkdir -p /etc/ssl/mail |
І згенеруємо їх наступною командою:
1 |
openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/mail/public.pem -keyout /etc/ssl/mail/private.key -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=relay.corp2.eu" |
* сертифікат згенерований на 1461 день, ключі subj можуть бути довільними, CN необхідно вказати відповідно до імені сервера, яким ми будемо підключатися до пошти.
* якщо ми хочемо використовувати сертифікат, який проходитиме всі перевірки безпеки, його потрібно купити або запросити у Let’s Encrypt.
Дозволяємо запуск postfix:
1 |
systemctl enable postfix |
Перезапускаємо його:
1 |
systemctl restart postfix |
5. Налаштування Dovecot
Встановлюємо Dovecot із компонентом для роботи з СУБД:
1 |
apt-get install dovecot-imapd dovecot-pop3d dovecot-mysql |
Налаштовуємо спосіб зберігання повідомлень:
1 2 |
vi /etc/dovecot/conf.d/10-mail.conf mail_location = maildir:/home/mail/%d/%u/ |
* у даному прикладі повідомлення зберігатимуться у просунутому форматі maildir у каталозі /home/mail/<поштовий домен>/<логін користувача>.
Налаштовуємо слухача для автентифікації:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 задає користувача та групу власників на сокет.
А також у цьому файлі додамо рядки:
1 2 3 4 5 6 7 8 9 10 11 12 |
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:
1 2 3 |
vi /etc/dovecot/conf.d/10-auth.conf #!include auth-system.conf.ext !include auth-sql.conf.ext |
* в даному випадку ми просто коментуємо звичайну автентифікацію та знімаємо коментар для використання SQL-аутентифікації.
Налаштовуємо використання шифрування:
1 2 3 4 |
vi /etc/dovecot/conf.d/10-ssl.conf ssl = required ssl_cert = </etc/ssl/mail/public.pem ssl_key = </etc/ssl/mail/private.key |
* ssl = required вкаже dovecot вимагати від клієнтів використання шифрування; ssl_cert – шлях до відкритого сертифікату (також нами вказувався у postfix); ssl_key – шлях до закритого ключа.
Налаштуємо автоматичне створення каталогів при першому підключенні користувача до скриньки:
1 2 |
vi /etc/dovecot/conf.d/15-lda.conf lda_mailbox_autocreate = yes |
Налаштовуємо підключення до нашої бази даних:
1 2 3 4 5 6 7 8 9 |
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:
1 |
vi /etc/dovecot/dovecot-sql.conf.ext |
У самий низ додамо:
1 2 3 4 5 6 |
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:
1 2 |
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:
1 |
systemctl enable dovecot |
Перезапускаємо dovecot:
1 |
systemctl restart dovecot |
6. Створюємо першу поштову скриньку та перевіряємо роботу сервера
У браузері вводимо в адресному рядку шлях до Postfixadmin – http://<IP-адреса сервера>/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):
Використовуємо посилання, щоб завантажити архів програми:
1 |
wget https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz |
Створюємо каталог, де розміщуватимуться файли порталу:
1 |
mkdir /var/www/html/webmail |
І розпаковуємо завантажений архів:
1 |
tar -C /var/www/html/webmail -xvf roundcubemail-*.tar.gz --strip-components 1 |
Копіюємо шаблон конфігу:
1 |
cp /var/www/html/webmail/config/config.inc.php.sample /var/www/html/webmail/config/config.inc.php |
І відкриваємо його на редагування:
1 2 3 |
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 – ім’я бази даних. Другий рядок дозволяє установку порталу.
Також дописуємо до конфігураційного файлу наступне:
1 2 3 4 5 |
$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 на папку порталу:
1 |
chown -R www-data:www-data /var/www/html/webmail |
Создаем в MariaDB базу для roundcubemail:
1 2 3 4 |
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 |
І завантажуємо у створену базу дані:
1 |
mysql -uroot -p roundcubemail < /var/www/html/webmail/SQL/mysql.initial.sql |
Встановлюємо компоненти, необхідні для роботи Roundcube:
1 |
apt-get install php-pear php-intl php-ldap php-net-smtp php-gd php-imagick php-zip |
У Ubuntu немає можливості встановити компонент mcrypt з репозиторію – для початку встановимо пакети, необхідні для збирання його вихідних джерел:
1 |
apt-get install php-dev libmcrypt-dev |
Виконуємо команди:
1 2 |
pecl channel-update pecl.php.net pecl install mcrypt-1.0.4 |
Створимо файл із налаштуванням нового модуля:
1 2 |
vi /etc/php/7.4/fpm/conf.d/99-mcrypt.ini extension=mcrypt.so |
Налаштуємо php:
1 2 3 4 5 6 |
vi /etc/php/7.4/fpm/php.ini date.timezone = "<span class="crayon-v">Europe</span><span class="crayon-o">/</span><span class="crayon-v">Kiev</span>" ... post_max_size = 30M ... upload_max_filesize = 30M |
* в даному прикладі ми задаємо московський час і можливість завантажувати файл розміром 30 Мб (це буде максимальним обсягом вкладень, які можна відправляти через веб-інтерфейс).
Перезавантажуємо php-fpm:
1 |
systemctl restart php7.4-fpm |
Налаштуємо nginx:
1 |
vi /etc/nginx/nginx.conf |
Додамо рядок до розділу http:
1 2 3 4 |
http { ... client_max_body_size 30M; ... |
* даною установкою ми також дозволимо завантаження файлів розміром 30 Мб.
Перезапустимо nginx для застосування налаштування:
1 |
systemctl restart nginx |
Тепер відкриваємо браузер і переходимо на адресу http://<IP-адреса сервера>/webmail/installer/. У самому низу натискаємо на кнопку Next. Якщо кнопка буде неактивною, перевіряємо, що немає помилок (NOT OK).
На наступній сторінці перевіряємо, що всі пункти перебувають у стані OK. Встановлення виконано.
Відкриваємо конфігураційний файл roundcube:
1 |
vi /var/www/html/webmail/config/config.inc.php |
Забороняємо встановлення порталу:
1 |
$config['enable_installer'] = false; |
Після видаляємо папку з настановними скриптами:
1 |
\rm -R /var/www/html/webmail/installer |
І заходимо в браузері за адресою http://<IP-адреса сервера>/webmail/. Вводимо як логін адресу пошти створеного користувача та його пароль.
8. Захищаємось від вірусів та СПАМу
Антивірус потребує багато ресурсів. Будьте готові, що після запуску сервер почне працювати повільніше і знадобиться додати ресурси.
Встановлення та налаштування Clamav + Amavisd
Встановлюємо необхідні для роботи антивірусу та антиспаму компоненти:
1 |
apt-get install amavisd-new clamav clamav-daemon spamassassin |
Додаємо користувача clamav до групи amavis:
1 |
usermod -a -G amavis clamav |
Відкриваємо конфігураційний файл amavis:
1 |
vi /etc/amavis/conf.d/15-content_filter_mode |
Знімаємо коментарі для рядків:
1 2 3 4 5 6 7 |
... @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.
Потім відкриваємо на редагування:
1 |
vi /etc/amavis/conf.d/50-user |
Додамо рядки:
1 2 |
$allowed_header_tests{'multiple'} = 0; $allowed_header_tests{'missing'} = 0; |
* Дані опції дозволять програмі Outlook без помилок відправляти тестове повідомлення.
Дозволяємо запуск антивірусу та amavis:
1 |
systemctl enable clamav-daemon clamav-freshclam amavis |
Перезапускаємо послуги:
1 |
systemctl restart amavis clamav-daemon clamav-freshclam |
Налаштування Postfix
Додаємо до postfix:
1 2 |
vi /etc/postfix/main.cf content_filter = scan:[127.0.0.1]:10024 |
* де content_filter вказує на програму, яка буде сканувати повідомлення;
Тепер редагуємо master.cf:
1 |
vi /etc/postfix/master.cf |
Дописуємо наступне:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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:
1 |
systemctl restart postfix |
Налаштування оновлень антиспаму
Для оновлення бази антиспаму виконуємо команду:
1 |
sa-update --nogpg --verbose |
Для налаштування автоматичного оновлення редагуємо cron:
1 2 |
crontab -e 30 3 * * * /usr/bin/sa-update |
* в даному прикладі, щодня о 03:30 запускатиметься процес оновлення антиспаму.
Перевірка
Для перевірки антивірусу надсилаємо повідомлення з таким вмістом:
1 |
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H* |
Більшість поштових систем екранінують вірусну послідовність і лист нормально пройде повз наш антивірус. Щоб зробити коректний тест, необхідно надіслати листа командами SMTP.
Лист не повинен дійти, а в лозі (/var/log/maillog) ми побачимо рядок:
1 2 |
... 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) |
Для перевірки роботи контентного антиспаму надсилаємо листа з наступним вмістом:
1 |
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X |
У результаті лист не повинен прийти, а в логах ми побачимо:
1 2 |
... amavis[17689]: (17689-04) Blocked SPAM {DiscardedOutbound,Quarantined}, MYNETS LOCAL ... ... status=sent (250 2.7.0 Ok, discarded, id=17689-04 - spam) |
Пересилання СПАМу та вірусів на іншу скриньку
Всі листи зі спамом та вірусами переміщатимуться до карантину. Якщо ми хочемо перенаправляти всі подібні повідомлення на спеціальну скриньку, необхідно налаштувати amavis.
Відкриваємо конфігураційний файл:
1 |
vi /etc/amavis/conf.d/50-user |
Додаємо такі опції:
1 2 |
$spam_quarantine_to = "spam\@corp2.eu"; $virus_quarantine_to = "virus\@corp2.eu"; |
* де $spam_quarantine_to вказуємо на адресу для перенаправлення СПАМ-листів; $virus_quarantine_to — пошта для листів із виявленими вірусами.
Після перезавантажимо amavis:
1 |
systemctl restart amavis |
Пробуємо надіслати повідомлення з тестовими сигнатурами на СПАМ та вірус – листи мають бути перенаправлені на вказані адреси.
Антиспам засобами Postfix
У MTA Postfix вбудований механізм перевірки заголовків вхідних повідомлень. Правила розміщуються у 7 секцій, обробка яких виконується в наступному порядку:
client -> helo -> sender -> relay -> recipient -> data -> end_of_data
Щоб краще зрозуміти принцип, ми повинні знати SMTP-команди під час надсилання пошти. І так порядок, наступний:
- З’єднання із сервером.
- Команда HELO. Привітання, в якому відправник називає своє ім’я, за яким можна перевірити, чи воно відповідає правилам іменування і своїй IP-адресі.
- MAIL FROM – вказує адресу відправника. Виконується для sender та relay.
- RCPT TO – кому надсилаємо листа.
- DATA — команда повідомляє про готовність надіслати лист із заголовками та текстом.
- END-OF-DATA — надсилання листа.
Отже, для налаштування антиспаму відкриваємо конфігураційний файл main.cf:
1 |
vi /etc/postfix/main.cf |
Коментуємо рядок:
1 |
#smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination |
І додаємо:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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 — Налаштування обмежень під час здійснення клієнтських з’єднань із поштовим сервером.
- smtpd_helo_restrictions – обмеження у контексті клієнтської команди HELO.
- smtpd_sender_restrictions – обмеження будуть застосовуватися під час виконання клієнтської команди MAIL FROM.
- smtpd_relay_restrictions — обмеження надсилання пошти в контексті клієнтської команди RCPT TO.
- smtpd_recipient_restrictions – обмеження в контексті клієнтської команди RCPT TO після пересилання (smtpd_relay_restrictions).
- smtpd_data_restrictions – обмеження будуть застосовуватися під час виконання команди DATA.
- 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 – дозволяє з’єднання. Ставимо на кінець кожного блоку обмежень (якщо обмеження не спрацювали, то дозволяємо).
1 2 3 4 5 6 7 8 9 10 11 |
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:
1 |
systemctl restart postfix |
Навчання антиспаму
Ми встановили amavis, котрий перевіряє пошту на СПАМ засобами spamassassin. Останній без навчання, практично, марний. Синтаксис команди для навчання наступний:
1 2 |
sa-learn --spam <папка с нежелательными письмами> sa-learn --ham <папка письмами, которые ошибочно определены как СПАМ> |
Таким чином, перша команда вкаже spamassassin які листи є небажаними, а друга — не несуть рекламного характеру.
Хорошою практикою буде домовитися з користувачами про ручне розміщення небажаної пошти з СПАМ, що входять до папки. Тоді ми зможемо пройтися скриптом по всіх ящиках на сервері та навчати антиспам. Наприклад, такою командою:
1 |
sa-learn --spam /home/mail/dmosk.local/*/{.\&BCEEPwQwBDw-,.Spam,.Junk\ E-mail,.Junk}/cur |
* у даному прикладі ми сказали spamassassin знайти в каталогах користувачів папки Спам, Spam, Junk, Junk E-mail (дані каталоги є типовими для приміщення СПАМу) та провести навчання.
Щоб мінімізувати кількість помилкових спрацьовувань, необхідно проводити навчання із ключем –ham. У нашому прикладі ми надсилаємо всі небажані листи на скриньку spam. У такому разі необхідно вручну знаходити помилкові спрацьовування та переносити їх у спеціальну папку, наприклад Ham. Тоді команда для навчання буде такою:
1 |
sa-learn --ham /home/mail/dmosk.local/spam\@dmosk.local/.Ham/cur |
Статистику навчання можна переглянути командою:
1 |
sa-learn --dump magic |
9. Надсилання пошти назовні
Для надсилання пошти на інші поштові сервери необхідно правильно налаштувати сервер, щоб листи не потрапляли до СПАМу. Щоб це зробити, виконуємо інструкції нижче.
Установки DNS для сервера
Багато поштових серверів роблять запити в систему доменних імен для перевірки легітимності поштового сервера, що надсилає пошту. При налаштуванні MTA дуже важливо правильно додати необхідні записи до DNS.
1. rDNS. Зворотна зона використовується для перевірки відповідності імені сервера у привітанні з ім’ям, яке повертає сервер NS при запиті по PTR-запису.
І так, для створення запису в зворотній зоні, необхідно написати листа Інтернет провайдеру, до мережі якого підключений сервер або хостеру, якщо поштовий сервер налаштований на VPS. IP-адреса нашого сервера повинна вести на ім’я, яким вітається наша postfix — можна подивитися командою:
1 |
postconf -n smtpd_banner |
Якщо ми отримаємо порожню відповідь, то вводимо:
1 |
postconf -n myhostname |
Якщо і цей варіант не поверне відповідь, вводимо:
1 |
hostname |
2. А-запис. Також необхідно, щоб ім’я сервера, яким представляється поштовий сервер, дозволялося в IP-адресу.
Для цього заходимо в консоль управління зоною нашого домену і створюємо запис типу А для зіставлення імені сервера з IP-адресою, на якій слухає запити на цей сервер.
Установки DNS для домену
Для кожного домену, для якого надсилатимемо пошту створюємо записи:
- SPF.
- DMARC.
- DKIM
Для перевірки коректності налаштування сервера скористаємося ресурсами:
https://www.mail-tester.com
https://spamtest.smtp.bz
10. Налаштування DKIM
Підпис листів не є обов’язковим, але допомагає не потрапляти до СПАМу. DKIM налаштовується для кожного домену, а також має створюватися спеціальний запис DNS. Розглянемо створення та налаштування DKIM в amavisd.
Створюємо каталог для зберігання ключів:
1 |
mkdir -p /var/lib/dkim |
Генеруємо послідовність для нашого домену:
1 |
amavisd-new genrsa /var/lib/dkim/corp2.eu.pem 1024 |
1 2 |
chown amavis:amavis /var/lib/dkim/*.pem chmod 0400 /var/lib/dkim/*.pem |
Відкриваємо конфігураційний файл amavisd:
1 |
vi /etc/amavis/conf.d/20-debian_defaults |
Редагуємо запис:
1 2 |
#$inet_socket_port = 10024; $inet_socket_port = [10024,10026]; |
1 2 3 4 5 6 7 8 9 10 11 12 |
$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"], }; |
Відкриваємо файл:
1 |
vi /etc/amavis/conf.d/50-user |
Додаємо записи:
1 2 3 4 5 6 7 8 |
$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 }, }); |
1 |
systemctl restart amavis |
Подивитися послідовність DKIM для нового домену можна командою:
1 |
amavisd-new showkeys |
Ми повинні побачити щось на кшталт:
1 2 3 4 5 6 7 |
; 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") |
1 |
amavisd-new testkeys |
1 |
vi /etc/postfix/master.cf |
Відредагуємо submission та smtps, додавши content_filter:
1 2 3 4 5 6 7 8 9 10 11 |
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 ... |
І додамо:
1 2 3 4 5 6 7 8 9 |
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 |
1 |
systemctl restart postfix |
Налаштовуємо Roundcube:
1 |
vi /var/www/html/webmail/config/config.inc.php |
Знаходимо рядки:
1 2 3 |
$config['smtp_server'] = ''; ... $config['smtp_port'] = 25; |
… і міняємо її на:
1 2 3 |
$config['smtp_server'] = 'tls://localhost'; ... $config['smtp_port'] = 587; |
1 |
dkim=pass header.d=corp2.eu |
11. Налаштування квот
… або у Webmail Lite:
12. Автоматичне налаштування поштових клієнтів
13. Папки російською в Outlook
- Drafts – чернетки.
- Junk – СПАМ.
- Sent – надіслані.
- Trash – віддалені.
1 |
vi /etc/dovecot/conf.d/15-mailboxes.conf |
Знайти блок налаштувань namespace inbox. Для кожного зі службового каталогу налаштувати таке:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
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.
1 |
systemctl restart dovecot |
14. Різне
Налаштування обмежень
Зміна email адреси
1 |
mysql -uroot -p |
1 |
> use postfix |
Редагуємо аліаси командою:
1 |
> UPDATE alias SET `address`='secretar@corp2.eu', `goto`=REPLACE(`goto`, 'sekretar@corp2.eu', 'secretar@corp2.eu') WHERE `address`='sekretar@corp2.eu'; |
Редагуємо поштову скриньку:
1 |
> UPDATE mailbox SET `username`='secretar@corp2.eu', `local_part`='secretar', `maildir`=REPLACE(`maildir`, '/sekretar/', '/secretar/') WHERE `username`='sekretar@corp2.eu'; |
І квоту:
1 |
> UPDATE quota2 SET `username`='secretar@corp2.eu' WHERE `username`='sekretar@corp2.eu'; |
З базою даних закінчили – виходимо з SQL:
1 |
> quit |
Переходимо в каталог із поштовими скриньками користувачів для нашого домену:
1 |
cd /home/mail/corp2.eu/ |
Переміщуємо папку з поштою старої скриньки до нової:
1 |
mv sekretar@corp2.eu secretar@corp2.eu |
15. Можливі проблеми
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.1\Client
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.2\Client
1 2 |
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.1\Client" reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.2\Client" |
У створених гілках створюємо параметр DisabledByDefault з типом DWORD (32 біти) та значенням 0. Це можна виконати командами:
1 2 |
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.1\Client" /v DisabledByDefault /t REG_DWORD /d 0 reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\Schannel\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 |
3. Перезавантажуємо комп’ютер.
Що таке SPF-запис
1 |
corp2.eu. IN TXT "v=spf1 +a +mx -all" |
1 |
corp.eu. IN TXT "v=spf1 ip4:193.93.93.93 include:_spf.mailsystem.net ~all" |
1 |
corp2.eu. IN TXT "v=spf1 ip4:93.93.93.0/24 ~all" |
А ось приклад з IPv6:
1 |
corp2.eu. IN TXT "v=spf1 ip6:2a01:233:2::111 ~all" |
І конструкція з перенапрямком (Redirect):
1 |
corp2.eu. IN TXT "v=spf1 redirect=_spf.mailsystem.net" |
Що таке DMARC
1 |
_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 – поштова адреса для звітів.
Налаштування квот у Dovecot + PostfixAdmin
Налаштування Dovecot
1 |
vi /etc/dovecot/conf.d/10-mail.conf |
Знаходимо рядок з mail_plugins і наводимо його до вигляду:
1 2 3 |
... mail_plugins = $mail_plugins quota ... |
1 |
vi /etc/dovecot/conf.d/20-imap.conf |
1 |
vi /etc/dovecot/conf.d/10-master.conf |
Знаходимо опцію service dict, в ній unix_listener dict і наводимо її до вигляду:
1 2 3 4 5 6 7 |
service dict { unix_listener dict { mode = 0660 user = vmail group = vmail } } |
Відкриваємо файл 90-quota.conf:
1 |
vi /etc/dovecot/conf.d/90-quota.conf |
Додаємо:
1 2 3 |
plugin { quota = dict:User quota::proxy::quota } |
1 |
vi /etc/dovecot/dovecot.conf |
Знаходимо розділ dict і знімаємо коментар або додаємо:
1 2 3 |
dict { quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext } |
Тепер створюємо файл для налаштування вивантаження квот:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 } |
1 |
vi /etc/dovecot/dovecot-sql.conf.ext |
Знаходимо запит user_query і дописуємо в SELECT CONCAT(‘*:bytes=’, quota) AS quota_rule – у мене вийшло:
1 |
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' |
1 |
doveconf |
… і якщо команда не поверне помилку, перезапускаємо його:
1 |
systemctl restart dovecot |
Перевірка роботи квот
Для початку в командному рядку вводимо:
1 |
doveadm quota get -u user@domain.net |
1 2 3 |
Quota name Type Value Limit % User quota STORAGE 16420 50000 32 User quota MESSAGE 14 - 0 |
1 2 3 4 5 |
Тепер обсяг ящика перевищує ліміт: Quota name Type Value Limit % User quota STORAGE 16420 5000 328 User quota MESSAGE 14 - 0 |
Оповіщення при перевищенні квоти
Відкриваємо конфігураційний файл 90-quota.conf:
1 |
vi /etc/dovecot/conf.d/90-quota.conf |
Знімаємо коментар або додаємо дані рядки:
1 2 3 4 |
plugin { quota_warning = storage=95%% quota-warning 95 %u quota_warning2 = storage=80%% quota-warning 80 %u } |
1 2 3 4 5 6 7 |
service quota-warning { executable = script /usr/local/bin/quota-warning.sh user = dovecot unix_listener quota-warning { user = vmail } } |
1 2 3 4 5 6 7 8 9 10 11 |
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: Администратор почты <postmaster@corp2.eu> Subject: Предупреждение о превышении квоты на почтовый ящик X-Priority: 2 <p>Размер Вашего почтового ящика составляет $1% от установленного ограничения.<br> Чтобы уменьшить его размер Вы можете удалить большие письма с вложениями, старые письма или почистить корзину.</p> EOF |
1 |
chmod +x /usr/local/bin/quota-warning.sh |
Перевіряємо, що нам надходять повідомлення, запустивши скрипт:
1 |
/usr/local/bin/quota-warning.sh 80 user@domain.net |
1 |
systemctl restart dovecot |
Налаштування Autodiscover для свого поштового сервера
1. Microsoft Outlook
DNS
1 |
autodiscover IN A 111.111.111.111 |
* де 111.111.111.111 — IP-адреса на наш веб-сервер, який повертатиме документ XML.
1 |
_autodiscover._tcp IN SRV 0 0 443 autodiscover.corp2.eu. |
Веб-сервер
1 2 3 |
yum install epel-release yum install nginx |
б) якщо сервер під Debian/Ubuntu:
1 |
apt-get install nginx |
Після дозволяємо автозапуск і стартуємо сервіс:
1 2 |
systemctl enable nginx systemctl start nginx |
Потім створюємо віртуальний домен:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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; } |
1 |
nginx -t |
Якщо помилок немає, перечитуємо конфіг:
1 |
systemctl reload nginx |
Створюємо каталог, у якому буде наш XML:
1 |
mkdir -p /usr/share/nginx/html/autodiscover/autodiscover |
Створимо сам XML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
vi /usr/share/nginx/html/autodiscover/autodiscover/autodiscover.xml <?xml version="1.0" encoding="UTF-8"?> <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006"> <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a"> <User> <DisplayName>corp2.eu</DisplayName> </User> <Account> <AccountType>email</AccountType> <Action>settings</Action> <Protocol> <Type>IMAP</Type> <Server>imap.corp2.eu</Server> <Port>993</Port> <LoginName>info@corp2.eu</LoginName> <AuthRequired>on</AuthRequired> <DomainRequired>on</DomainRequired> <SPA>on</SPA> <SSL>on</SSL> <Encryption>SSL</Encryption> </Protocol> <Protocol> <Type>POP</Type> <Server>pop.corp2.eu</Server> <Port>995</Port> <LoginName>info@corp2.eu</LoginName> <AuthRequired>on</AuthRequired> <DomainRequired>on</DomainRequired> <SPA>on</SPA> <SSL>on</SSL> <Encryption>SSL</Encryption> </Protocol> <Protocol> <Type>SMTP</Type> <Server>smtp.corp2.eu</Server> <Port>587</Port> <LoginName>info@corp2.eu</LoginName> <AuthRequired>on</AuthRequired> <DomainRequired>on</DomainRequired> <SPA>on</SPA> <SSL>on</SSL> <Encryption>TLS</Encryption> </Protocol> </Account> </Response> </Autodiscover> |
- 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.
Всі адреси
1 2 3 4 5 |
yum install php php-fpm systemctl enable php-fpm systemctl start php-fpm |
б) якщо сервер під Debian/Ubuntu:
1 2 3 4 5 |
apt-get install php php-fpm systemctl enable php7.2-fpm systemctl start php7.2-fpm |
1 2 3 4 5 6 7 |
vi /etc/php-fpm.d/www.conf ... listen = /var/run/php-fpm/php-fpm.sock ... systemctl restart php-fpm |
б) якщо сервер під Debian/Ubuntu:
1 2 3 4 5 6 7 |
vi /etc/php/7.2/fpm/pool.d/www.conf ... listen = /var/run/php-fpm/php-fpm.sock ... systemctl restart php7.2-fpm |
NGINX
Внесемо налаштування до нашого віртуального домену:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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; } ... |
1 |
systemctl reload nginx |
Готуємо скрипт
Створимо скрипт php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
vi /usr/share/nginx/html/autodiscover/autodiscover/autodiscover.php <?php //get raw POST data so we can extract the email address $data = file_get_contents("php://input"); preg_match("/\<EMailAddress\>(.*?)\<\/EMailAddress\>/", $data, $matches); //set Content-Type header("Content-Type: application/xml"); ?> <?php echo '<?xml version="1.0" encoding="utf-8" ?>'; ?> <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006"> <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a"> <Account> <AccountType>email</AccountType> <Action>settings</Action> <Protocol> <Type>IMAP</Type> <Server>imap.corp2.eu</Server> <Port>993</Port> <LoginName><?php echo $matches[1]; ?></LoginName> <AuthRequired>on</AuthRequired> <DomainRequired>on</DomainRequired> <SPA>on</SPA> <SSL>on</SSL> <Encryption>SSL</Encryption> </Protocol> <Protocol> <Type>POP3</Type> <Server>imap.corp2.eu</Server> <Port>995</Port> <LoginName><?php echo $matches[1]; ?></LoginName> <AuthRequired>on</AuthRequired> <DomainRequired>on</DomainRequired> <SPA>on</SPA> <SSL>on</SSL> <Encryption>SSL</Encryption> </Protocol> <Protocol> <Type>SMTP</Type> <Server>imap.corp2.eu</Server> <Port>587</Port> <LoginName><?php echo $matches[1]; ?></LoginName> <AuthRequired>on</AuthRequired> <DomainRequired>on</DomainRequired> <SPA>on</SPA> <SSL>on</SSL> <SMTPLast>on</SMTPLast> <Encryption>TLS</Encryption> </Protocol> </Account> </Response> </Autodiscover> |
Переадресація з xml на php
1 |
vi /etc/nginx/conf.d/autodiscover.conf |
… і додамо:
1 2 3 4 5 |
... location = /autodiscover/autodiscover.xml { rewrite ^/autodiscover/autodiscover.xml$ /autodiscover/autodiscover.php; } ... |
Перезапускаємо nginx:
1 |
systemctl reload nginx |
2. Mozilla Thunderbird
DNS
1 |
autoconfig IN A 111.111.111.111 |
1 |
vi /etc/nginx/conf.d/autodiscover.conf |
… і додамо до нього:
1 2 3 4 5 6 7 |
... server { listen 80; server_name autoconfig.corp2.eu; root /usr/share/nginx/html/autodiscover; } |
Створюємо каталог для зберігання XML:
1 |
mkdir -p /usr/share/nginx/html/autodiscover/mail |
Створюємо документ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |