Smtp авторизация с postfix

На постовом сервере потребовалась smtp авторизация. Для начала необходимо дополнительно установить из портов cyrus-sasl2, saslauthd и pam_mysql. При помощи двух последних защифрованая пара логин/пароль будет передаваться в базу данных mysql, где хранятся почтовые акааунты пользователей зашифрованные функцией encrypt

Основная задача — сделать защищенную передачу пароля от пользователя к БД

Ставим модуль:

portinstall pam_mysql

Линкуем на /usr/lib, потому что система система ищет pam-модули именно там:

ln -sf /usr/local/lib/pam_mysql.so /usr/lib/pam_mysql.so

В /etc/pam.d создаём файл smtp со следующим содержимым:

auth required pam_mysql.so user=mailer passwd=pwd host=127.0.0.1 db=mail table=users usercolumn=login passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=mailer passwd=pwd host=127.0.0.1 db=mail table=users usercolumn=login passwdcolumn=password crypt=1

crypt=1 — именно этот параметр отвечает за щифрование
cyrus-sasl2 собираем без поддержки mysql и с поддержкой механизмов авторизации login/plain. Устанавливаем cyrus-sasl2-saslauthd

portinstall cyrus-sasl2-saslauthd cyrus-sasl2

В /etc/rc.conf.local пишем:

saslauthd_enable="YES"
saslauthd_flags="-n 10 -r -a pam"

Ключ -r полезен тем, у кого мульти-доменный почтовый сервер и в логине должна передаваться доменная часть почтового адреса

в /usr/local/lib/sasl2 создаём файл smtpd.conf, в который пишем следующее:

pwcheck_method: saslauthd
mech_list: login plain
sql_engine: mysql
sql_user: mailer
sql_passwd: pwd
sql_hostnames: localhost
sql_database: mail
sql_verbose: true
sql_select: select password from users where login = '%u@%r'

К рассмотрению принимаются два механизма авторизации login — пара логин/пароль передаётся в две строки, и plain — пара логин/пароль передаётся одной строкой. Все они шифруются base64

%u@%r — формат передачи в БД, пользователь@доменнаячасть

Запуск:

service saslauthd restart

В main.cf postfix’а нужно добавить параметры:

smtp_sasl_security_options = noanonymous
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = mysql:/usr/local/etc/postfix/sql/users.cf
smtp_sasl_security_options = noplaintext, noanonymous
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = smtpd
smtpd_sasl_security_options = noanonymous
smtpd_sasl_exceptions_networks = 192.168.4.40, 192.168.4.195
broken_sasl_auth_clients = yes

Перегрузка postfix и проверка. Для проверки механизма plain сначала сгенерируем пару логин/пароль средствами перла

perl -MMIME::Base64 -e 'print encode_base64("\0test\@mymailserver\000qqqqqq");’

Пользователь test экранируется нулем, пароль экранируется тремя нулями.
В результатте получаем:

> *AHRlc3RAbXltYWlsc2VydmVyAHFxcXFxcQ==*

Соединяемся:

telnet mymailserver 25
> 2*20 mymailserver ESMTP service ready (Postfix)*
ehlo test
> *250-mymailserver*
> *250-PIPELINING*
> *250-SIZE 50000000*
> *250-ETRN*
> *250-STARTTLS*
> *250-AUTH LOGIN PLAIN*
> *250-AUTH=LOGIN PLAIN*
> *250-ENHANCEDSTATUSCODES*
> *250-8BITMIME*
> *250 DSN*
auth plain
> 334
AHRlc3RAbXltYWlsc2VydmVyAHFxcXFxcQ==
> *235 2.7.0 Authentication successful*

Работает. Можно настраивать почтовый клиент. Еще всё это дело можно закрепить шифрованием канала между клиентом и сервером по SSL/TLS.
Если что-то не заработало — смотрим maillog и messages.

Источник