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

Стало быть потребовалась smtp авторизация. Делал на базе уже существующего почтового сервера (FreeBSD+postfix)

Для начала необходимо дополнительно установить из портов 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

220 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

Александр Черных
системный администратор

Статьи по теме