[Comm] Postfix + SMTP-AUTH + SASL + MySQL

Eugene Prokopiev prokopiev на stc.donpac.ru
Вс Окт 30 19:01:21 MSK 2005


Здравствуйте!

Задача: настроить SMTP-авторизацию в Postfix, имена и пароли 
пользователей уже хранятся в MySQL (открытым текстом):

mysql> select userid, passwd from dbmail_users;
+--------------------------------+----------+
| userid                         | passwd   |
+--------------------------------+----------+
| john                           | jpwd     |
+--------------------------------+----------+

Имею установленные:

# rpm -qa | grep postfix (взят из бэкпортов)
postfix-control-1.2-alt1
postfix-2.2.4-alt0.M24.1
postfix-html-2.2.4-alt0.M24.1
postfix-mysql-2.2.4-alt0.M24.1
postfix-tls-2.2.4-alt0.M24.1

# rpm -qa | grep sasl (сначала пытался взять из бекпортов, но там alt0, 
т.е. версия младше - как это получилось?)
libsasl2-2.1.19-alt1
libsasl2-plugin-sql-2.1.19-alt1
cyrus-sasl2-2.1.19-alt1
cyrus-sasl2-docs-2.1.19-alt1

Читаю /usr/share/doc/postfix-2.2.4/README.ALT-ru_RU.KOI8-R: "Вся 
конфигурация SASL находится в /etc/postfix/sasl"

Однако:

# ls -l /etc/postfix/sasl
ls: /etc/postfix/sasl: No such file or directory

Пытаюсь определить, где лежат конфиги, стандартым методом :)

# rpm -qli `rpm -qa | grep sasl` | grep /etc
/etc/sasl2
/etc/sasl2/sasldb2
/etc/rc.d/init.d/saslauthd
/etc/sasl2/saslauthd.conf
/etc/sasl2/saslpasswd.conf
/etc/sysconfig/saslauthd

Cмотрю, что там уже наконфигурено:

# cat /etc/sasl2/saslpasswd.conf
pwcheck_method: sasldb

# cat /etc/sasl2/saslauthd.conf | grep -v "^[#]"
ldap_servers: ldap://10.1.1.15/ ldap://10.1.1.25/
ldap_bind_dn: cn=operator,ou=Profile,o=foo.com
ldap_bind_pw: secret
ldap_version: 3
ldap_timeout: 5
ldap_time_limit: 5

Прихожу в некоторое замешательство от отсутствия упоминаний об sql и иду 
в search.altlinux.ru, где упоминается совсем другой файл 
/usr/lib/sasl2/smtpd.conf. О lib говорит и google в ответ на "postfix 
sasl mysql". Предполагаю, что и в ALT когда-то следовали общим правилам, 
а затем решили поместить этот файл в более приличное место.

Создаю этот файл и вписываю в него:

pwcheck_method: auxprop
auxprop_plugin: sql
mech_list: plain login
sql_engine: mysql
sql_hostnames: localhost
sql_user: dbmail
sql_passwd: dbmailpwd
sql_database: dbmail
sql_select: select passwd from dbmail_users where userid='%u'

После запуска сервиса saslauthd приходит мысль протестировать 
когфигурацию с помощью testsaslauthd, который я успел заметить в rpm 
-qli cyrus-sasl2:

testsaslauthd: usage: testsaslauthd -u username -p password
               [-r realm] [-s servicename]
               [-f socket path] [-R repeatnum]

Мана нет, что указывать в -r и -s непонятно, приходится оставить эту 
затею и тестировать непосредственно Postfix.

В /usr/share/doc/postfix-2.2.4/README.ALT-ru_RU.KOI8-R сказано: 
"Некоторые типы представлений (и поддержка SASL) требуют дополнительной
настройки (не отраженной в оригинальной документации) для работы в
chroot окружении.  Простое решение этой проблемы - использовать для
таких представлений сервис proxy, который работает вне chroot.
Для SASL решение более нетривиальное и требует частного подхода, но, в
большистве случаев, может быть решено следующим образом - сокет демона
saslauthd должен находится в пределах chroot (например, в каталоге
/var/spool/postfix/var/run/saslauthd)"

Осталось придумать, как поместить сокет демона saslauthd в чрут 
постфикса. Как сделать это правильно (и проверить, правильно ли сделал) 
не знаю, поэтому делаю так:

# mkdir /var/spool/postfix/var/run
# ln -s /var/run/saslauthd/mux /var/spool/postfix/var/run/mux

Дальше в main.cf дописываю:

smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks 
permit_sasl_authenticated reject

Перезапускаю Postfix и тестирую то, что получилось:

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 myserver.myprovider.ru ESMTP Postfix
ehlo client
250-myserver.myprovider.ru
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH SRP PLAIN OTP NTLM LOGIN DIGEST-MD5 CRAM-MD5
250 8BITMIME

Ага, теперь спрашиваю у google, чем кодировать логин/пароль при 
использовании PLAIN или LOGIN. Последний отвечает, что нужен mimencode.

# apt-cache search mimencode
#

Никого ...

Ладно, воспользуемся Thunderbird. Отправляю письмо, указываю 
логин/пароль, у меня спрашивают его еще раз. В логах:

SASL CRAM-MD5 authentication failed
SASL NTLM authentication failed
SASL PLAIN authentication failed
SASL LOGIN authentication failed
SASL CRAM-MD5 authentication failed

и т.д.

И постоянно повторяется:

postfix/smtpd[12043]: warning: SASL authentication problem: unable to 
open Berkeley db /etc/sasl2/sasldb2: No such file or directory

Файл этот есть, но если Postfix пытается искать его у себя в чруте, то 
он естественно его не найдет. Но откуда он вообще берет это? Догадка, 
что сервис saslauthd не виноват, подтверждается, т.к. после его 
опускания в лог валятся те же сообщения. Т.е. Postfix плевал на 
saslauthd и пытается искать логин/пароль сам.

Все, я шокирован окончательно ...

Последняя идиотская попытка: если /etc/postfix/sasl упомянут, то может 
нужно создать такой файл и вписать туда содержимое smtpd.conf? Или 
создать такой каталог и в него этот файл положить? А демон saslauthd не 
нужен?

Попробовал, не работает.

Что мне делать дальше?

Кстати, при старте saslauthd я вижу тоже не совсем то, что хотелось бы:

Oct 30 18:51:03 myserver saslauthd[16198]: detach_tty      : master pid 
is: 16198
Oct 30 18:51:03 myserver saslauthd[16198]: ipc_init        : listening 
on socket: /var/run/saslauthd/mux
Oct 30 18:53:31 myserver postfix/smtpd[16697]: sql_select option missing
Oct 30 18:53:31 myserver postfix/smtpd[16697]: auxpropfunc error no 
mechanism available
Oct 30 18:53:31 myserver postfix/smtpd[16697]: _sasl_plugin_load failed 
on sasl_auxprop_plug_init for plugin: sql

Что не так?

-- 
С уважением, Прокопьев Евгений



Подробная информация о списке рассылки community