📨 Сначала прочитайте предыдущую часть!
Это пятый пост серии "Настройка почтового сервера на Linux".
В предыдущем посте мы проанализировали 4 обязательных конфигурационных файла Dovecot. Если вы еще не читали его, я рекомендую сначала ознакомиться.
👉 Предыдущий пост: Анализ обязательных конфигурационных файлов Dovecot


🔄 Инструкции по изменению порядка
В предыдущей части я анонсировал, что "в следующем посте будет рассмотрена настройка auth-sql.conf.ext", но,
при написании статьи я пришел к выводу, что сначала имеет смысл объяснить проектирование таблицы БД.

Таким образом, в этой статье мы рассмотрим концепцию виртуальных пользователей Dovecot и проектирование таблицы PostgreSQL,
а в следующем посте будет объяснено настройка auth-sql.conf.ext, связывающая Dovecot и PostgreSQL.


🎯 Что такое виртуальные пользователи Dovecot? Зачем они нужны?

Способы аутентификации пользователей в Dovecot можно разделить на две основные категории.

  1. Аутентификация на основе системных учетных записей
  2. Аутентификация с использованием файлов /etc/passwd и /etc/shadow
  3. Использование обычных системных учетных записей
  4. Управление учетными записями затруднительно, сложно создать учетные записи только для почты

  5. Аутентификация на основе виртуальных пользователей (Virtual Users)

  6. Аутентификация с использованием отдельной базы данных (PostgreSQL, MySQL и т.д.)
  7. Возможность управления учетными записями почты, независимыми от системных учетных записей
  8. Высокая безопасность и масштабируемость, подходящие для крупномасштабных почтовых сервисов

Мы планируем создать виртуальную среду пользователей с использованием PostgreSQL.
Это означает, что мы будем аутентифицировать пользователей, получая информацию из базы данных, не создавая реальные учетные записи в Linux.

🔹 Преимущества виртуальной пользовательской среды

  • Высокая безопасность, отдельно от системных учетных записей
  • Легкое добавление и удаление пользовательских учетных записей
  • Поддержка нескольких доменов (возможность управления несколькими почтовыми доменами на одном сервере)
  • Отличная масштабируемость и простота управления

Pigeon holding a letter near a database


🛠️ Проектирование таблиц в PostgreSQL

Чтобы адекватно управлять виртуальными пользователями в Dovecot, необходимо минимум 3 таблицы.

1️⃣ Основные таблицы

  1. mail_domain - список доменов, управляемых почтовым сервером
  2. mail_users - информация о реальных почтовых пользователях
  3. mail_alias - управление почтовыми псевдонимами (пересылка)

Причина разделения заключается в масштабируемости и удобстве обслуживания.
Это очень полезно, если в дальнейшем мы будем управлять несколькими почтовыми доменами или пересылать определенные электронные письма на другие адреса.


2️⃣ Схема таблицы и примеры SQL

📌 1. mail_domain (Управление списком доменов)
Таблица для управления доменами, разрешенными на почтовом сервере.
То есть определяются почтовые домены, такие как example.com, mydomain.com.

CREATE TABLE mail_domain (
    id SERIAL PRIMARY KEY,
    domain_name VARCHAR(255) NOT NULL UNIQUE,
    active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 Объяснение
- domain_name → почтовой домен (например: example.com)
- active → следует ли использовать данный домен (можно деактивировать)
- created_at → дата создания

Пример вставки образца данных

INSERT INTO mail_domain (domain_name) VALUES ('example.com');
INSERT INTO mail_domain (domain_name) VALUES ('mydomain.com');

📌 2. mail_users (Учетные записи почтовых пользователей)
Здесь сохраняется информация о пользователях, которые будут использовать почту.
Каждый пользователь должен принадлежать определенному домену.

CREATE TABLE mail_users (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    email VARCHAR(255) NOT NULL UNIQUE,
    password TEXT NOT NULL,
    home_directory TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 Объяснение
- domain_id → связь с id таблицы mail_domain (домен пользователя)
- email → адрес электронной почты пользователя (user@example.com)
- password → хранение зашифрованного пароля
- home_directory → путь к хранилищу почты (/var/mail/vmail/user@example.com)
- created_at → дата создания учетной записи

Пример вставки образца данных

INSERT INTO mail_users (domain_id, email, password, home_directory)
VALUES (1, 'user@example.com', 'hashed_password_here', '/var/mail/vmail/user@example.com');

📌 3. mail_alias (Почтовые псевдонимы / Пересылка) Необходима для пересылки почтового адреса на другой адрес или для использования нескольких псевдонимов для одного адреса.

CREATE TABLE mail_alias (
    id SERIAL PRIMARY KEY,
    domain_id INT NOT NULL REFERENCES mail_domain(id) ON DELETE CASCADE,
    source_email VARCHAR(255) NOT NULL,
    destination_email VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT NOW()
);

🔹 Объяснение

  • source_email → исходный адрес электронной почты (например: contact@example.com)
  • destination_email → адрес электронной почты, на который будет передаваться (например: admin@example.com)
  • Функция автоматически пересылает определенные электронные письма на другой адрес

Пример вставки образца данных

INSERT INTO mail_alias (domain_id, source_email, destination_email)
VALUES (1, 'contact@example.com', 'admin@example.com');

Теперь почта, приходящая на contact@example.com, будет автоматически пересылаться на admin@example.com.

🔍 Рекомендуемые таблицы для будущего расширения

Кроме основного почтового сервиса, можно добавить дополнительные функции. Ниже приведены примеры таблиц, которые могут быть расширены в будущем.

Название таблицы Роль
mail_quota Ограничение почтового объема на пользователя
mail_blacklist Список блокируемых адресов электронной почты
mail_whitelist Список разрешенных адресов электронной почты
mail_forwarding Пересылка на внешние почтовые аккаунты
mail_autoresponder Управление автоматическими ответами
mail_address_book Управление внутренним адресным book

🏁 Итоги и следующие шаги

Темы, рассмотренные в этой статье
- Концепция и необходимость виртуальных пользователей Dovecot
- Проектирование таблиц PostgreSQL (mail_domain, mail_users, mail_alias)
- Рекомендации по дополнительным таблицам для расширения управления электронной почтой

Анонс следующего поста: настройка auth-sql.conf.ext и способы хеширования паролей
Теперь таблицы базы данных готовы. В следующем посте мы объясним, как Dovecot получает информацию о пользователях из PostgreSQL и выполняет аутентификацию,
и рассмотрим способы хеширования паролей, которые будут использоваться в учетных записях почтовых пользователей.

В частности, мы сравним особенности и различия в безопасности методов MD5, SHA-256, BCRYPT,
а также подробно рассмотрим, как каждую из этих методов применить в Dovecot и PostgreSQL.

👉 Следующий пост: Настройка auth-sql.conf.ext и методы хеширования паролей (Скоро!)