Вступ
Оскільки на моїй Raspberry Pi вже встановлено та налаштовано Postfix + Dovecot через підключення до БД, то виникає потреба адмініструвати поштові скриньки. Для зручності адміністрування реалізовано через веб інтерфейс сервісом PostfixAdmin. Як цей сервіс встановити та налаштувати, я покроково опишу в цьому дописі.
Вимоги для PostfixAdmin
Для установки PostfixAdmin мені майже нічого не потрібно додатково встановлювати, адже багато сервісів були встановлені на попередньому етапі – при встановленні Postfix та Zabbix. Проте не буде зайвим перевірити вже існуючі пакети та залежності. Надалі в цій статті я буду вважати, що у вас вже встановлені та налаштовані всі залежності, а саме:
- PHP – php php-mbstring php-intl php-imap php-curl php-mysql php-xml php-sqlite3
- Apache – apache2
- СУБД MariaDB – mariadb-client mariadb-server
- Супутні пакети – unzip git composer
Перед початком як завжди треба оновити пакети:
sudo apt update && sudo apt upgrade
Після перевірки та встановлення необхідних залежностей переходимо до встановлення PostfixAdmin
Встановлення PostfixAdmin
Завантаження PostfixAdmin відбувається через гіт репозиторій.
cd /var/www/html
sudo git clone https://github.com/postfixadmin/postfixadmin.git
sudo chown -R www-data:www-data postfixadmin
cd postfixadmin
Щоб оптимізувати процес встановлення, можна запустити файл install.sh, який встановить composer, PHP бібліотеки та директорію templates_c. В майбутньому це позбавить від помилок.
chmod +x install.sh
./install.sh
Після установки можна переходити до бази даних.
Створення БД для PostfixAdmin
Для цього потрібно підключитися до вже існуючої або щойно створеної БД:
sudo mysql -u root -p<password>
Створення БД та користувача, та надання доступу для цього користувача для взаємодії з БД:
CREATE DATABASE postfixadmin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'postfixuser'@'localhost' IDENTIFIED BY '<password>';
GRANT ALL PRIVILEGES ON postfixadmin.* TO 'postfixuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Після того, як БД та користувач визначені переходимо до налаштування конфігурації PostfixAdmin
Редагування конфігурації
Основні файли вже знаходяться в директорії за адресою: /var/www/html/postfixadmin. В цій директорії замість того, щоб редагувати основний файл config.inc.php треба створити файл config.local.php та прописати там основні параметри конфігурації. В майбутньому при оновленні цей файл конфігурації не буде замінений чи пошкоджений.
sudo nano config.local.php
В ньому змінюємо або додаємно наступні рядки:
$CONF['configured'] = true;
$CONF['default_language'] = 'en';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixudmin';
$CONF['database_password'] = 'твій_пароль';
$CONF['database_name'] = 'postfixadmin';
$CONF['encrypt'] = 'dovecot:SHA512-CRYPT';
Створення Apache-віртуального хоста
Оскільки Apache може мати багато віртуальних хостів, то треба створити ще один для PostfixAdmin.
sudo nano /etc/apache2/sites-available/postfixadmin.conf
З наступними параметрами:
<VirtualHost *:80>
ServerAdmin admin@localhost
DocumentRoot /var/www/html/postfixadmin/public
ServerName postfixadmin.local
<Directory /var/www/postfixadmin/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/postfixadmin_error.log
CustomLog ${APACHE_LOG_DIR}/postfixadmin_access.log combined
</VirtualHost>
Але якщо ви хочете, щоб PostfixAdmin був доступним тільки з локальної мережі, замініть блок <Directory> із вказанням своєї підмережі на наступний:
<Directory /var/www/html/postfixadmin>
Require ip 127.0.0.1
Require ip 192.168.0.0/24
</Directory>
Для того, щоб зміни вступили в силу, необхідно активувати сайт:
sudo a2ensite postfixadmin.conf
sudo a2enmod rewrite
sudo systemctl reload apache2
Оскільки окрім сервера більше ніхто не знає про домен postfixadmin.local, щоб не прописувати на кожному хості цей домен окремо, я додав цей запис в налаштуваннях свого роутера UXG Lite: Settings -> Routing -> DNS -> Create Entry -> тип запису А. Такі налаштування застосовуються локально майже миттєво.
Після перезавантаження сервера апач, можна переходити до веб інтерфейсу за адресою: http://postfixadmin.local/setup.php
Конфігурація веб сервісу PostfixAdmin
Перше відвідування сторінки http://postfixadmin.local/setup.php запросить згенерувати хеш для щойно створеного паролю. Цей хеш необхідно вписати в файлі конфігурації config.inc.php
$CONF['setup_password'] = '$2y$10$.tW14352cmjVC3N07u9MQOphugNCl5tIOAdwhYLs21XT7/TwR7Lo.';
Здебільшого користувач може зіткнутися ще з помилками, які для подальшого конфігурування є фатальними. Тому, якщо при генеруванні хешу у вас помилки не виникло, то всі прапорці повинні бути зеленими:
Нажаль мене також спіткали помилки, які доволі жваво обговорюються в інтернеті, а саме:
- Password Hashing – attempted to use configured encrypt backend (
dovecot:SHA512-CRYPT
) triggered an error: /usr/bin/doveadm pw failed, see error log for details - You will have problems logging into PostfixAdmin.
- Check out our Dovecot documentation at https://github.com/postfixadmin/postfixadmin/blob/master/DOCUMENTS/DOVECOT.txt, specifically around ‘3. Permissions’.
Це означає, що PostfixAdmin не зміг виконати /usr/bin/doveadm pw
, тобто не може генерувати паролі для Dovecot. Іншими словами – doveadm
потребує доступ на dovecot.conf
/сертифікати, яких немає у webserver-користувача www-data
Є багато методів вирішення проблеми із доступом, але я розгляну лише два з них:
Перший метод Небезпечний через долучення групи www-data до групи dovecot:
Необхідно створити новий конфігураційний файл для ключів SSL, скопіювати у цей файл тільки параметри ключів SSL, додати в кінець головного конфігураційного файлу dovecot посилання на допоміжний SSL файл, змінити права та власника для цього файлу та для застосування змін перезавантажити dovecot.
Цей метод мабуть один із найпростіших, проте небезпека полягає в тому, що припустимо якщо на сервері встановлено вордпрес та поштовий сервер, то зловмисник, який отримає несанкціонований доступ до користувача www-data зможе отримати доступ до всіх ресурсів які належать групі Dovecot, наприклад: сокетів, конфігів, кешів, логів з іменами користувачів. Я цей варіант випробував в учбових цілях, проте його не рекомендую, але поділюся налаштуваннями:
sudo nano /etc/dovecot/conf.d/ssl-keys.conf
# додати шлях до сертифікатів
ssl_cert = ...
ssl_key = ...
sudo nano /etc/dovecot/conf.d/10-ssl.conf
# видалити або закоментувати ці рядки
ssl_cert = ...
ssl_key = ...
sudo nano /etc/dovecot/dovecot.conf
# додати в кінці файлу посилання на новий файл
!include_try /etc/dovecot/conf.d/ssl-keys.conf
# змінити права та власника нового файлу додати www-data до групи dovecot
sudo chown root:root /etc/dovecot/conf.d/ssl-keys.conf
sudo chmod 640 /etc/dovecot/conf.d/ssl-keys.conf
sudo usermod -aG dovecot www-data
# перезавантажити сервіси
sudo systemctl restart dovecot apache2
Другий метод налаштування доступу з пониженим ризиком:
Він передбачає ізоляцію між веб-сервером і поштовим сервером через надання дозволу користувачу www-data до сертифікатів, проте в мене такий метод не спрацював!
sudo setfacl -R -m u:www-data:rx /etc/letsencrypt/live/ /etc/letsencrypt/archive/
sudo setfacl -R -m u:www-data:rwx /var/run/dovecot/stats-reader /var/run/dovecot/stats-writer
Після внесення змін перезавантажити сторінку та знову ввести пароль суперадміністратора. Для мене рішення було дієвим, тому в мене помилки зникли.

Будемо рухатися далі, а саме створення суперкористувача! Для цього треба заповнити форму на 4 поля:
- Setup password – ввести поточний пароль
- Admin – email для входу суперадміністратора
- Password – складний пароль
- Password (again) – повторити складний пароль
Після цього натиснути на кнопку Add Admin.

Про успішне створення буде свідчити рядок:
Super admins – The following ‘super-admin‘ accounts have already been added to the database.
Після того, як суперкористувач створений, можна логінитись і надалі продовжувати налаштування Для цього переходимо на сторінку логіна http://postfixadmin.local/login.php

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

Додаємо домен
На дашборді клацаємо кнопку “Overview“, і відкривається вікно де треба створити домен. Натискаємо кнопку Add Domain
У вікні Add a new domain буде декілька полів які треба заповнити:
- Domain – мій домен для пошти як на цьому сайті – ostrich.kyiv.ua
- Description – звичайний опис, поле не обов’язкове, але я його заповнив – Ostrich mail domain
- Forwards – це кількість переадресацій поштових скриньок, я ввів 15 думаю достатньо
- Mailboxes – це кількість поштових скриньок загалом які може бути створено в цьому поштовому сервері, я ввів 15 думаю достатньо
- Mail server is backup MX – галочки не повинно бути, бо це основний сервер а не другорядний
- Active – галочка повинна бути, щоб домен був активним
- Add default mail aliases – якщо галочка встановлена то буде створено 4 аліаси: abuse, hostmaster, postmaster, webmaster

Додаємо поштову скриньку
На дашборді клацаємо кнопку “Add Mailboxes“, і відкривається вікно “Create a new mailbox for your domain.” де треба заповнити форму для нового користувача.
- Username – назва користувача (поштової скриньки) для домену ostrich.kyiv.ua
- Password – складний пароль
- Password (again) – повторити складний пароль
- Name – повне ім’я користувача
- Quota – для тестового користувача встановив квоту на 10 мегабайт, проте якщо поле порожнє, тоді квота не застосовується
- Active – поставив галочку щоб активувати цей емейл
- Send Welcome mail – поставив галочку, щоб при тестуванні поштового клієнта отримати вітальний лист від сервера
- Other e-mail – поштова скринька для відновлення пароля
Після заповнення форми клацаємо Add Mailbox і пошта миттєво створюється

Зміна конфігурації Postfix та Dovecot
В мене раніше було створено три файли конфігурації, їх треба змінити, а саме замінити ім’я користувача, пароль та назву БД для підключення, SQL запит залишається без змін. В мене ці файли знаходяться за базовою адресою: /etc/postfix/
- mysql-virtual-mailbox-domains.cf
user = postfixuser
password = <password>
hosts = 127.0.0.1m
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' AND active = 1
- mysql-virtual-mailbox-maps.cf
user = postfixuser
password = <password>
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
- mysql-virtual-alias-maps.cf
user = postfixuser
password = <password>
hosts = 127.0.0.1
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = 1
Конфігурація підключення до БД також повинна бути прописана в файлі dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=postfixadmin user=postfixuser password=<password>
default_pass_scheme = SHA512-CRYPT
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = 1
Більше ніякий змін в конфігурацію не повинно бути внесено, тому можна перезавантажувати сервіси і перевіряти роботу пошти
sudo systemctl restart postfix
sudo systemctl restart dovecot
Перевірка пошти
Якщо раніше був налаштований thunderbird то він продовжить працювати в штатному режимі, при умові, якщо пароль до поштової скриньки не було змінено. Так само вийшло і в мене, при відкритті поштового клієнта я отримав вітального листа від сервера, що свідчить про правильні налаштування.

Висновки
PostfixAdmin — потужний інструмент для адміністрування поштових скриньок через веб-інтерфейс. Його інтеграція з Dovecot дозволяє централізовано створювати, редагувати й видаляти поштові акаунти. Попри деякі труднощі з правами доступу, завдяки правильно підібраному рішенню ви отримаєте безпечне та стабільне середовище для керування поштою.