Назад | Перейти на главную страницу

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, но не вижу, что на это влияет !?

Я нашел проблему, так что вот она на случай, если это кому-то поможет:

Есть файл конфигурации для 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" будет передан как логин: "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