Smtp авторизация с postfix
Опубликовано 02.04.2013 Нет комментариев
Стало быть потребовалась 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
Александр Черных системный администратор