История начинается в 2017-м году - когда мне потребовался самодельный почтовый сервер на связке Postfix + Dovecot + Roundcube + LDAP-каталог (AD на тот момент). Сказано - сделано - времени ушло прилично (делалось для FreeBSD), но зато много в чем получилось досконально разобраться. И естественно была составлена приличная статья-портянка в личной DokuWiki.
В 2021-м году адаптировали под Debian 11. В 2022-м был написан Ansible Playbook, который все делал автоматически, экономя пару часов времени ))) и нервов тоже изрядно экономил.
И вот наконец, неделю назад, была поставлена задача попробовать адаптировать данный Playbook к отечественным ОС (к 3-м самым распространенным, как видно из темы).
Если не хочется читать и погружаться в детали - все результаты выложены по ссылке (текущая версия Wiki + 4 архива Ansible Playbook).
LDAP-каталог
Первоначально все создавалось и тестировалось на Active Directory. В процессе адаптации на этой неделе все тестировалось на ALT Linux Domain (Samba). Основное отличие в том, что по умолчанию требует LDAPS. Для того, чтобы не сильно тратить время, на этапе портирования было принято решение это отключить в Samba (параметр ldap server require strong auth = no в файле /etc/samba/smb.conf). Просьба не ругаться, понятно, что лучше адаптировать к TLS (припрет - сделаю - но пока так).
Общая структура Ansible Playbook во всех вариантах
[egorhomelinux Ansible]# tree
.
├── ansible.cfg
├── hosts
├── id_rsa
├── postfix.yml
└── Templates
├── Dovecot
│ ├── conf.d
│ │ ├── 10-auth.conf.template
│ │ ├── 10-logging.conf.template
│ │ ├── 10-mail.conf.template
│ │ ├── 10-master.conf.template
│ │ ├── 10-ssl.conf.template
│ │ ├── 20-imap.conf.template
│ │ ├── 90-quota.conf.template
│ │ └── auth-ldap.conf.ext.template
│ └── dovecot-ldap.conf.ext.template
├── mailserver.test.ru.pem
├── Postfix
│ ├── aliases.cf.template
│ ├── main.cf.template
│ ├── transport.cf.template
│ └── users.cf.template
├── Roundcube
│ ├── composer.json
│ ├── config.inc.php.template
│ ├── LDAP3.php
│ ├── paths-ldap3.txt
│ └── Result.php
└── synsol.pem
Главный файл понятно postfix.yml - посмотрим на его начало во всех 4-х вариантах:
- hosts: debian
vars:
apt_env:
DEBIAN_FRONTEND: noninteractive # Устанавливать пакеты с автоответом на вопросы
postfix_uid: 103 # User ID
postfix_gid: 111 # Group ID
myhostname: mail.domain.alt # Имя почтового сервера (FQDN)
mydomain: domain.alt # Имя почтового домена @test.ru
mynetworks: 127.0.0.0/8 # Открытый Relay для SMTP сервера Postfix
virtual_mailbox_base: /mbx # Расположение писам в формате Maildir
domain_controller_ip: 10.200.118.10 # IP-адрес доменного контроллера
search_base: DC=domain,DC=alt # Контейнер, где находятся учетные записи с атрибутами mail
bind_dn: CN=Administrator,CN=Users,DC=domain,DC=alt # Сервисная учетная запись для LDAP запросов от Postfix/Dovecot/RoundCube
bind_pw: XXXXXXXXXXXXX # пароль
sslpem: mailserver.test.ru.pem # SSL-сертификат для Postfix/Dovecot/Apache2
imap_quota_ldap_attribute: st # Аттрибут для хранения значения IMAP4-квоты в байтах
tasks:
- name: Install MailServer Software
apt:
pkg:
- htop # Диспетчер процессов
- dstat # Анализ производительности сети и дисков
- net-tools # сетевые утилиты ifconfig и route
- dnsutils # DNS-утилиты nslookup и dig
В принципе все параметры говорят сами за себя. Проблемы были с UID/GID от Postfix - везде параметры разные от системы к системе (Dovecot у меня лезет в ящики тоже с этими ID-никами - на Astra сразу возникли с этим проблемы (Parsec), на RedOS тоже (SELinux). В Playbook-ах это учтено чуток. В Wiki это описано в подразделах. Понимаю, что можно было заморочиться и сразу после установки Postfix узнать текущие UID/GID (из файлов /etc/passwd и /etc/group) - далее это все в переменные и потом уже их использовать для подстановки в Template. Не сделал, чтобы не перегружать Playbook (но я так умею, да да!).
В каталоге Template лежат настроенные конфиги от Postfix/Dovecot/Roundcube - и прописанными в нужных местах {{ variable }} переменными. С ними кстати практически не было особых проблем при портировании.
Первый task в Playbook естественно установка пакетов. В описанных вариантах у меня apt, apt_rpm и dnf. 4 Linux, 3 варианта. Это Linux, че Вы хотели ))) Тут у всех свой набор, свои тараканы. В Astra вообще нет Roundcube, поэтому установка крайней версии их архива.
Особенности адаптации к ALT Linux Server 10.1
в самом начале в секции apt нужно указать apt_rpm, так как в ALT немного другой APT
из каталога /etc/control.d/facilities нужно убрать все файлы, которые контролируют службы Postfix/Dovecot
в файле main.cf службы Postfix (SMTP) нужно добавить: compatibility_level = 3.6 и virtual_minimum_uid = 1
в файле master.cf службы Postfix (SMTP) нужно раскомментировать строчку smtp inet n - y - - smtpd
В настройки Ansible в файле ansible.cfg нужно явно указать версию Python 3.x: interpreter_python = /usr/bin/python3
Настройки WEB-сайта с RoundCube находятся по другому пути: /etc/httpd2/conf/extra-available/roundcube.conf
uid и gid от Postfix в ALT Server не совпадают с Debian (а они в множестве файлов используются). Исправляем
Если у нас LDAP-сервер не Active Directory - а, например, ALT Linux Domain на Samba - отключите LDAPS в /etc/samba/smb.conf (параметр ldap server require strong auth = no).
Механизм control кстати сильно напряг - не сталкивался ранее с ним, хотя что-то на ALT поднимал и не раз. Но вот именно на Postfix он для меня стал неким препятствием )))
Особенности адаптации к Astra Linux
Главное - мы ходим юзером и через sudo повышаем свои привилегии:
root@astra:~/Ansible# cat ansible.cfg
[defaults]
inventory = /root/Ansible/hosts
remote_user = user
private_key_file = /root/Ansible/id_rsa
host_key_checking = False
[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false
default_become = true
Остальное смотрите в WiKi. Вообще даже в версии Орел была ругань на MAC и смену UID-ов. Мне не понравилось ))) Но работает.
Особенности адаптации к RedOS
Отключить SELinux (в Playbook есть)
Пакетный менеджер - dnf (не apt и не apt_rpm)
Для RedOS делал последним адаптацию - и честно говоря уже на Roundcube я подустал - поэтому не дописал. Но если Вы прочитаете WiKi - легко сделаете сами. Я в Вас верю, дорогие читатели!
Что в итоге
Получили 4 набора Ansible, которые позволят по быстрому поднять почтарь (SMTP/POP3/IMAP4) с интеграцией в LDAP (AD/Samba), WEB-интерфейсом (Roundcube) и адресной книгой в LDAP (уже донастроен Roundcube). Тыц тыц и в продакшн, как иначе.
Ну и конечно если все внимательно прочитать и попробовать - хорошее понимание, как работают Postfix/Dovecot и их интеграцию с чем либо (LDAP/SQL/etc).
А еще по моему личному мнению мы получим работающий вариант отечественного почтового сервера (понятно, что без ФСТЭК-сертификатов и без нахождения в реестре отечественного ПО). Но это спорный вопрос аля курицы и яйца. Если мы купили отечественную ОС и поставили софт на нее из отечественного репозитория - является ли полученное решение отечественным (импортозамещенным). Я считаю что да, кто то считает что нет. Но правильно обратиться к юристам и создать прецедент. Тоже самое про СУБД из отечественных репозиториев и т.д. Рано или поздно должна быть ясность в этих вопросах, я так считаю. Пока же все мнения - лишь мнения, окончательную точку нужно ставить юридически правильно (ладно, все это лишь повод поспорить - но у меня реально иногда пригорает от не проработанности этого вопроса - является ли весь софт из отечественного репозитория кашерным. Например внутри RuPost сидят Postfix/Dovecot - и все, мы тоже так хотим. Но не покупая RuPost).
В конце статьи маленький опрос - каким почтовым сервером Вы пользуетесь в настоящее время. Всем спасибо за потраченное время и мнения!
Комментарии (25)
livanov
02.11.2023 23:43+1В статье вы упомянули проблемы с SSD на Astra Linux. Могли бы вы рассказать, как эти проблемы влияют на работу почтового сервера, какого вида эти проблемы и их решение?
Dorlas Автор
02.11.2023 23:43В Astra Special Edition есть модуль Parsec и режимы целостности и конфиденциальности (режимы Смоленск и Воронеж). Есть режим Орел, в котором это отключено. В ходе портирования в Dovecot были ошибки, из-за которых не работало. Исправил установкой пакета astrase-fix-maildir.
Но несмотря на это, в режиме Орел все равно в журнале Dovecot через раз вот такие ошибки идут:ноя 02 14:25:39 astramailserver dovecot[18658]: imap: Error: MAC not enabled, no action required ноя 02 14:25:39 astramailserver dovecot[18658]: imap: Error: MAC not enabled, no action required ноя 02 14:25:39 astramailserver dovecot[18658]: imap(administrator@domain.alt)<18669><9h7oICUJThIKCheq>: /usr/sbin/astrase-fix-maildir '/mbx/domain.alt/administrator/.Sent' ноя 02 14:25:39 astramailserver dovecot[18658]: imap(administrator@domain.alt)<18681><xj79ICUJUBIKCheq>: /usr/sbin/astrase-fix-maildir '/mbx/domain.alt/administrator' ноя 02 14:23:44 astramailserver dovecot[18658]: imap: Error: MAC not enabled, no action required ноя 02 14:23:44 astramailserver dovecot[18658]: imap(administrator@domain.alt)<18669><9h7oICUJThIKCheq>: /usr/sbin/astrase-fix-maildir '/mbx/domain.alt/administrator/.Sent' ноя 02 14:23:44 astramailserver dovecot[18658]: imap: Error: MAC not enabled, no action required ноя 02 14:23:44 astramailserver dovecot[18658]: imap(administrator@domain.alt)<18681><xj79ICUJUBIKCheq>: /usr/sbin/astrase-fix-maildir '/mbx/domain.alt/administrator' ноя 02 14:23:42 astramailserver dovecot[18658]: imap(administrator@domain.alt)<18669><9h7oICUJThIKCheq>: Send mail(level=0, category=0x0, uid=3)
Жить это не мешает, с почтой работать по IMAP4 возможно (Thunderbird/Roundcube), но осадочек остается.
Может кто подскажет, как от этого избавиться - буду рад.
Johan_Palych
02.11.2023 23:43+1Если у Вас administrator@domain.alt, значит и домен domain.alt
Подготовка почтового сервера:
Задаем правильное имя сервера(для примера mail):
hostnamectl set-hostname mail.domain.alt
Имя сервера должно быть в формате FQDN
Заданное имя сервера должно разрешаться в IP-адрес через DNS. Если на момент установки это невозможно, создадим запись в файле hosts:
nano /etc/hosts
127.0.0.1 mail.domain.alt mail
очень важно, чтобы имя FQDN было первым.Dorlas Автор
02.11.2023 23:43Спасибо - в WiKi это есть мелким шрифтом. Но народу будет полезно конечно.
drlight17
02.11.2023 23:43+1Не увидел в голосовании mailcow. Жаль, вещь хорошая! Единственный до недавнего времени серьёзный минус в нем - отсутствие из коробки поддержки ldap. Но сподвижки есть, как и костыли ))
Dorlas Автор
02.11.2023 23:43Интересная штука, спасибо - раньше не попадалась. Так то много всяких Docker контейнеров с почтовыми серверами на просторах. Но тут народ похоже настроен весьма серьезно )
Протестирую в ближайшее время, любопытно стало.
Dorlas Автор
02.11.2023 23:43A company with 15 phones (EAS enabled) and about 50 concurrent IMAP connections should plan 16 GiB RAM. 6 GiB RAM + 1 GiB swap are fine for most private installations while 8 GiB RAM are recommended for ~5 to 10 users. We can help to correctly plan your setup as part of our support.
Понимаю, что это более комплексное решение...но по ОЗУ оно очень требовательно ((((
Dorlas Автор
02.11.2023 23:43Чисто для сравнения - в марте смигрировал одну конторку с бесплатного Yandex Mail на мое решение (Debian). Плюс еще в качестве антиспама rSpamD стоит.
90 пользователей - 4 ядра, 4 Гб ОЗУ (Active ОЗУ не более 2 Гб в рабочее время).
Для мелких фирм дешево и сердито (клиенты WEB, Thunderbird, Outlook).
drlight17
02.11.2023 23:43+1Позиционируется как groupware. А вообще есть 2 конторы по 120 примерно пользователей. Работает внутри виртуалки с 3 Гб ОЗУ и 4 ядрами на hdd, даже не ssd. Модифицировано для поддержки ldap и roundcube вместо штатного sogo. Ну, ещё прикручена моя просматривалка логов. Пару лет полёт нормальный без тормозов.
click0
А где полноценные роли Ansible?
В чем смысл выкладывать набор шаблонов без самих переменных, а тем более без тасков?
Где набор шаблонов под FreeBSD?
mc2
И ещё один вопрос: содержимое в виде tar в гитхабе?
Dorlas Автор
Не кашерно? Ну был бы сайт отдельный свой, выложил бы там. Почему бы и нет, законом не запрещено вроде )
dbax
Правильно!
"Зачем вообще этот Ваш Гитхаб. Есть же Яндекс диск!"
Dorlas Автор
Слишком простая задачка из одного Playbook, чтобы выделять роли. Для меня это избыточно в данной задаче
Все в postfix.yml. Переменные + около 35 тасков.
Для FreeBSD не делал и пока не планирую. Пакеты Postfix/Dovecot разрабы все еще собирают без LDAP. И если для Postfix в pkg есть пакетик с LDAP, то для Dovecot нет - явно придется пересобирать через ports. Ну в общем мне пока без надобности, да и теме статьи это не соответствует.
click0
Для плейбука свыше 5 тасков оформлять в роль.
К тому же у вас шаблоны мульти ОС, которые можно обьединить в одну роль.
Тем более в роль, ибо у вас помимо tasks есть и handlers.
Что именно делалось для FreeBSD ?
Dorlas Автор
На FreeBSD изначально эта связка изучалась и настраивалась. Описано тут: https://github.com/Dorlas/mailserver-ansible/blob/main/Postfix_Dovecot_Roundcube_Active_Directory.mhtml
click0
Теперь еще конвертить письмо в markdown разметку...
Dorlas Автор
А просто открыть Google Chrome или его клонами ?
DaemonGloom
А если просто открыть его - можно получить кучу тегов и текста без его декодирования.
Примерно таких вот
<!-- TOC START --> <div id=3D"dw__toc" class=3D"dw__toc"> <h3 class=3D"toggle open" style=3D"cursor: pointer;"><strong><span>=E2=88= =92</span></strong>=D0=A1=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B0=D0=BD=D0=B8= =D0=B5</h3> <div aria-expanded=3D"true" style=3D"">
Dorlas Автор
А так лучше?
https://disk.yandex.ru/i/AvY-qaTDTB6owQ
DaemonGloom
Да, так открывается. Но многие ссылки ведут на 192.168.1.249.
Dorlas Автор
Да, я в курсе ) Все нужные архивы на GitHub.