Вопрос или проблема
Я использую dovecot 2.3.21 с Ubuntu 24.04.1 LTS. Я пытаюсь настроить сервер для работы как с виртуальными, так и с локальными пользователями. Виртуальные пользователи работают нормально, но у меня возникли проблемы с аутентификацией локального пользователя, когда я пытаюсь получить электронную почту с помощью клиента, такого как Roundcube. Я могу аутентифицировать локального пользователя (который существует в /etc/passwd и имеет действующий домашний каталог) с помощью doveadm:
$ sudo doveadm auth login test <passwd>
passdb: test auth succeeded
дополнительные поля:
user=test
дополнительные поля userdb:
test
system_groups_user=test
uid=5002
gid=5002
home=/home/test
auth_mech=PLAIN
$
Вот журнал, который создается при попытке входа с помощью Roundcube:
Dec 01 15:23:30 auth: Debug: auth client connected (pid=178248)
Dec 01 15:23:30 auth: Debug: client in: AUTH 1 CRAM-MD5 service=imap secured session=W92MNDsoEtl/AAAB lip=127.0.0.1 rip=127.0.0.1 lport=143 rport=55570
Dec 01 15:23:30 auth: Debug: client passdb out: CONT 1 PDM1ODYyOTExNDk5NjY2NjUuMTczMzA4NDYxMEBtYXJhdWRlcj4=
Dec 01 15:23:30 auth: Debug: client in: CONT 1 ZG1hcmMtcnVhQHByb2N1cmF0dXMubmV0IDYyZjRmNmQzY2RjOGY3MTA4ZDliMDMyMDI2YTYxYmNm (предыдущие данные в base64 могут содержать конфиденциальные данные)
Dec 01 15:23:30 auth: Debug: pam([email protected],127.0.0.1,<W92MNDsoEtl/AAAB>): Выполняется поиск в passdb
Dec 01 15:23:30 auth: Debug: pam([email protected],127.0.0.1,<W92MNDsoEtl/AAAB>): passdb не поддерживает поиск учетных данных
Dec 01 15:23:30 auth: Debug: pam([email protected],127.0.0.1,<W92MNDsoEtl/AAAB>): Завершен поиск в passdb
Dec 01 15:23:30 auth: Debug: passwd-file([email protected],127.0.0.1,<W92MNDsoEtl/AAAB>): Выполняется поиск в passdb
Dec 01 15:23:30 auth: Debug: passwd-file([email protected],127.0.0.1,<W92MNDsoEtl/AAAB>): поиск: [email protected] файл=/etc/dovecot/passwd
Dec 01 15:23:30 auth: Info: passwd-file([email protected],127.0.0.1,<W92MNDsoEtl/AAAB>): неизвестный пользователь
Dec 01 15:23:30 auth: Debug: passwd-file([email protected],127.0.0.1,<W92MNDsoEtl/AAAB>): Завершен поиск в passdb
Dec 01 15:23:30 auth: Debug: auth([email protected],127.0.0.1,<W92MNDsoEtl/AAAB>): Запрос аутентификации завершен
Dec 01 15:23:32 auth: Debug: client passdb out: FAIL 1 [email protected]
Dec 01 15:23:32 imap-login: Info: Отключено: Соединение закрыто (ошибка аутентификации, 1 попытка за 2 секунды): user=<[email protected]>, метод=CRAM-MD5, rip=127.0.0.1, lip=127.0.0.1, защищенное, session=<W92MNDsoEtl/AAAB>
Обратите внимание на сообщения “passdb не поддерживает поиск учетных данных” и “неизвестный пользователь”. Вот что у меня настроено в auth-system.conf.ext:
passdb {
driver = pam
args = session=yes failure_show_msg=yes dovecot
}
userdb {
driver = passwd
}
Что мне здесь не хватает?
PAM действительно не поддерживает поиски. Единственное, что он поддерживает, это интерактивная проверка, то есть его нельзя запрашивать о хэше пароля, но можно только дать пароль, и он ответит, действителен он или нет.
Но ваш RoundCube пытается использовать CRAM-MD5, который работает не так — это механизм вызова-ответа (очень похожий на NTLM по концепции), где клиент не отправляет серверу фактический пароль, который он мог бы проверить; вместо этого механизм требует, чтобы Dovecot извлек хэш пароля для проверки ответа на его основе, что PAM сделать не может. (Кроме того, по своей природе CRAM-MD5 требует, чтобы сохраненный хэш был в очень специфическом формате; ваши хэши в /etc/shadow также не сработают.)
Установите ваши Dovecot auth_mechanisms
, чтобы предлагать только PLAIN, а не CRAM:
auth_mechanisms = plain
Ответ или решение
Для решения проблемы аутентификации локальных пользователей в Dovecot, важно обратить внимание на конфигурацию, которую вы используете. Исходя из предоставленных данных, можно выделить несколько ключевых моментов, касающихся журналов и конфигурации сервера.
Анализ проблемы
Вы указали, что локальные пользователи, существующие в файле /etc/passwd
, не могут аутентифицироваться через Roundcube, в то время как виртуальные пользователи работают без проблем. При этом команда doveadm auth login
подтверждает, что аутентификация для локального пользователя проходит успешно.
Сервер Dovecot пытается выполнить аутентификацию, используя метод CRAM-MD5, что приводит к сообщениям об ошибках, таким как "unknown user" и "passdb doesn’t support credential lookups". Эти сообщения указывают на то, что существует несоответствие между методами аутентификации, используемыми вашим клиентом и Dovecot.
Причины возникновения проблемы
Наиболее вероятная причина заключается в том, что метод CRAM-MD5 требует, чтобы сервер мог извлекать хэш пароля для проверки, что невозможно с использованием PAM (Pluggable Authentication Modules). PAM поддерживает только интерактивные проверки, при которых ему передается пароль, и в ответ он указывает, действителен ли он или нет. Ни PAM, ни метод CRAM-MD5 не подходят для обеспечения этого механизма аутентификации.
Решение
Чтобы выйти из данной ситуации, вам необходимо изменить настройки Dovecot и запретить использование CRAM-MD5 в пользу более простой и совместимой схемы аутентификации. Ключевой настройкой здесь будет изменение auth_mechanisms
на PLAIN
.
-
Откройте файл конфигурации Dovecot, где у вас указаны настройки аутентификации (например,
10-auth.conf
). -
Найдите строку, начинающуюся с
auth_mechanisms
и измените её, если она уже существует:auth_mechanisms = plain
-
Если строки не существует, добавьте её под соответствующим блоком:
auth_mechanisms = plain
-
Перезапустите Dovecot, чтобы изменения вступили в силу:
sudo systemctl restart dovecot
Заключение
После выполнения этих изменений локальные пользователи должны успешно аутентифицироваться через Roundcube, используя метод PLAIN. Это решение должно устранить конфликты, связанные с несовместимостью между методами аутентификации и поддержкой PAM.
Если проблема сохраняется, обязательно проверьте другие возможные пути маршрутизации (например, наличие дополнительных конфигурационных файлов, которые могут перезаписывать настройки) и убедитесь, что ваш клиент правильно настроен для работы с аутентификацией PLAIN.
Этот подход не только обеспечит работоспособность вашей системы, но также повысит общую надежность сервера.