Недавно я переключил хеширование паролей с md5 на ssha512. Это отлично работает с dovecot, поэтому я могу читать входящую почту без проблем.
Это не работает также для exim4.
Вывод журнала из exim4:
less /var/log/exim4/rejectlog
2015-07-27 13:36:42 fixed_plain authenticator failed for CURRENT_LOCATION (loki) [212.71.209.15]: 435 Unable to authenticate at present (set_id=USER@DOMAIN.TLD): lookup of "select concat(users.username,'@',domains.domain_name) from users left join sites on sites.site_id=users.site_id left join domains on domains.site_id=sites.site_id where concat(users.username,'@',domains.domain_name)='USER@DOMAIN.TLD' and users.password=ssha.b64('SECRETPASSWORD')" gave DEFER: MYSQL: query failed: FUNCTION ssha.b64 does not exist
(Идентификационные данные были обменены по соображениям конфиденциальности)
Очевидно, это связано с тем, что в mysql нет функции ssha.b64. Есть ли способ запросить mysql с простым паролем, чтобы mysql хешировал и солировал пароль из соли в его базе данных?
Соответствующие файлы конфигурации:
cat /etc/exim4/conf.d/auth/25_exim4-dave-virtmail
fixed_plain:
driver = plaintext
public_name = PLAIN
# old query, still using md5 (not working anymore)
server_condition = ${lookup mysql{select concat(users.username,'@',domains.domain_name) from users left join sites on sites.site_id=users.site_id left join domains on domains.site_id=sites.site_id where concat(users.username,'@',domains.domain_name)='$2' and users.password=md5('$3')}{1}fail}
# obviously wrong query, test
# server_condition = ${lookup mysql{select concat(users.username,'@',domains.domain_name) from users left join sites on sites.site_id=users.site_id left join domains on domains.site_id=sites.site_id where concat(users.username,'@',domains.domain_name)='$2' and users.password=ssha.b64('$3')}{1}fail}
server_set_id = $2
fixed_login:
driver = plaintext
public_name = LOGIN
server_prompts = "Username:: : Password::"
# old query, still using md5 (not working anymore)
server_condition = ${lookup mysql{select concat(users.username,'@',domains.domain_name) from users left join sites on sites.site_id=users.site_id left join domains on domains.site_id=sites.site_id where concat(users.username,'@',domains.domain_name)='$1' and users.password=md5('$2')}{1}fail}
# obviously wrong query, test
# server_condition = ${lookup mysql{select concat(users.username,'@',domains.domain_name) from users left join sites on sites.site_id=users.site_id left join domains on domains.site_id=sites.site_id where concat(users.username,'@',domains.domain_name)='$1' and users.password=ssha.b64('$2')}{1}fail}
server_set_id = $1
Сравните с голубятней:
cat /etc/dovecot/dovecot-sql.conf.ext|grep password_query
password_query = select users.username AS username, domains.domain_name AS domain, concat("{SSHA512.BASE64}", users.password) AS password from users left join sites on sites.site_id=users.site_id left join domains on domains.site_id=sites.site_id where concat(users.username,'@',domains.domain_name)= '%u'
Буду признателен за указатели или рабочий mysql-запрос. Я знаю, в чем ошибка, но не могу определить правильный запрос.
Надо было лучше изучить документацию.
В соответствии с документация exim, exim не поддерживает ssha512 (пока?).
Я выбрал простой выход и просто сказал exim'у использовать dovecot для аутентификации, например документация dovecot говорит вам.
Сожалею, что потратил ваше время, и надеюсь, что мой опыт кому-то пригодится.