Настройка SMTP-авторизации в Postfix
Используемые термины: Postfix, SMTP, Dovecot.
Данная настройка позволит запрашивать логин с паролем при отправке сообщений. В данном примере аутентификация реализована при помощи dovecot.
Конфигурация будет выполнена по шагам от простого к сложному — сначала настроим аутентификацю, после подключим виртуальных пользователей, и в итоге, настроим шифрование.
Простая аутентификация
Виртуальные пользователи
Шифрование соединения
Аутентификация через Dovecot по tcp
Без шифрования
Устанавливаем dovecot.
а) если используем CentOS / Red Hat:
yum install dovecot
б) если используем Ubuntu / Debian:
apt install dovecot-imapd dovecot-pop3d
Открываем конфигурационный файл Postfix:
vi /etc/postfix/main.cf
И добавляем:
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
* где:
- smtpd_sasl_path — путь до плагина аутентификации по механизму SASL.
- smtpd_sasl_auth_enable — разрешает или запрещает аутентификацию по механизму SASL.
- smtpd_sasl_type — тип плагина, который используется для SASL-аутентификации.
- smtpd_relay_restrictions — правила разрешения и запрета использования MTA при пересылке. Нужны, чтобы запретить отправку писем без аутентификации.
Открываем настройки аутентификации в dovecot:
vi /etc/dovecot/conf.d/10-master.conf
и приводим опцию service auth к следующему виду:
service auth {
...
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
...
}
* если соответствующей секции unix_listener нет, то ее нужно создать.
Отключаем требование ssl для аутентификации:
vi /etc/dovecot/conf.d/10-ssl.conf
ssl = no
Настройки аутентификации приводим к следующему виду:
vi /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login
В этом же файле проверяем, что снят комментарий со следующей строки:
!include auth-system.conf.ext
Перезапускаем сервис Postfix:
systemctl restart postfix
Запускаем Dovecot:
systemctl enable dovecot
systemctl restart dovecot
Готово. В качестве логина и пароля необходимо использовать системную учетную запись.
Проверку можно выполнить из командной строки. Для этого устанавливаем утилиту для отправки почты.
а) В Debian / Ubuntu:
apt install mutt
б) В CentOS / Red Hat:
yum install mailx
После установки можно делать отправку. Для каждого типа операционной системы Linux свои ключи.
а) Для Rocky Linux / CentOS:
echo "Test text" | mail -v -s "Test title" -S smtp="localhost:25" -S smtp-auth=login -S smtp-auth-user="master" -S smtp-auth-password="password" -S from=postmaster@dmosk.ru master@dmosk.ru
б) Для Debian / Ubuntu:
vi ~/.muttrc
set smtp_url="smtp://master@localhost:25"
set smtp_pass = password
set ssl_verify_host = no
set ssl_verify_dates = no
set ssl_starttls = no
set ssl_force_tls = no
echo "Test text" | mutt -s "Test title" -e 'my_hdr From: postmaster@dmosk.ru' -- master@dmosk.ru
* где master — логин (учетная запись в системе); password — пароль для учетной записи; postmaster@dmosk.ru — от кого отправляем письмо; master@dmosk.ru — кому отправляем письмо.
Если мы получим ошибку smtp-server: 503 5.5.1 Error: authentication not enabled, значит у нас выставлено требование устанавливать защищенное соединение при прохождении аутентификации.
Открываем конфигурационный файл postfix:
vi /etc/postfix/main.cf
Находим и комментируем параметр:
#smtpd_tls_auth_only = yes
Аутентификация с помощью виртуальных пользователей
Теперь настроим проверку подлинности не с помощью системных учетных записей, а с помощью виртуальных. В данном примере это будут виртуальные пользователи только для аутентификации при отправке почты.
Открываем конфигурационный файл dovecot:
vi /etc/dovecot/conf.d/auth-system.conf.ext
Находим секцию passdb и приводим ее к виду:
passdb {
# driver = pam
driver = passwd-file
args = scheme=SHA1 /etc/dovecot/passwd
...
}
* в моем случае было закомментировано использование pam драйвера и добавлены опции driver и args. В данном примере они указывают на использование в качестве базы логинов и паролей — файл /etc/dovecot/passwd.
Создаем хэш для пароля первого пользователя:
doveadm pw -s sha1 | cut -d '}' -f2
* система запросит пароль — вводим его дважды.
Полученный хэш имеет, примерно, такой вид:
tMoWsjKKoenYg7+SLRB8GXZQY38=
Копируем его и создаем файл:
vi /etc/dovecot/passwd
user@dmosk.ru:tMoWsjKKoenYg7+SLRB8GXZQY38=
* в данном примере user@dmosk.ru — имя виртуального пользователя; tMoWsjKKoenYg7+SLRB8GXZQY38= — хэш нашего пароля.
Задаем права на файл с базой логинов и паролей:
chown dovecot: /etc/dovecot/passwd
chmod 600 /etc/dovecot/passwd
Перезапускаем Dovecot:
systemctl restart dovecot
Для проверки вводим команды.
а) Для Rocky Linux / CentOS:
echo "Test text" | mail -v -s "Test title" -S smtp="localhost:25" -S smtp-auth=login -S smtp-auth-user="user@dmosk.ru" -S smtp-auth-password="password" -S from=postmaster@dmosk.ru master@dmosk.ru
* где user@dmosk.ru — логин (учетная запись в системе); password — пароль для учетной записи; postmaster@dmosk.ru — от кого отправляем письмо; master@dmosk.ru — кому отправляем письмо.
б) Для Debian / Ubuntu:
vi ~/.muttrc
Редактируем пользователя и пароль:
set smtp_url="smtp://user@dmosk.ru@localhost:25"
set smtp_pass = password
...
* где user@dmosk.ru — логин (учетная запись в системе); password — пароль для учетной записи;
echo "Test text" | mutt -s "Test title" -e 'my_hdr From: postmaster@dmosk.ru' -- master@dmosk.ru
* postmaster@dmosk.ru — от кого отправляем письмо; master@dmosk.ru — кому отправляем письмо.
Настройка SSL-шифрования
В конфигурационный файл postfix добавляем:
vi /etc/postfix/main.cf
smtpd_tls_cert_file = /etc/ssl/certs/dovecot.pem
smtpd_tls_key_file = /etc/ssl/private/dovecot.key
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
В нашем примере мы создадим самоподписанный сертификат, но лучше сгенерировать сертификат, который пройдет все проверки. Для этого можно его купить или получить бесплатно от Let's Encrypt.
Добавляем в master.cf:
vi /etc/postfix/master.cf
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
submission inet n - n - - smtpd
-o smtpd_tls_security_level=may
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_security_options=noanonymous
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
Настраиваем требование сертификата:
vi /etc/dovecot/conf.d/10-ssl.conf
ssl = required
Генерируем сертификат (не требуется, если получили сертификат другим способом):
openssl req -x509 -days 1461 -nodes -newkey rsa:2048 -sha256 -keyout /etc/ssl/private/dovecot.key -out /etc/ssl/certs/dovecot.pem -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=mail.dmosk.ru"
Перезапускаем postfix и dovecot:
systemctl restart postfix
systemctl restart dovecot
Готово. Аутентификация будет требовать шифрованного подключения по порту 25 (STARTTLS), 587 (TLS/STARTTLS), или 465 (SSL/TLS).
Выполним проверку.
* где user@dmosk.ru — логин (учетная запись в системе); password — пароль для учетной записи; postmaster@dmosk.ru — от кого отправляем письмо; master@dmosk.ru — кому отправляем письмо.
а) Для Rocky Linux / CentOS:
echo "Test text" | mail -v -s "Test title" -S smtp="localhost:587" -S smtp-use-starttls -S smtp-auth=login -S smtp-auth-user="user@dmosk.ru" -S smtp-auth-password="password" -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S from=postmaster@dmosk.ru master@dmosk.ru
* для проверки работы по порту 587.
echo "Test text" | mail -v -s "Test title" -S smtp="smtps://localhost:465" -S smtp-auth=login -S smtp-auth-user="user@dmosk.ru" -S smtp-auth-password="password" -S ssl-verify=ignore -S nss-config-dir=/etc/pki/nssdb -S from=postmaster@dmosk.ru master@dmosk.ru
* для проверки по порту 465.
б) Для Debian / Ubuntu:
vi ~/.muttrc
Редактируем адрес подключения, а также опции использования шифрования:
set smtp_url="smtp://user@dmosk.ru@localhost:587"
...
set ssl_starttls = yes
set ssl_force_tls = yes
* где ssl_starttls — использовать starttls; ssl_force_tls — использовать SSL. Также мы заменили порт подключения с 25 на 587.
echo "Test text" | mutt -s "Test title" -e 'my_hdr From: postmaster@dmosk.ru' -- master@dmosk.ru
* postmaster@dmosk.ru — от кого отправляем письмо; master@dmosk.ru — кому отправляем письмо.
Если Postfix и Dovecot на разных серверах
Выше мы рассмотрели вариант, когда аутентификация на Postfix выполняется через Dovecot, а для их взаимодействия используется сокетный файл, находящийся на этом же сервере.
Но если сервер Postfix — это другой сервер, который взаимодействует с dovecot по сети. Настройка будет немного другой.
На сервере Postfix
Открываем конфигурационный файл:
vi /etc/postfix/main.cf
Настройка аутентификации будет такой:
smtpd_sasl_path = inet:192.168.0.15:333
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
* обратите внимание, что данные настройки отличаются от примера выше только опцией smtpd_sasl_path, где в качестве значения указываются адрес и порт сервера dovecot, где будет выполняться аутентификация. Предполагается, что это сервер с адресом 192.168.0.15.
Для применения настройки вводим:
systemctl restart postfix
На сервере Dovecot
Открываем конфигурационный файл:
vi /etc/dovecot/conf.d/10-master.conf
* важно знать, что некоторые почтовые системы настроены с dovecot, конфигурационный файл которого находится по пути /etc/dovecot/dovecot.conf. В таком случае, открывать нужно этот файл.
Находим секцию service auth и добавляем строки inet_listener:
service auth {
...
inet_listener {
port = 333
}
...
}
* мы указали dovecot, что аутентификацию он также должен принимать на сетевом порту 333.
Применяем настройки:
systemctl restart dovecot
Готово.