[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 и тестируем нашу отправку.Можно почтовиком, можно и руками,как я описывал это вот тут.
Вот хочется руку пожать за эту статью:) Автору огромное спасибо!
Наступил на подобные грабли и если бы не попал на эту страницу, то вряд ли бы быстро справился с моей задачей.
Рад помочь) Боролся с этой фигней более полугода) И поборов сразу выложил что б не забыть самому,и другим в помощь вдруг что)
А вот у меня этот параметр -r куда не вписывай, все без толку.