Postfix опускает область (@domain) при проверке подлинности smtpd pam+mysql
Я пытаюсь настроить Postfix, чтобы пользователи могли отправлять электронную почту через SMTP с именем пользователя и паролем. И я пытаюсь сохранить учетные данные в базе данных MySQL. Я пошел по пути saslauthd
а также pam
и я застрял на полпути.
Включив функцию отладки pam, я вижу, что, когда я пытаюсь отправить электронное письмо с помощью Thunderbird, выполняется запрос для получения пароля:
pam_mysql - SELECT password FROM mailbox WHERE username = 'mehran'
Это в том случае, если имя пользователя содержит значение mehran@example.com
, Но когда я пытаюсь:
# testsaslauthd -u mehran@example.com -p 123 -s smtp
0: OK "Success."
И журнал гласит:
pam_mysql - SELECT password FROM mailbox WHERE username = 'mehran@example.com'
Показывая, что это Postfix, кто пропускает @domain из имени пользователя, прежде чем передать его saslauthd
(или, по крайней мере, я так считаю). Я искал конфигурацию Postfix, но не вижу, что на это влияет!?
2 ответа
Я нашел проблему, так что вот в случае, если это поможет кому-либо:
Там есть файл конфигурации для saslauthd
шахта находится в /etc/sysconfig/saslauthd
:
# Directory in which to place saslauthd's listening socket, pid file, and so
# on. This directory must already exist.
SOCKETDIR=/var/run/saslauthd
# Mechanism to use when checking passwords. Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=pam
# Options sent to the saslauthd. If the MECH is other than "pam" uncomment the next line.
# DAEMONOPTS=--user saslauth
# OPTIONS="-c -r -m /var/spool/postfix/var/run/saslauthd"
OPTIONS="-c -m /var/run/saslauthd"
# Additional flags to pass to saslauthd on the command line. See saslauthd(8)
# for the list of accepted flags.
FLAGS=
OPTIONS
переменная должна содержать параметры, переданные saslauthd
, Это отсутствует -r
который делает то, что я искал. Согласно его документации:
-r Объединить царство с логином (между ними должен быть знак "@"). например, login: "foo" realm: "bar" будет передано как login: "foo @ bar". Обратите внимание, что область все равно будет пройдена, что может привести к неожиданному поведению.
Но моя проблема не была решена только этим изменением! Оказалось, что из-за какой-то ошибки в /etc/init.d/saslauthd
Скрипт, хотя упомянутый выше файл конфигурации загружен, но не применяется! $OPTIONS
никогда не использовался!!!
Вот оригинальный начальный раздел /etc/init.d/saslauthd
сценарий:
start() {
[ -x $path ] || exit 5
echo -n $"Starting $prog: "
daemon $DAEMONOPTS $path -m $SOCKETDIR -a $MECH $FLAGS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $lockfile
return $RETVAL
}
И вот как я исправил это:
start() {
[ -x $path ] || exit 5
echo -n $"Starting $prog: "
daemon $DAEMONOPTS $path $OPTIONS -a $MECH $FLAGS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $lockfile
return $RETVAL
}
Все сделано! Теперь запрос содержит полный адрес электронной почты для проверки пароля.
Ваш запрос содержит неверный / неполный параметр для запроса.
Этот запрос добавит домен к локальной части логина:
SELECT password FROM mailbox WHERE username = '%u@%r'
Исправьте запрос в вашей конфигурации SASL для постфикса, например /etc/postfix/sasl/smtpd.conf