Сб. Дек 21st, 2024

[TL;DR]

Плачу…Просто таки рыдаю от счастья. Почему? Да потому что наконец смог победить то,с чем ебался более полугода — авторизацией SMTP из MySQL. То есть что б если у юзера есть ящик на сервере,то он мог не токо получать,но и отправлять почту используя свои логин/пароль.Проблема заключалась в том,что принять почту было не проблема — Postfix хорошо лез в базу и читал оттуда данные юзеров.А вот отправлять было уже гораздо более дорогим удовольствием.Да и сервера мои достались мне от предыдущих админов,потому там был темный лес во многом.По началу я решал проблему отправки почты добавляя руками юзера в базу sasldb. Но это хорошо когда у тебя пара-тройка юзеров.А если больше?Потому необходимость избавиться от геммороя и сделать все «как у нормальных людей» стояла довольно остро. Замечу,что жалкие попытки таки наладить гребаную авторизацию с моей стороны происходили довольно часто.Но заканчивались чуть менее чем ничем.Все упиралось в то,что демон Saslauthd просто не хотел вычитывать логин/пароль.Гуляя по инету натыкался и пробовал кучу других вариантов.Например auxprop с плагином mysql.Все бы ничего,да только с криптованными паролями он не умеет работать,а хранить в базе в открытом виде — попахивает идиотизмом.Потому выбор пал на подключение и логирование всего,что токо уходит и приходит,и все таки выяснения чего же не хватает.Как оказалось,проблемы были.Аж две! Одна из них заключалась в том,что надо было удалить PID saslauthd из одного места и сделать симлинк на него из другого.А вторая была просто феерична! У меня для авторизации используется логин в полном почтовом формате — то есть логин и домен,например [email protected].Но при авторизации гребаный saslauthd делал запрос в базу типа select ********** where username = ‘rusua’ ! Теперь то понятно почему аутентификация не проходила! Такого то юзера в базе нет! А запрос должен быть таким select ********** where username = ‘[email protected]’ ! Перелопатив инет,я нашел что для того,что бы демон saslauthd не обрезал домен от логина,надо запустить его с параметром -r. Это то и решило все мои беды.Вот только чего стоило прописать этот параметр…Ну а теперь перейду непосредственно к описаниям пошагово…

[/TL;DR]

1)Для начала убеждаемся что у нас стоят все необходимые библиотеки Sasl аутентификации:

apt-get install libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql

2)Считаем что демон Cyrus-sasl2-saslauthd у вас установлен.Иначе ставим.

В /etc/default/saslauthd значение должно быть MECHANISMS=»pam» и OPTIONS=»-c -m /var/spool/postfix/var/run/saslauthd»

Идем в /etc/courier/ и там проверяем файлы:

а)в authdaemonrc должна быть строчка со значением authmodulelist=»authmysql»

б)Если нет,создаем файл authmysqlrc и приводим к такому виду:

MYSQL_SERVER 127.0.0.1
MYSQL_USERNAME имя_юзера_бд
MYSQL_PASSWORD пароль_бд
MYSQL_PORT 3306
MYSQL_DATABASE имя_бд
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD ‘/home/vmail’
MYSQL_NAME_FIELD name
MYSQL_QUOTA_FIELD quota
MYSQL_MAILDIR_FIELD maildir

3)Идем в /etc/pam.d/ и ищем файл smtp.Если нет — создаем. Его содержимое должно быть такое:

auth required pam_mysql.so user=имя_юзера_бд passwd=пароль_бд host=localhost db=имя_базы table=mailbox usercolumn=username passwdcolumn=password crypt=1

account sufficient pam_mysql.so user=имя_юзера_бд passwd=пароль_бд host=localhost db=имя_базы table=mailbox usercolumn=username passwdcolumn=password crypt=1 

если у вас другие имена таблиц,то измените их.Обратите внимание на последний параметр.Он как раз и сообщает демону что пароли шифрованы.

4)Для того,что бы Postfix мог работать с Saslauthd в chroot окружении делаем вот эти два действия

rm -rf /var/run/saslauthd

ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd

а чтобы не получать в логах сообщения об ошибке типа

postfix/smtpd: sql_select option missing postfix/smtpd: auxpropfunc error no mechanism available postfix/smtpd: _sasl_plugin_load failed on sasl_auxprop_plug_init for

делаем вот это

apt-get remove libsasl2-modules-sql

а для того,что бы не получить ошибку

postfix/smtpd: warning: SASL authentication failure: cannot connect to saslauthd server: Permission denied
postfix/smtpd: warning: SASL authentication failure: Password verification failed
postfix/smtpd: warning: SASL plain authentication failed: generic failure

добавляем пользователя postfix в группу sasl

adduser postfix sasl

5)Перезапускаем службы Postfix и Saslauthd и тестируем:

testsaslauthd -s smtp -u [email protected] -p password

если ответ был 0: OK «Success.» то поздравляю! Авторизация успешно работает,из БД все успешно читается.Если нет,ищите ошибку в логах.

6)Настраиваем Postfix на авторизацию SMTP через saslauthd. В /etc/postfix/sasl/smtpd.conf и приводим к такому виду:

pwcheck_method: saslauthd
mech_list: plain login cram-md5 digest-md5
log_level: 7

Ну и не забываем в /etc/postfix/main.cf

smtpd_sasl_auth_enable = yes
smtpd_sasl_path = smtpd

smtpd_recipient_restrictions = permit_sasl_authenticated, (и далее тут идут еще куча других параметров)

7)А теперь в студии тот самый гребаный параметр -r с которым должен запускаться Saslauthd.

Как выяснилось методом научного тыка,прописывать этот параметр в /etc/defaults/saslauthd почему то не дает результата.Потому я решил сделать демону клизму — вписать этот параметр в скрипт запуска и управления демоном. Для этого берем /etc/init.d/saslauthd, находим там строчку и дописываем в нее параметр -r. Получится в итоге вот так:

# Construct argument string.
DAEMON_ARGS=»-a $MECHANISMS -r $MECH_OPTIONS $OPTIONS $THREAD_OPTIONS»

7)Теперь перезагружаем Postfix, Saslauthd  и тестируем нашу отправку.Можно почтовиком, можно и руками,как я описывал это вот тут.

от RUSUA

3 комментария к «Авторизация SMTP PAM_MYSQL + PostFix»
  1. Вот хочется руку пожать за эту статью:) Автору огромное спасибо!
    Наступил на подобные грабли и если бы не попал на эту страницу, то вряд ли бы быстро справился с моей задачей.

    1. Рад помочь) Боролся с этой фигней более полугода) И поборов сразу выложил что б не забыть самому,и другим в помощь вдруг что)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Анти-спам: выполните заданиеWordPress CAPTCHA