Полноценный виртуальный почтовый сервер/SMTP аутентификация

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Complete Virtual Mail Server/SMTP Authentication and the translation is 100% complete.

Other languages:
English • ‎русский • ‎日本語 • ‎한국어

Введение

На данный момент, только 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)
java Add support for Java
kerberos Add kerberos support
ldapdb Enable ldapdb plugin
libressl Use dev-libs/libressl instead of dev-libs/openssl when applicable (see also the ssl useflag)
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 sqliteembedded 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. Они не упомянуты в файле конфигурации по умолчанию, поэтому их необходимо добавить.

Файл /etc/postfix/main.cfДобавление поддержки sasl в postfix.
# 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:

Файл /etc/sasl2/smtpd.confАутентификация с authdaemond
pwcheck_method: authdaemond
mech_list: LOGIN PLAIN
sql_select: dummy 
authdaemond_path: /var/lib/courier/authdaemon/socket
 
log_level: 5

С postgresql

Файл /etc/sasl2/smtpd.confАутентификация напрямую из базы
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.

Заключение

После того, как система отлажена, отладку можно отключить (также можно удалить всю строку):

Файл /etc/sasl2/smtpd.confОтключение debug
log_level: 0

По желанию, можно снова отключить smtpd_sasl_authenticated_header. Он очень удобен для обнаружения проблем с почтой пользователей, но представляет потенциальную проблему с точки зрения безопасности, как упомянуто выше, поскольку учетное имя пользователя помещается в заголовок. С другой стороны, если учетное имя является local_part почтового адреса, или даже почтовым адресом, тогда учетное имя известно в любом случае, и большого вреда это не нанесет. Рекомендуется соблюдать определенную осторожность, но вряд ли это создаст большую проблему.

Файл /etc/postfix/main.cfДобавление поддержки sasl в postfix
smtpd_sasl_authenticated_header = no