Полноценный виртуальный почтовый сервер/SMTP аутентификация
Введение
На данный момент, только localhost имеет возможность отправлять почту. К сожалению, postfix не может напрямую работать с courier-authlib. Однако, существует промежуточное решение — dev-libs/cyrus-sasl. Существует три способа, с помощью которых cyrus-sasl может получать аутентификационную информацию — напрямую из базы данных, локально или удаленно. Настройка, использующая этот подход, выглядит следующим образом.
courier-imap -> courier-authlib --\ +--> database postfix ------> cyrus-sasl -------/
В следующем, немного более сложном, варианте, cyrus-sasl может использоваться для коммуникации посредством courier-authlib и, таким образом, позволять courier-authlib осуществлять аутентификацию.
courier-imap -----------\ +-> courier-authlib -> database postfix -> cyrus-sasl --/
Желательно использовать последний вариант, поскольку, в этом случае, используется один back-end аутентификации, courier-authlib. Коммуникация плагина cyrus-sasl с courier-authlib, однако, работает только посредством сокета unix и поэтому, если courier-authlib не запущен на одном компьютере с cyrus-sasl, это не сработает. Поэтому, первый вариант лучше использовать только тогда, когда courier-authlib недоступен.
Установка cyrus-sasl
Ключевая возможность cyrus-sasl, которую необходимо включить, это USE-флаг crypt
. Если он не установлен, аутентификация с помощью зашифрованных паролей из базы данных не будет работать. Cyrus-sasl с правильным USE-флагом уже должен был быть установлен ранее, во время установки postfix.
Патч Gentoo, реализующий поддержку зашифрованных паролей напрямую из базы данных, недоступен для версий >cyrus-sasl-2.1.23; для таких версий следует использовать net-libs/courier-authlib.
USE flags for dev-libs/cyrus-sasl The Cyrus SASL (Simple Authentication and Security Layer)
authdaemond
|
Add Courier-IMAP authdaemond unix socket support (net-mail/courier-imap, mail-mta/courier) |
berkdb
|
Add support for sys-libs/db (Berkeley DB for MySQL) |
gdbm
|
Add support for sys-libs/gdbm (GNU database libraries) |
kerberos
|
Add kerberos support |
ldapdb
|
Enable ldapdb plugin |
mysql
|
Add mySQL Database support |
openldap
|
Add ldap support for saslauthd |
pam
|
Add support for PAM (Pluggable Authentication Modules) - DANGEROUS to arbitrarily flip |
postgres
|
Add support for the postgresql database |
sample
|
Enable sample client and server |
selinux
|
!!internal use only!! Security Enhanced Linux support, this must be set by the selinux profile or breakage will occur |
sqlite
|
Add support for sqlite - embedded sql database |
srp
|
Enable SRP authentication |
ssl
|
Add support for SSL/TLS connections (Secure Socket Layer / Transport Layer Security) |
static-libs
|
Build static versions of dynamic libraries as well |
urandom
|
Use /dev/urandom instead of /dev/random |
Будет собрана поддержка той базы данных, которая была выбрана ранее. Если, по какой-либо причине, скорее всего, из соображений безопасности, дополнительный код баз данных нежелателен, существует возможность собрать пакет без каких-либо USE-флагов баз данных.
USE-флаги баз данных также следует выключить в случае использования courier-authlib вместо прямой работы с базой данных, поскольку cyrus-sasl будет постоянно записывать в журнал ошибки, если он был скомпилирован с поддержкой SQL, но не был настроен для работы с ним.
Настройка postfix с cyrus-sasl
Postfix требуется несколько параметров для того, чтобы сообщить ему о необходимости использовать sasl в его main.cf. Они не упомянуты в файле конфигурации по умолчанию, поэтому их необходимо добавить.
# Postifx to SASL authentication
broken_sasl_auth_clients = no
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
smtpd_sasl_authenticated_header = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
Во время отправки почты,
smtpd_sasl_authenticated_header
помещает в почтовый заголовок имя пользователя, которое использовалось для аутентификации с cyrus. Это особенно опасно для почты, идущей в публичные архивы списков рассылки, поскольку этот заголовок будет общедоступен. Он включен здесь в целях тестирования.Настройка cyrus-sasl
С authdaemond
Postfix посылает запросы на сокет, созданный authdaemond, который защищен пользователем и группой mail, поэтому postfix необходимо предоставить доступ.
root #
gpasswd -a postfix mail
Далее нужно сообщить cyrus-sasl, чтобы он осуществил аутентификацию с authdeamond:
pwcheck_method: authdaemond
mech_list: LOGIN PLAIN
sql_select: dummy
authdaemond_path: /var/lib/courier/authdaemon/socket
log_level: 5
С postgresql
sasl_pwcheck_method: auxprop
sasl_auxprop_plugin: pgsql
password_format: crypt
mech_list: LOGIN PLAIN
sql_engine: pgsql
#sql_hostnames: localhost
sql_database: postfix
sql_user: postfix
sql_passwd: $password
sql_select: SELECT password FROM mailbox WHERE local_part='%u' AND active='1'
Тестирование
Убедиться в наличии поддержки sasl можно, проверив наличие AUTH
statement с помощью telnet:
user $
telnet foo.example.com 25
220 foo.example.com ESMTP Postfix EHLO example.com 250-foo.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH LOGIN PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN quit 221 2.0.0 Bye Connection closed by foreign host.
Если используемый почтовый клиент работает неправильно, можно использовать
broken_sasl_auth_clients = yes
в файле main.cf postfix, чтобы получить здесь дополнительную строку, 250-AUTH=LOGIN PLAIN
.Следующий тест — с удаленного хоста попытаться аутентифицироваться на почтовом сервере и отправить тестовое сообщение.
Хотя аутентификация на почтовых серверах (pop/imap/webmail/smtp) с использованием учетных данных в виде простого текста довольно часто используется, она является очень небезопасной (и от нее можно защититься, как описано далее в этом руководстве). При отправлении учетных данных в виде простого текста (они отправляются в виде base64-кодированных данных, и поэтому их очень легко раскодировать) через Интернет, используйте только тестового пользователя, или хотя бы тестовый пароль.
Если установлен perl с модулем base64, его можно использовать для генерации данных, закодированных base64. Также можно осуществить преобразование base64 онлайн. Будьте очень осторожны при использовании реальных данных на ненадежных сайтах.
user $
perl -MMIME::Base64 -e 'print encode_base64("testuser");'
dGVzdHVzZXI=
user $
telnet foo.example.com 25
Trying 1.2.3.4... Connected to foo.example.com. Escape character is '^]'. 220 foo.example.com ESMTP Postfix HELO example.com 250 foo.example.com AUTH LOGIN 334 VXNlcm5hbWU6 (base64 decode: 'Username:') dGVzdHVzZXI= (base64 encoded from: 'testuser') 334 UGFzc3dvcmQ6 (base64 decode: 'Password:') c2VjcmV0 (base64 encoded from: 'secret') 235 2.7.0 Authentication successful mail from:me@you.com 250 2.1.0 Ok rcpt to:<validuser>@<validexternaldomain>.<tld> 250 2.1.5 Ok data 354 End data with <CR><LF>.<CR><LF> Subject: Test message Test message to ensure Postfix is only relaying with smtp authorization. . 250 2.0.0 Ok: queued as 82F97606 quit 221 2.0.0 Bye Connection closed by foreign host.
Заключение
После того, как система отлажена, отладку можно отключить (также можно удалить всю строку):
log_level: 0
По желанию, можно снова отключить smtpd_sasl_authenticated_header
. Он очень удобен для обнаружения проблем с почтой пользователей, но представляет потенциальную проблему с точки зрения безопасности, как упомянуто выше, поскольку учетное имя пользователя помещается в заголовок. С другой стороны, если учетное имя является local_part почтового адреса, или даже почтовым адресом, тогда учетное имя известно в любом случае, и большого вреда это не нанесет. Рекомендуется соблюдать определенную осторожность, но вряд ли это создаст большую проблему.
smtpd_sasl_authenticated_header = no