Для работы персонального сервера достаточно минимальных ресурсов арендованного сервера. Данная конфигурация будет работать на 1ГБ ОЗУ, 1 Ядре процессора и 15ГБ дискового пространства.
После установки ОС я сразу же установлю нужные мне для администрирования пакеты, произведу начальную настройку (опц).
apt update && apt upgrade -y
apt install sudo mc lnav neofetch fail2ban rsyslog -y
systemctl start fail2ban
systemctl enable fail2ban
Установим правильное время и часовой пояс в зависимости от потребности.
timedatectl set-timezone Europe/Samara
Список доступных зон:
timedatectl list-timezones
Так как сервер имеет прямой выход в интернет мы будем использовать для него полное доменное имя (FQDN). Переименуем сервер:
hostnamectl set-hostname mail.net-runner.ru
Проверим имя после перезагрузки:
hostname
Для работы почты необходимы следующие записи для домена:
Эти записи вносятся на DNS сервере, который отвечает за делегирование домена в интернете. Можно использовать свои DNS, однако тогда придется иметь два сервера (требование RFC, по которому регистраторы доменных имен требуют наличия минимум двух DNS-серверов)
ДОПОЛНИТЬ ПРО ДНС
Postfix - это современный агент передачи сообщений (MTA), также известный как SMTP-сервер, который служит двум целям: отправка и получение электронной почты.
Установим Postfix на нашем Debian 12:
apt-get update
apt-get install postfix -y
Во время установки выбираем вариант Internet Site, как на рисунке.
Так же вводим полное имя нашего домена на следующей странице.
Важно! В будущем, при обновлении уже настроенного пакета Postfix следует выбирать вариант No configuration, иначе Вы затрете все настройки на дефолтные.
Теперь проверим, какая версия Postfix установилась:
postconf mail_version
На Debian 12 значение было: mail_version = 3.7.6
Теперь проверим, слушает ли служна порт 25:
ss -lnpt | grep master
Вывод:
LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("smtpd",pid=1700,fd=6),("master",pid=1640,fd=13))
LISTEN 0 100 [::]:25 [::]:* users:(("smtpd",pid=1700,fd=7),("master",pid=1640,fd=14))
Исходящий TCP-порт 25 должен быть открыт, чтобы Postfix мог отправлять электронные письма на другие SMTP-серверы. Исходящий TCP-порт 25 контролируется вашим хостинг-провайдером и мы можем установить утилиту, чтобы проверить, открыт он или заблокирован.
apt install telnet
telnet gmail-smtp-in.l.google.com 25
Если он не заблокирован, вы увидите сообщения, подобные приведенным ниже:
Trying 64.233.162.27...
Connected to gmail-smtp-in.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP j4-20020a2e8004000000b002b9b63a2615si1502341ljg.624 - gsmtp
Для выхода используйте quit
Если порт закрыт, решайте вопрос с провайдером.
Идем далее. На самом деле, уже сейчас можно отправить тестовое письмо из командной строки. Но, вероятнее всего, письмо попадет в спам, так как не соблюдены некоторые условия (PTR запись, DKIM, DMARC).
echo "test email" | sendmail your-account@gmail.com
Теперь давайте увеличим максимальный размер вложения в почту до 50МБ:
postconf -e message_size_limit=52428800
Проверка:
postconf | grep message_size_limit
После вненсения любых изменений в Postfix его придется перезапускать:
systemctl restart postfix
По умолчанию Postfix использует имя хоста, но оно может именится. Поэтому добавим FQDN имя в конфигурацию:
nano /etc/postfix/main.cf
Найдем там строку:
myhostname = mail.example.com
…и заменим ее на свою в формате FQDN: mail.net-runner.ru
По умолчанию Postfix использует протоколы IPv4 и IPv6. Если ваш почтовый сервер не имеет публичного IPv6-адреса, лучше отключить IPv6 в Postfix, чтобы предотвратить ненужные IPv6-соединения. Просто выполните следующую команду, чтобы отключить IPv6 в Postfix.
postconf -e "inet_protocols = ipv4"
systemctl restart postfix
Важно указать для Postfix, для каких доменов он будет доставлять почту в свое хранилище. Замените мой домен на свой.
sudo postconf -e "mydestination = net-runner.ru, \$myhostname, localhost.\$mydomain, localhost"
На этом минимальная настройка Postfix закончена.
Для дальнейшей настройки и работы почты в фаерволе должны быть открыты порты: 25, 80,443,587,465,143,993/tcp
Когда мы настраиваем наши настольные почтовые клиенты, всегда полезно включить шифрование TLS, чтобы хакеры не могли следить за нашей электронной почтой. Мы можем легко получить бесплатный TLS-сертификат от Let’s Encrypt. Выполните следующие команды, чтобы установить Let’s Encrypt client (certbot) на сервер Debian из репозитория программного обеспечения по умолчанию:
apt update
apt dist-upgrade -y
apt install certbot -y
Если у вас еще не запущен веб-сервер, я рекомендую вам установить его Nginx, потому что получить и установить TLS-сертификат с веб-сервером проще, чем использовать другие методы.
apt install nginx python3-certbot-nginx -y
Создадим виртуальный хост Nginx перед получением TLS-сертификата Let’s Encrypt. Создайте файл виртуального хоста: mail.net-runner.ru
nano /etc/nginx/conf.d/mail.net-runner.ru.conf
Содержимое файла:
server {
listen 80;
listen [::]:80;
server_name mail.net-runner.ru;
root /usr/share/nginx/html/;
location ~ /.well-known/acme-challenge {
allow all;
}
}
И убедимся в существовании директори:
mkdir -p /usr/share/nginx/html/
Теперь получим сам сертификат, заменив значения почты и домена на свои:
certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email you@example.com -d mail.example.com
Существует возможность атвоматического продления сертификата. Для этого нужно создать задание в cron
@daily certbot renew --quiet && systemctl reload postfix dovecot nginx
Перезапуск демонов Dovecot, Postfix и Nginx необходимо для того, что бы они подхватили новый сертификат.
Чтобы отправлять электронные письма из настольного почтового клиента, нам нужно включить службу отправки Postfix, чтобы почтовый клиент мог отправлять электронные письма на SMTP-сервер Postfix. Отредактируйте файл /etc/postfix/master.cf
nano /etc/postfix/master.cf
Раскомментируйте или добавьте следующие строки.
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_tls_wrappermode=no
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
Приведенная выше конфигурация включает демон отправки Postfix и требует шифрования TLS.
Почтовый клиент Microsoft Outlook поддерживает отправку только через порт 465. Если вы собираетесь использовать Microsoft Outlook, то вам также необходимо включить службу отправки на порту 465, добавив следующие строки в файл.
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
Далее нам нужно указать расположение TLS-сертификата и закрытого ключа в конфигурационном файле Postfix.
nano /etc/postfix/main.cf
Замените mail.example.com на свой домен!
#Enable TLS Encryption when Postfix receives incoming emails
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_security_level=may
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
#Enable TLS Encryption when Postfix sends outgoing emails
smtp_tls_security_level = may
smtp_tls_loglevel = 1
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
#Enforce TLSv1.3 or TLSv1.2
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
Сохраняем изменения и перезапускаем службу:
systemctl restart postfix
Проверим, слушает ли нужныем нам порты Postfix:
ss -lnpt | grep master
Вывод будет примерно таким:
LISTEN 0 100 0.0.0.0:587 0.0.0.0:* users:(("master",pid=1535,fd=17))
LISTEN 0 100 0.0.0.0:25 0.0.0.0:* users:(("master",pid=1535,fd=13))
LISTEN 0 100 0.0.0.0:465 0.0.0.0:* users:(("master",pid=1535,fd=20))
Для установки используем команду:
apt install dovecot-core dovecot-imapd
Проверим установленную версию:
dovecot --version
Теперь включим протокол IMAP (POP3 я не буду использовать на этом сервере, считаю что он устарел). Для этого редактируем файл /etc/dovecot/dovecot.conf
nano /etc/dovecot/dovecot.conf
Находим нужную строку и добавляем значение:
protocols = imap
По умолчанию Postfix и Dovecot хранят почту в каталоге /var/mail в формате mbox. Это легко проверить командой:
postconf mail_spool_directory
Ответ сервера будет:
mail_spool_directory = /var/mail
Чаще всего удобнее хранение почты в формате Maildir. Для того, что бы сообщения каждого пользователя хранились в своем домашнем каталоге редактируем файл:
nano /etc/dovecot/conf.d/10-mail.conf
Изменим строку mail_location = mbox:~/mail:INBOX=/var/mail/%u на:
mail_location = maildir:~/Maildir
Сохраняем файл. Теперь добавим пользователя dovecot в группу mail, что бы он мог читать входящие сообщения:
adduser dovecot mail
Несмотря на то, что мы настроили Dovecot для хранения писем в нужном нам формате, Postfix использует встроенный локальный агент доставки (LDA) для перемещения входящих писем в хранилище сообщений (входящие, отправленные, корзина, нежелательная почта и т. д.), и они будут сохранены в формате Maildirmbox
Нам нужно настроить Postfix для передачи входящих писем в Dovecot по протоколу LMTP, который является упрощенной версией SMTP, поэтому входящие электронные письма будут сохраняться в формате Dovecot. LMTP обеспечивает высокую масштабируемость и надежность почтовой системы. Также в будущем это позволит использовать плагин для фильтрации входящих сообщений в разные папки maldirsieve.
Установим LMTP сервер:
apt install dovecot-lmtpd
Далее редактируем конфигурационный файл Dovecot:
nano /etc/dovecot/dovecot.conf
Добавим в списке поддерживаемых протоколов LMTP:
protocols = imap lmtp
Идем далее. Открываем файл:
nano /etc/dovecot/conf.d/10-master.conf
Добавим следующие строки:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
Будте внимательны со скобками, особенно при редактировании уже имеющихся параметров!
Снова идем в основной файл конфигурации Postfix
nano /etc/postfix/main.cf
Добавьте следующие строки в конец файла. Первая строка указывает Postfix доставлять входящие электронные письма в локальное хранилище сообщений через сервер Dovecot LMTP. Вторая строка отключает SMTPUTF8 в Postfix, так как Dovecot-LMTP не поддерживает это расширение электронной почты.
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtputf8_enable = no
Откроем конфигурационный файл аутентификации.
nano /etc/dovecot/conf.d/10-auth.conf
Отключим аутентификацию в виде открытого текста, если нет шифрования SSL/TLS. Для этого раскомментируем или добавим строку:
disable_plaintext_auth = yes
Затем найдем следующую строку:
#auth_username_format = %Lu
Уберем комментарии и исправим ее:
auth_username_format = %n
По умолчанию, когда Dovecot пытается найти или доставить электронные письма для пользователя, он использует полный адрес электронной почты. Поскольку пока что мы настроили только канонических пользователей почтовых ящиков (используя пользователей ОС в качестве пользователей почтовых ящиков), Dovecot не может найти пользователя почтового ящика в полном доменном формате (username@example.com), поэтому нам нужно удалить часть домена, тогда Dovecot сможет найти пользователя почтового ящика. Это также позволяет нам использовать полный адрес электронной почты (username@example.com) для входа в систему.
В этом же файле включим механизм проверки подлинности PLAIN. LOGIN — это еще один механизм аутентификации, который вы, вероятно, захотите добавить для поддержки старых почтовых клиентов.
auth_mechanisms = plain login
Отредактируйте конфигурационный файл SSL/TLS.
nano /etc/dovecot/conf.d/10-ssl.conf
Измените ssl = yes на ssl = required для принудительного шифрования.
ssl = required
Затем найдите следующие строки.
ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.key
По умолчанию Dovecot использует самозподписанный TLS-сертификат. Замените их значениями, которые указывают местоположение вашего TLS-сертификата Let’s Encrypt, который мы получили ранее.
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
Найдите и измените следующую строку:
#ssl_prefer_server_ciphers = no
Рекомендуется отдавать приоритет порядку вариантов шифрования серверу, а не клиенту. Поэтому изменим значение этой строки на yes
ssl_prefer_server_ciphers = yes
Затем найдите следующую строку.
#ssl_min_protocol = TLSv1
Измените значение, как указано ниже, чтобы отключить небезопасные протоколы SSLv3, TLSv1 и TLSv1.1.
ssl_min_protocol = TLSv1.2
Отредактируйте следующий файл.
nano /etc/dovecot/conf.d/10-master.conf
Добавим следующие значения, чтобы Postfix мог найти сервер аутентификации Dovecot.
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
Сохраним изменения и перезапустим службы:
systemctl restart postfix dovecot
Теперь проверим, какие порты случает Dovecot:
ss -lnpt | grep dovecot
Вывод:
LISTEN 0 100 0.0.0.0:143 0.0.0.0:* users:(("dovecot",pid=6304,fd=36))
LISTEN 0 100 0.0.0.0:993 0.0.0.0:* users:(("dovecot",pid=6304,fd=37))
Теперь можно проверить работу почты, с помощью клиента Thunderbird.
Пользователю ROOT не разрешено авторизоваться в Dovecot. Для проверки работы нужно создать нового пользователя.
Мы имеем работающий почтовый сервер в минимальной конфигурации. Он может получать и отправлять почту по шифрованному каналу. Ее недостаток сейчас - пользователи почты должны быть заведены на сервере как пользователи Debian. Для решения этой проблемы позже мы настроим возможность работы с виртуальными пользователями.
Если по какой-либо причинепроцесс Dovecot завершен, необходимо выполнить следующую команду, чтобы перезапустить его:
systemctl restart dovecot
Вместо того, чтобы вводить эту команду вручную, мы можем сделать так, чтобы Dovecot автоматически перезапускался. Для этого настроим systemd. Переопределим конфигурацию службы systemd создав отдельный каталог .dovecot.service
mkdir -p /etc/systemd/system/dovecot.service.d/
Затем создайте файл в этом каталоге.
sudo nano /etc/systemd/system/dovecot.service.d/restart.conf
Добавьте в файл следующие строки, которые заставят Dovecot автоматически перезапускаться через 5 секунд если будет обнаружен сбой.
[Service]
Restart=always
RestartSec=5s
Сохраните и закройте файл. Затем перезагрузите systemd.
sudo systemctl daemon-reload
Проверим, сработала ли наша настройка. Завершим процесс Dovecot:
sudo pkill dovecot
Затем проверим состояние службы и увидим, что она снова работает:
systemctl status dovecot
С виртуальными почтовыми ящиками нам не нужно создавать локальную учетную запись Debian для каждого адреса электронной почты. Если вы собираетесь настроить почтовый сервер для компании или организации, всегда лучше иметь простой способ создания виртуальных почтовых ящиков в веб-интерфейсе, который также позволяет пользователям изменять свои пароли. Вот тут-то и приходит на помощь PostfixAdmin.
PostfixAdmin написан на PHP и для работы требуется базы данных (MySQL/MariaDB, PostgreSQL или SQLite). В этой статье будет использоваться база данных PostgreSQL. Введите следующую команду, чтобы установить PostgreSQL в Debian:
apt install postgresql postgresql-contrib
После установки сервер базы данных PostgreSQL автоматически запустится. Проверим, слушает ли он нужный нам порт 5432:
ss -lnpt | grep 5432
Вывод:
LISTEN 0 244 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=3762,fd=5))
Теперь нужно создать базу и пользователя в нашей CУБД.
Выполним подключение к PostgreSQL:
sudo -u postgres psql
Имя базы и пользователя можно использовать произвольныые:
CREATE DATABASE postfixadmin;
CREATE USER postfixadmin WITH PASSWORD 'postfixadmin_password';
ALTER DATABASE postfixadmin OWNER TO postfixadmin;
GRANT ALL PRIVILEGES ON DATABASE postfixadmin TO postfixadmin;
Чтобы выйти из консоли нажмите Ctrl+D.
Теперь давайте проверим, получится ли подключиться к СУБД с нашими данными:
psql -h 127.0.0.1 -d postfixadmin -U postfixadmin -W
Находим последнюю версию на сайте https://github.com/postfixadmin/postfixadmin/releases
Скачиваем актуальную версию на сегодняшний день:
apt install wget -y
wget https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.3.13.tar.gz
После загрузки распакуйте архив в каталог и переименуйте его в ./var/www/postfixadmin
mkdir -p /var/www/
tar xvf postfixadmin-3.3.13.tar.gz -C /var/www/
mv /var/www/postfixadmin-postfixadmin-3.3.13 /var/www/postfixadmin
Перейдем к настройке. Откроем основной файл конфигурации PostfixAdmin
nano /var/www/postfixadmin/config.local.php
Добавьте следующие строки в файл, чтобы PostfixAdmin мог подключиться к базе данных PostgreSQL. Замените значения базы, пользователя и пароля на созданные ранее при настройке базы для PosftixAdmin
<?php
$CONF['configured'] = true;
$CONF['database_type'] = 'pgsql';
$CONF['database_host'] = 'localhost';
$CONF['database_port'] = '5432';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfixadmin_password';
$CONF['database_name'] = 'postfixadmin';
$CONF['encrypt'] = 'dovecot:ARGON2I';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw -r 5";
if(@file_exists('/usr/bin/doveadm')) { // @ to silence openbase_dir stuff; see https://github.com/postfixadmin/postfixadmin/issues/171
$CONF['dovecotpw'] = "/usr/bin/doveadm pw -r 5"; # debian
}
Сохраните и закройте файл. Обратите внимание, что мы будем использовать шифрование паролей ARGON2I. По умолчанию PostfixAdmin и Dovecot используют MD5-CRYPT, который является довольно слабыми.
Установим зависимости и модули для PostfixAdmin
curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x
sudo apt update
sudo apt install php8.1-fpm php8.1-imap php8.1-mbstring php8.1-pgsql php8.1-curl php8.1-zip php8.1-xml php8.1-bz2 php8.1-intl php8.1-gmp php8.1-redis
Для работы PostfixAdmin требуется создать дополнительный каталог и выдать соответствующие права для доступа к нему:
sudo mkdir -p /var/www/postfixadmin/templates_c
sudo apt install acl
sudo setfacl -R -m u:www-data:rwx /var/www/postfixadmin/templates_c/
Начиная с Dovecot 2.3.11, пользователю веб-сервера (www-data) требуется разрешение на чтение TLS-сертификата Let’s Encrypt для хеширования пароля. Выполните следующие две команды, чтобы предоставить разрешения.
sudo setfacl -R -m u:www-data:rx /etc/letsencrypt/live/ /etc/letsencrypt/archive/
Теперь создадим файл виртуального хоста для нашего PostfixAdmin в Nginx.
nano /etc/nginx/conf.d/postfixadmin.mail.net-runner.ru.conf
server {
listen 80;
#listen [::]:80;
server_name postfixadmin.net-runner.ru;
root /var/www/postfixadmin/public/;
index index.php index.html;
access_log /var/log/nginx/postfixadmin_access.log;
error_log /var/log/nginx/postfixadmin_error.log;
location / {
try_files $uri $uri/ /index.php;
}
location ~ ^/(.+\.php)$ {
try_files $uri =404;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
Проверим синтаксис:
nginx -t
И перезапустим его:
systemctl reload nginx
Теперь получим бесплатный сертификат и обеспечим безопасное подключение к PostfixAdmin
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email you@example.com -d postfixadmin.example.com
Не забывайте заменять значения на свои!
Активируем возможность Postfix просматривать статистику Dovecot:
nano /etc/dovecot/conf.d/10-master.conf
Добавьте следующие строки в конец этого файла.
service stats {
unix_listener stats-reader {
user = www-data
group = www-data
mode = 0660
}
unix_listener stats-writer {
user = www-data
group = www-data
mode = 0660
}
}
Сохраните и закройте файл. Затем добавьте веб-сервер в группу dovecot
gpasswd -a www-data dovecot
Перезапустите Dovecot.
systemctl restart dovecot
Предоставьте пользователю разрешения.www-data
setfacl -R -m u:www-data:rwx /var/run/dovecot/stats-reader /var/run/dovecot/stats-writer
Для того что бы произвести дальнейшую настройку PostfixaAdmin потребуется запустить мастер веб-установки по адресу https://postfixadmin.net-runner.ru/setup.php Если все было настроено верно, должна открыться страничка веб-установщика. Сначала нужно создать пароль установки. После его создания система отобразит строку похожую на строку ниже:
$CONF['setup_password'] = '$2y$10$58fIawuOb5y538RMBol/DOoqv2bJ7zhPRzRO.4Xq7MLeQJHmaFwF2';
Открываем конфигурационный файл PostfixAdmin:
sudo nano /var/www/postfixadmin/config.local.php
Добавляем эту строку в конец этого файла и сохраняем его. После сохранения файла необходимо обновить страницу настройки PostfixAdmin и снова ввести пароль настройки, а затем создать учетную запись администратора. Не используйте адрес электронной почты Gmail, Yahoo Mail или Microsoft для учетной записи администратора, иначе вы не сможете войти в систему позже. Используйте адрес электронной почты в своем домене. Вы можете создать адрес электронной почты позже в PostfixAdmin.
Если вы видите следующую ошибку при попытке создать учетную запись суперадминистратора,
Password Hashing - attempted to use configured encrypt backend (dovecot:ARGON2I) triggered an error: /usr/bin/doveadm pw -r 5 failed, see error log for details
Это связано с тем, что у пользователя нет разрешения на чтение TLS-сертификата Let’s Encrypt. Чтобы исправить это, выполните следующую команду, чтобы предоставить разрешения 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
После создания учетной записи суперадминистратора вы можете войти в PostfixAdmin по адресу .postfixadmin.example.com/login.php
По умолчанию Postfix доставляет электронные письма только пользователям с локальной учетной записью Unix. Чтобы он доставлял электронные письма виртуальным пользователям, информация о которых хранится в базе данных, нам нужно настроить Postfix на использование доменов виртуальных почтовых ящиков.
Во-первых, нам нужно добавить поддержку карт PostgreSQL для Postfix, установив пакет postfix-pgsql
apt install postfix-pgsql
Затем отредактируйте основной конфигурационный файл Postfix.
nano /etc/postfix/main.cf
Добавьте следующие строки в конец этого файла.
virtual_mailbox_domains = proxy:pgsql:/etc/postfix/pgsql/virtual_domains_maps.cf
virtual_mailbox_maps = proxy:pgsql:/etc/postfix/pgsql/virtual_mailbox_maps.cf
virtual_alias_maps = proxy:pgsql:/etc/postfix/pgsql/virtual_alias_maps.cf
relay_domains = $mydestination, proxy:pgsql:/etc/postfix/pgsql/relay_domains.cf
Где:
virtual_mailbox_domains указывает на файл, который сообщит Postfix, как искать информацию о домене в базе данных.
virtual_mailbox_maps указывает на файлы, которые сообщат Postfix, как искать адреса электронной почты из базы данных.
virtual_alias_maps указывает на файлы, которые сообщат Postfix, как искать псевдонимы из базы данных.
Мы хотим использовать Dovecot для доставки входящих писем в хранилище сообщений виртуальных пользователей, поэтому добавьте следующую строку в конец этого файла.
virtual_transport = lmtp:unix:private/dovecot-lmtp
Сохраните и закройте файл. Далее нам нужно создать файлы один за другим. Начнем с каталога:
mkdir -p /etc/postfix/pgsql/
Далее идут файлы:
Создайте файл virtual_domains_maps.cf.
sudo nano /etc/postfix/pgsql/virtual_domains_maps.cf
Добавьте следующее содержимое. Замените его паролем базы данных postfixadmin, который вы установили ранее.
user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
#query = SELECT domain FROM domain WHERE domain='%s' AND active = true
#optional query to use when relaying for backup MX
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = false and active = true
Создайте файл virtual_mailbox_maps.cf.
sudo nano /etc/postfix/pgsql/virtual_mailbox_maps.cf
Добавьте следующее содержимое.
user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = true
Создайте файл virtual_alias_maps.cf.
sudo nano /etc/postfix/pgsql/virtual_alias_maps.cf
Добавьте следующее содержимое.
user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='%s' AND active = true
Создайте файл relay_domains.cf.
sudo nano /etc/postfix/pgsql/relay_domains.cf
Добавьте следующее содержимое.
user = postfixadmin
password = postfixadmin_password
hosts = localhost
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = true
Поскольку пароли базы данных хранятся в виде обычного текста, они должны быть доступны для чтения только пользователю postfix и root, что делается путем выполнения следующих двух команд.
sudo chmod 0640 /etc/postfix/pgsql/*
sudo setfacl -R -m u:postfix:rx /etc/postfix/pgsql/
Далее нам нужно изменить значение параметра mydestination в Postfix. Отобразим текущее значение:
sudo postconf mydestination
Пример вывода:
mydestination = $myhostname, linuxbabe.com, localhost.$mydomain, localhost
Параметр содержит список доменных имен, которые будут получать электронные письма, доставляемые на локальные учетные записи Unix. В начале этой статьи мы добавили доменное имя вершины (например, net-runner.ru). Поскольку мы собираемся использовать виртуальный почтовый ящик, нам нужно удалить доменное имя вершины из списка, выполнив следующую команду:
sudo postconf -e "mydestination = \$myhostname, localhost.\$mydomain, localhost"
Теперь давайте снова откроем основной конфигурационный файл Postfix.
nano /etc/postfix/main.cf
Добавьте следующие строки в конец этого файла.
virtual_mailbox_base = /var/vmail
virtual_minimum_uid = 2000
virtual_uid_maps = static:2000
virtual_gid_maps = static:2000
Первая строка определяет базовое расположение почтовых файлов. Оставшиеся 3 строки определяют, какой идентификатор пользователя и идентификатор группы Postfix будет использовать при доставке входящих писем в почтовый ящик. Мы используем идентификатор пользователя 2000 и идентификатор группы 2000.
Сохраните и закройте файл. Перезапустите Postfix, чтобы изменения вступили в силу.
systemctl restart postfix
Далее нам нужно создать пользователя с именем с идентификатором 2000 и группу с идентификатором 2000:
adduser vmail --system --group --uid 2000 --disabled-login --no-create-home
Создайте директорию для файлов самой почты.
sudo mkdir -p /var/vmail/
Сделаем владельцем пользователя vmail для этой директории:
chown vmail:vmail /var/vmail/ -R
Нам также необходимо настроить IMAP-сервер Dovecot для запроса информации о пользователе из базы данных. Сначала выполните следующую команду, чтобы добавить поддержку PostgreSQL для Dovecot.
apt install dovecot-pgsql
Затем отредактируйте файл 10-mail.conf.
nano /etc/dovecot/conf.d/10-mail.conf
Сейчас сообщения электронной почты хранятся в домашнем каталоге каждого пользователя.
mail_location = maildir:~/Maildir
Поскольку теперь мы используем виртуальные почтовые ящики, нам нужно включить хранилище для виртуальных пользователей, добавив следующую строку в файл, потому что виртуальные пользователи по умолчанию не имеют домашних каталогов.
mail_home = /var/vmail/%d/%n/
Сохраните и закройте файл. Затем отредактируйте файл 10-auth.conf.
nano /etc/dovecot/conf.d/10-auth.conf
Ранее мы использование следующее следующее значение для auth_username_format
auth_username_format = %n
Он отбросил бы домен, если бы он был указан. Поскольку ранее мы использовали локальную учетную запись Unix для имени пользователя каждого адреса электронной почты, мы должны были удалять домен, чтобы пользователи могли войти в систему с полным адресом электронной почты.
Теперь мы используем имена виртуальных почтовых ящиков, что означает, что имя пользователя каждого адреса электронной почты включает в себя доменную часть, поэтому нам больше не нужно удалять домен. Это позволяет пользователям входить в систему с полным адресом электронной почты
auth_username_format = %u
Затем найдите следующую строку.
#auth_default_realm =
Измените его на
auth_default_realm = example.com
Это необходимо для того, чтобы пользователи, которые не ввели часть в поле имени пользователя, по-прежнему могли войти в систему.
Затем раскомментируйте следующую строку в конце этого файла, чтобы Dovecot мог запрашивать информацию о пользователе из базы данных PostgreSQL.
!include auth-sql.conf.ext
!include auth-system.conf.ext
Полезно активировать более подробное логирование событий. Важно для работы fail2ban.
auth_debug = yes
auth_debug_passwords = yes
Сохраните и закройте файл.
Отредактируйте файл dovecot-sql.conf.ext
nano /etc/dovecot/dovecot-sql.conf.ext
Добавим содержимое:
driver = pgsql
connect = host=localhost dbname=postfixadmin user=postfixadmin password=postfixadmin_assword
default_pass_scheme = ARGON2I
password_query = SELECT username AS user,password FROM mailbox WHERE username = '%u' AND active = true
user_query = SELECT maildir, 2000 AS uid, 2000 AS gid FROM mailbox WHERE username = '%u' AND active = true
iterate_query = SELECT username AS user FROM mailbox
Перезапустите Dovecot.
sudo systemctl restart dovecot
Когда пользователь пытается войти в систему, Dovecot использует алгоритм Argon2 для генерации хэша пароля из пароля, введенного пользователем, а затем сравнивает его с хэшем пароля, хранящимся в базе данных.
Осталось войти учетной записью администратора в PostfxAdmin, добавить свой домен и создать первый виртуальный почтовый ящик. По идее, мы имеем готовый почтовый сервер. Однако в такой конфигурации Gmail не примет почту от нашего сервера, так как не настроены записи SPF и DKIMM.
##SPF & DKIM
SPF и DKIM — это два типа записей TXT в DNS, которые позволяют обнаруживать подделку электронной почты и помогают законным электронным письмам доставляться в папку «Входящие» получателя.
Запись SPF (Sender Policy Framework) указывает, каким узлам или IP-адресам разрешено отправлять электронные письма от имени домена. Вы должны разрешить только свой собственный почтовый сервер или сервер вашего интернет-провайдера отправлять электронные письма для вашего домена.
DKIM (DomainKeys Identified Mail) использует закрытый ключ для добавления подписи к электронным письмам, отправленным с вашего домена. Принимающие SMTP-серверы проверяют подпись с помощью соответствующего открытого ключа, опубликованного в зоне DNS вашего домена.
Тип записи - TXT. Пример записи:
TXT @ v=spf1 mx ~all
Или
TXT @ v=spf1 mx ip4:12.34.56.78 ~all
Для проверки распространения данной записи можно использовать утилиту dig
dig net-runner.ru txt
Часть ответа:
;; ANSWER SECTION:
net-runner.ru. 3600 IN TXT "v=DMARC1; p=none; rua=mailto:dmarc@net-runner.ru"
net-runner.ru. 3600 IN TXT "v=spf1 ip4:89.19.210.82 ~all"
Нам также нужно сказать нашему SMTP-серверу Postfix, чтобы он проверял запись SPF на входящие электронные письма. Это не поможет доставке исходящей электронной почты, но поможет обнаружить поддельные входящие электронные письма.
Установите необходимые пакеты:
apt install postfix-policyd-spf-python
Затем отредактируйте файл конфигурации Postfix.
nano /etc/postfix/master.cf
Добавьте следующие строки в конец файла, которые сообщают Postfix о запуске управляющей программы политики SPF, когда она запускается сама.
policyd-spf unix - n n - 0 spawn
user=policyd-spf argv=/usr/bin/policyd-spf
Сохраните и закройте файл. Затем отредактируйте основной конфигурационный файл Postfix.
nano /etc/postfix/main.cf
Добавьте следующие строки в конец файла. В первой строке указывается параметр тайм-аута агента политики Postfix. Следующие строки наложат ограничение на входящие электронные письма, отклонив несанкционированную электронную почту и проверив запись SPF.
policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service unix:private/policyd-spf
Сохраните и закройте файл. Затем перезапустите Postfix.
systemctl restart postfix
В следующий раз, когда вы получите электронное письмо от домена с записью SPF, вы увидите результаты проверки SPF в необработанном заголовке электронной почты:
Received-SPF: Pass (sender SPF authorized).
Установите OpenDKIM, который является реализацией системы аутентификации отправителя DKIM с открытым исходным кодом.
apt install opendkim opendkim-tools
Затем добавьте пользователя в группу postfixopendkim
gpasswd -a postfix opendkim
Отредактируйте основной конфигурационный файл OpenDKIM.
nano /etc/opendkim.conf
Раскомментируйте следующие строки.
Canonicalization relaxed/simple
Mode sv
SubDomains no
Найдите следующую строку.
#Nameservers 127.0.0.1
Измените ее на:
Nameservers 8.8.8.8,1.1.1.1
Это говорит OpenDKIM использовать 8.8.8.8 и 1.1.1.1 для запроса записей DNS. Всегда полезно использовать более одного сервера имен. Если один из них не сработает, другой все равно сможет отвечать на DNS-запросы. Разделяйте каждый IP-адрес запятой.
Затем добавьте следующие строки в конец этого файла.
# Map domains in From addresses to keys used to sign messages
KeyTable refile:/etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
# Hosts to ignore when verifying signatures
ExternalIgnoreList /etc/opendkim/trusted.hosts
# A set of internal hosts whose mail should be signed
InternalHosts /etc/opendkim/trusted.hosts
Сохрание изменения.
Создадим аталог для работы с OpenDKIM
mkdir -p /etc/opendkim/keys
Измените владельца:
chown -R opendkim:opendkim /etc/opendkim
chmod go-rw /etc/opendkim/keys
Создайте таблицу для подписи.
nano /etc/opendkim/signing.table
Добавьте в файл следующую строку.
*@example.com default._domainkey.example.com
*@*.example.com default._domainkey.example.com
Сохраните и закройте файл. Затем создайте таблицу ключей.
nano /etc/opendkim/key.table
Добавьте следующую строку, в которой указывается расположение закрытого ключа.
default._domainkey.example.com example.com:default:/etc/opendkim/keys/example.com/default.private
Сохраните и закройте файл. Затем создайте файл доверенных hosts.
nano /etc/opendkim/trusted.hosts
Добавьте следующие строки во вновь созданный файл. Это говорит OpenDKIM, что если электронное письмо приходит с локального хоста или с того же домена, то OpenDKIM должен подписать электронное письмо, но не будет выполнять проверку DKIM в электронном письме.
127.0.0.1
localhost
.example.com
Сохраните и закройте файл.
Далее нам нужно сгенерировать два ключа:
Создайте отдельную папку для домена.
mkdir /etc/opendkim/keys/example.com
Генерируйте ключи с помощью инструмента opendkim-genkey
opendkim-genkey -b 2048 -d example.com -D /etc/opendkim/keys/example.com -s default -v
Изменим владельца закрытого ключа.
chown opendkim:opendkim /etc/opendkim/keys/example.com/default.private
И измените разрешения.
chmod 600 /etc/opendkim/keys/example.com/default.private
Теперь нам нужно опубликовать открытый ключ в глобальном DNS.
Для отображения ключа используем команду:
cat /etc/opendkim/keys/example.com/default.txt
Полученное значение нужно слегка подправить. Скопируйте все что внутри скобок и удалите все кавычки и пробелы. Теперь эту запись нужно добавить в DNS. Тип записи TXT.
Проверить наличие записи можно командой:
host -t txt net-runner.ru
Postfix может взаимодействовать с OpenDKIM через файл сокета Unix и нам нужно изменить файл сокета OpenDKIM /run/opendkim/opendkim.sock/etc/opendkim.conf/var/spool/postfix
Создайте каталог для файла сокета OpenDKIM и разрешите доступ к нему только пользователям opendkimpostfix
mkdir /var/spool/postfix/opendkim
chown opendkim:postfix /var/spool/postfix/opendkim
Затем отредактируйте основной конфигурационный файл OpenDKIM.
nano /etc/opendkim.conf
Найдите следующую строку.
Socket local:/run/opendkim/opendkim.sock
Замените его следующей строкой.
Socket local:/var/spool/postfix/opendkim/opendkim.sock
Сохраните и закройте файл. Затем откройте файл /etc/default/opendkim
nano /etc/default/opendkim
Найдите следующую строку.
SOCKET=local:$RUNDIR/opendkim.sock
Измените его на
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
Сохраните и закройте файл.
Далее нам нужно отредактировать основной конфигурационный файл Postfix.
nano /etc/postfix/main.cf
Добавьте следующие строки в конец этого файла, чтобы Postfix мог вызывать OpenDKIM по протоколу milter.
# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
Сохраните и закройте файл. Затем перезапустите сервисы.
systemctl restart opendkim postfix
OpenDMARC - это программное обеспечение с открытым исходным кодом, которое может выполнять проверку DMARC для входящей почты. Он уже находится в репозитории Debian, поэтому вы можете выполнить следующую команду, чтобы установить его.
apt install opendmarc
Если вас попросят настроить базу данных для OpenDMARC в момент установи, вы можете смело выбрать Нет.
После установки пакет будет автоматически запущен. Проверьте его статус с помощью:
systemctl status opendmarc
Активируем автозагрузку службы.
systemctl enable opendmarc
Затем отредактируйте основной конфигурационный файл:
nano /etc/opendmarc.conf
Найдите следующую строку:
# AuthservID name
По умолчанию OpenDMARC использует имя хоста MTA в качестве AuthserveID, но лучше использовать другое имя для службы аутентификации. Вы можете изменить его.
AuthservID OpenDMARC
Далее добавьте следующую строку. Замените имя хоста своим реальным именем хоста.
TrustedAuthservIDs mail.net-runner.ru
Затем найдите эту строку:
# RejectFailures false
По умолчанию OpenDMARC не будет отклонять электронные письма не прошедшие проверку DMARK. Для того что бы отклонять такие письма изменим значение на true
RejectFailures true
Если вы ипользуете свой сервер, в качестве сервера ретрансляции или настольные и мобильниые клиенты, которые отправляют почтку через порт 587 лучше сделать, что бы OpenDMARC игнорировал успешно авторизивавшихся клиентов. Для этого добавим строку в конец файла:
IgnoreAuthenticatedClients true
Теперь добавьте следующую строку в конец этого файла.
RequiredHeaders true
Эта настройка будет отклонять электронные письма, которые не соответствуют стандартам заголовков электронной почты, как описано в RFC5322. Например, если входящее электронное письмо не имеет заголовка, оно будет отклонено.
Рекомендуется также добавить следующую строку в конец этого файла. Это заставит OpenDMARC самостоятельно выполнять резервную проверку SPF, когда он не может найти результатов SPF в заголовке сообщения.
SPFSelfValidate true
Postfix может взаимодействовать с приложениями milter через сокет Unix - файл сокета по умолчанию, используемый OpenDMARC. Но из за особенности работы демона Postfix SMTP, нам нужно изменить файл сокета, используемый OpenDMARC.
Найдите следующую строку.
Socket local:/var/run/opendmarc/opendmarc.sock
Измените еe на:
Socket local:/var/spool/postfix/opendmarc/opendmarc.sock
Создайте каталог для хранения файла сокета OpenDMARC и измените владельца для его корректной работы.
mkdir -p /var/spool/postfix/opendmarc
chown opendmarc:opendmarc /var/spool/postfix/opendmarc -R
Измените разрешение на 750, чтобы ограничить доступ, чтобы пользователи, не входящие в группу, не могли получить доступ к этому каталогу.
chmod 750 /var/spool/postfix/opendmarc/ -R
Добавить пользователя postfix в группу opendmark
adduser postfix opendmarc
Затем перезапустите OpenDMARC.
systemctl restart opendmarc
Отредактируйте основной конфигурационный файл Postfix.
nano /etc/postfix/main.cf
Если вы уже настроили OpenDKIM, то у вас должны быть строки в этом файле, как показано ниже.
# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
Теперь вам просто нужно добавить файл сокета OpenDMARC, чтобы Postfix мог общаться с OpenDMARC. (Убедитесь, что он находится после сокета OpenDKIM.)
# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock,local:opendmarc/opendmarc.sock
non_smtpd_milters = $smtpd_milters
Сохраните и закройте файл. Затем перезапустите Postfix, чтобы изменения вступили в силу.
systemctl restart postfix
Готово!
Я настраивал свой сервер именно по шагам, записывая все происходящее сюда. Он работает именно так, как мне это нужно.
Далее, я бы хотел разобраться, как боросться со спамом.
Существует несколько решений, в том числе платные. Да и сам Postfix умеет филтрацию на основе регулярных выражений, поддерживает белые, черные и серые списки. Возможно об этом тоже будет статья. Я же решил остановится и попробовать SpamAssasin
Выполните следующую команду, чтобы установить SpamAssassin из репозитория программного обеспечения Debian.
apt install spamassassin spamc
По умолчанию служба отключена и не стоит в автозапуске. Исправим это.
systemctl enable spamd.service
systemctl start spamd.service
Есть несколько способов интегрировать SpamAssassin с Postfix. Мы будем использовать SpamAssassin через интерфейс sendmail milter.
Для этого установим допольнительный пакет из репозитория программного обеспечения Debian.
sudo apt install spamass-milter
Затем добавьте следующие строки в конец файла
nano /etc/postfix/main.cf
# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:spamass/spamass.sock
non_smtpd_milters = $smtpd_milters
Если вы настроили OpenDKIM и OpenDMARC, то эти строки должны выглядеть так, как показано ниже. Порядок имеет значение.
# Milter configuration
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock,local:opendmarc/opendmarc.sock,local:spamass/spamass.sock
non_smtpd_milters = $smtpd_milters
Теперь откройте файл и найдите следующую строку
nano /etc/default/spamass-milter
#OPTIONS="${OPTIONS} -r 15"
Раскомментируйте эту строку и измените 15 на предпочитаемую оценку отклонения, например 8.
OPTIONS="${OPTIONS} -r 8"
Если оценка конкретного электронного письма превышает 8, Spamassassin отклонит его, и вы найдете в /var/log/mail.log сообщение, подобное приведенному ниже:
milter-reject: END-OF-MESSAGE 5.7.1 Blocked by SpamAssassin
Если хотите изменить текст ответа при отклонении письма, добавьте в этом же файле опцию, как показано ниже:
OPTIONS="-u spamass-milter -i 127.0.0.1 -R SPAM_ARE_NOT_ALLOWED_HERE"
Перезапускаем службы
systemctl restart postfix spamass-milter
По возможности добавить описание своих правил, а так же списков.
При появлении в логах ошибки похожей на:
"spamd[]: plugin: eval failed: bayes: (in learn) locker: safe_lock: cannot create tmp lockfile /nonexistent/.spamassassin/bayes.lock.[mail server].13135 for /nonexistent/.spamassassin/bayes.lock: No such file or directory"
Создайте в ручную нужные каталоги.
sudo mkdir -p /nonexistent/.spamassassin/
sudo chown nobody:nogroup /nonexistent/.spamassassin/