LINUX.ORG.RU

Авторизация в exim и MySQL


0

2

Доброго времени суток!

При настройке связки exim+dovecot и попытке авторизоваться через SMTP получаю отлуп6

auth_login authenticator failed for ([192.168.0.107]) [192.168.0.107] I=[192.168.0.108]:25: 535 Incorrect authentication data (set_id=admin@domain.test)
exim к MySQL шлет запрос (в ответ приходит поле с password_md5 и значением 'd8e8fca2dc0f896fd7cb4cb0031ba249' test в md5)
SELECT mail.password AS password_md5 FROM mail,domains WHERE (domains.domain = 'domain.test' AND mail.login = 'admin' AND domains.id = mail.domain_id)

аунтификатор описан:

auth_login:
        driver = plaintext
        public_name = LOGIN
        server_prompts = "Username:: : Password::"
        server_condition  = ${if and {   {!eq{$1}{}} \
                        {!eq{$2}{}} \
                        {crypteq{$2}{${lookup mysql{ \
                        SELECT mail.password AS password_md5 FROM mail,domains WHERE \
                        (domains.domain = '${quote_mysql:${domain:$1}}' AND mail.login = '${quote_mysql:${local_part:$1}}' AND domains.id = mail.domain_id) \
                        }{$value}fail}} }} {yes}{no}}
        server_set_id = $1

Попровьте на нужное русло.

PS: не нашел информации в каком виде храним пароли в БД (md5/plain).

14:39:39 13317 250-SIZE 67108864
14:39:39 13317 250-PIPELINING
14:39:39 13317 250-AUTH LOGIN
14:39:39 13317 250 HELP
14:39:39 13317 SMTP<< AUTH LOGIN
14:39:39 13317 SMTP>> 334 VXNlcm5hbWU6
14:39:39 13317 SMTP<< YWRtaW5AZG9tYWluLmNvbQ==
14:39:39 13317 SMTP>> 334 UGFzc3dvcmQ6
14:39:39 13317 SMTP<< dGVzdA==
14:39:39 13317 auth_login authenticator:
14:39:39 13317   $auth1 = admin@domain.com
14:39:39 13317   $auth2 = test
14:39:39 13317   $1 = admin@domain.com
14:39:39 13317   $2 = test
14:39:39 13317 expanding: $1
14:39:39 13317    result: admin@domain.com
14:39:39 13317 expanding: 
14:39:39 13317    result: 
14:39:39 13317 expanding: $2
14:39:39 13317    result: test
14:39:39 13317 expanding: 
14:39:39 13317    result: 
14:39:39 13317 expanding: $2
14:39:39 13317    result: test
14:39:39 13317 expanding: $1
14:39:39 13317    result: admin@domain.com
14:39:39 13317 expanding: ${domain:$1}
14:39:39 13317    result: domain.com
14:39:39 13317 expanding: $1
14:39:39 13317    result: admin@domain.com
14:39:39 13317 expanding: ${local_part:$1}
14:39:39 13317    result: admin
14:39:39 13317 expanding:  SELECT mail.password FROM mail,domains  WHERE domains.domain = '${quote_mysql:${domain:$1}}' AND mail.login = '${quote_mysql:${local_part:$1}}' AND domains.id = mail.domain_id 
14:39:39 13317    result:  SELECT mail.password FROM mail,domains  WHERE domains.domain = 'domain.com' AND mail.login = 'admin' AND domains.id = mail.domain_id 
14:39:39 13317 search_open: mysql "NULL"
14:39:39 13317 search_find: file="NULL"
14:39:39 13317   key="SELECT mail.password FROM mail,domains  WHERE domains.domain = 'domain.com' AND mail.login = 'admin' AND domains.id = mail.domain_id " partial=-1 affix=NULL starflags=0
14:39:39 13317 LRU list:
14:39:39 13317 internal_search_find: file="NULL"
14:39:39 13317   type=mysql key="SELECT mail.password FROM mail,domains  WHERE domains.domain = 'domain.com' AND mail.login = 'admin' AND domains.id = mail.domain_id "
14:39:39 13317 database lookup required for SELECT mail.password FROM mail,domains  WHERE domains.domain = 'domain.com' AND mail.login = 'admin' AND domains.id = mail.domain_id 
14:39:39 13317 MySQL query: SELECT mail.password FROM mail,domains  WHERE domains.domain = 'domain.com' AND mail.login = 'admin' AND domains.id = mail.domain_id 
14:39:39 13317 MYSQL new connection: host=x.x.x.x port=8092 socket=NULL database=xxx user=xxx
14:39:40 13317 lookup yielded: e02d374fde0dc75a17a557039a3a5338c7743304777dccd376
14:39:40 13317 expanding: $value
14:39:40 13317    result: e02d374fde0dc75a17a557039a3a5338c7743304777dccd376
14:39:40 13317 expanding: ${lookup mysql{ SELECT mail.password FROM mail,domains  WHERE domains.domain = '${quote_mysql:${domain:$1}}' AND mail.login = '${quote_mysql:${local_part:$1}}' AND domains.id = mail.domain_id }{$value}fail}
14:39:40 13317    result: e02d374fde0dc75a17a557039a3a5338c7743304777dccd376
14:39:40 13317 crypteq: using crypt()
14:39:40 13317   subject=e0ZFgEaXQ1rB2
14:39:40 13317   crypted=e02d374fde0dc75a17a557039a3a5338c7743304777dccd376
14:39:40 13317 condition: and {   {!eq{$1}{}} {!eq{$2}{}} {crypteq{$2}{${lookup mysql{ SELECT mail.password FROM mail,domains  WHERE domains.domain = '${quote_mysql:${domain:$1}}' AND mail.login = '${quote_mysql:${local_part:$1}}' AND domains.id = mail.domain_id }{$value}fail}} }}
14:39:40 13317    result: false
14:39:40 13317 expanding: yes
14:39:40 13317    result: yes
14:39:40 13317 skipping: result is not used
14:39:40 13317 expanding: no
14:39:40 13317    result: no
14:39:40 13317 expanding: ${if and {   {!eq{$1}{}} {!eq{$2}{}} {crypteq{$2}{${lookup mysql{ SELECT mail.password FROM mail,domains  WHERE domains.domain = '${quote_mysql:${domain:$1}}' AND mail.login = '${quote_mysql:${local_part:$1}}' AND domains.id = mail.domain_id }{$value}fail}} }} {yes}{no}}
14:39:40 13317    result: no
14:39:40 13317 expanded string: no
14:39:40 13317 expanding: $1
14:39:40 13317    result: admin@domain.com
14:39:40 13317 SMTP>> 535 Incorrect authentication data
14:39:40 13317 LOG: MAIN REJECT
14:39:40 13317   auth_login authenticator failed for (localhost) [192.168.0.107] I=[192.168.0.108]:25: 535 Incorrect authentication data (set_id=admin@domain.com)
14:39:40 13317 SMTP>> 421 mx.domain.com lost input connection
14:39:40 13317 LOG: smtp_connection MAIN
14:39:40 13317   SMTP connection from (localhost) [192.168.0.107] I=[192.168.0.108]:25 lost
14:39:40 13317 search_tidyup called
14:39:40 13317 close MYSQL connection: x.x.x.x:8092/xxx/xxx
14:39:40 13316 child 13317 ended: status=0x100
14:39:40 13316 0 SMTP accept processes now running

Доигрался до такого результата.

Journalist ()
Ответ на: комментарий от Journalist

Попробуйте в почитать, что хочет crypteq на вход

hizel ★★★★★ ()
Ответ на: комментарий от hizel

+1. Оно по дефолту думает, что хэш (2й аргумент crypteq) это результат crypt(). Чтоб оно распознало его как md5(), хэш должен иметь {md5} в начале. То есть придется сделать concat в mysql запросе.

Bers666 ★★★★ ()

у меня так:

auth_cram_md5:
    driver = dovecot
    public_name = CRAM-MD5
    server_socket = /var/run/dovecot/auth-client
    server_set_id = $auth1

Ну и в dovecot default_pass_scheme = MD5

black_13 ()
Ответ на: комментарий от black_13

Кстати довекоту (в отл. от exim) можно принудительно в конфиге сообщить, в каком формате хэши паролей (default_pass_scheme). Так что настроить auth через сокет довекота не такая уж и плохая идея. Кроме этого, dovecot можно заюзать как lda, т.к. он понимает sieve - полезно.

Bers666 ★★★★ ()
Ответ на: комментарий от black_13

плюсую

у меня почти так же, только без довкота

client_auth:
  driver = cram_md5
  public_name = CRAM-MD5
  server_secret = ${lookup mysql{SELECT passwd FROM users WHERE username = '${local_part:$1}' AND domainname = '${domain:$1}' AND active = 'Y'}{$value}fail}  
  server_set_id = $1

menefis ()
Ответ на: плюсую от menefis

у тебя пароль в чистом тексте. нехорошо!

Bers666 ★★★★ ()
Ответ на: комментарий от Bers666

то есть если в пароле присутствует {md5} он автоматом при моем конфиге будет закидывать пароль клиента в md5 и сверять хеши?

Тобишь изменяю в одном месте запрос и использую хеши?:

SELECT CONACT (\'{md5}\',mail.password) FROM mail,domains  WHERE domains.domain = '${quote_mysql:${domain:$1}}' AND mail.login = '${quote_mysql:${local_part:$1}}' AND domains.id = 
mail.domain_id 

Правильно ли я понял все?

Journalist ()
Ответ на: комментарий от Journalist

Я сам не гуру в Exim, но по моему тебе надо сделать так: 1. Файл /etc/exim/exim.conf - ставишь такую секцию которую я привел:

begin authenticators

auth_plain:
driver = dovecot
public_name = PLAIN
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1

auth_login:
driver = dovecot
public_name = LOGIN
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1

auth_cram_md5:
driver = dovecot
public_name = CRAM-MD5
server_socket = /var/run/dovecot/auth-client
server_set_id = $auth1
2. Файл /var/www/html/postfixadmin/config.inc.php - меняешь настройки алгоритмов на:
$CONF['encrypt'] = 'dovecot:CRAM-MD5';
$CONF['dovecotpw'] = "/usr/bin/doveadm pw";
3. Файл /var/www/html/roundcube/config/main.inc.php - меняешь алгоритм на cram-md5:
$rcmail_config['imap_auth_type'] = cram-md5;
4. Файл /etc/dovecot/dovecot.conf - меняешь алгоритмы авторизации на plain,login и cram-md5:
auth_mechanisms = plain login cram-md5
5. Файл /etc/dovecot/dovecot-mysql.conf - ставишь:
default_pass_scheme = CRAM-MD5

PS: Это связка из Exim+Dovecot+MySQL+PostfixAdmin+Roundcube

AlfaStriker ()
Ответ на: комментарий от AlfaStriker

Вот мой - dovecot-mysql.conf:

driver = mysql
connect = host=localhost dbname=vexim user=mail password=youpassword
default_pass_scheme = CRAM-MD5
password_query = SELECT `username` as `user`, `password` FROM  `mailbox` WHERE `username` = '%n@%d' AND `active`='1'
user_query = SELECT 93 AS `uid`, 93 AS `gid` FROM `mailbox` WHERE `username` = '%n@%d' AND `active`='1'

AlfaStriker ()
Ответ на: комментарий от Journalist

должно взлететь :) почитай описание exim-овского crypteq()

Bers666 ★★★★ ()
Ответ на: комментарий от AlfaStriker

Пароли в базе будут в cram-md5. Это оптимальное решение.

Такие почтовые клиенты как The Bat, Apple Mail, Thunderbird используют во время работы именно cram-md5.

anonymous ()
Ответ на: комментарий от anonymous

Пароли в базе будут в cram-md5

exim-овская реализация cram-md5 требует наличия плейн-текст паролей в базе.

Bers666 ★★★★ ()
Ответ на: комментарий от anonymous

Thunderbird использует и LOGIN и PLAIN если в конфиге сервера указать. Приоритет кажется на PLAIN.

Journalist ()
Ответ на: комментарий от Journalist

Это верно, но если есть cram-md5 - это самый высший приоритет. И вообще лучше использовать cram-md5 и TLS/SSL.

У тебя все заработало?

AlfaStriker ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.