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

Драйвер Dovecot auth-sql не соблюдает параметры имени пользователя sql, как мне обойти это?

Dovecot работает в тюрьме и правильно настроен для соединений SQL.

dovecot-sql-conf.ext имеет соответствующие параметры, основная проблема - подключение.

connect = host = 127.0.0.1 dbname = mailserver user = mailuser password = password

Пользователь sql установлен на mailuser'@'127.0.0.1, поэтому нет проблем с dovecot или postfix, пытающимися получить доступ к сокету, к которому он не может получить доступ из тюрьмы.

Dovecot запускается, проблем нет. Попытка войти в imap, временная ошибка аутентификации.

Журналы гласят следующее:

dovecot: auth-worker (1295): Ошибка: mysql (127.0.0.1): Не удалось подключиться к базе данных ((почтовый сервер)): Доступ запрещен для пользователя mailuser @ localhost (с использованием пароля: ДА).

Кто-нибудь знает, как заставить dovecot использовать формат% u (username = user @ domain) для имени пользователя sql-драйвера вместо% n (user) @ 'localhost' ...

Я буквально перепробовал все, что мог придумать / найти, включая погружение в источник для изменения параметра localhost. Вроде непреложный.

Параметр option_file выглядел многообещающе, но тестирование показывает, что он на самом деле не считывает большинство параметров подключения, и нет абсолютно никакой документации по формату, который они ищут, кроме как начать с option_group [client], чтобы избежать фатальной ошибки.

Я бы действительно предпочел не перемещать сокет sql в папку dovecot и мне нужно было создавать отдельное имя пользователя sql, чтобы dovecot мог делать запросы, если это вообще возможно.

Я надеюсь, что кто-то из присутствующих может иметь представление о том, как решить эту проблему ...

Для справки я использую пакет 2.2.33.2, доступный для Bionic. Я планирую скомпилировать новейшую версию dovecot завтра, когда у меня будет время (хотя по этому поводу не было никаких ошибок / проблем.

Изменить: @anx, я включил SELECT User, Host, Plugin из mysql.user; Мне пришлось предоставить дополнительные привилегии, чтобы вытащить это; Изменить: я настроил тесты mysql, чтобы включить имя базы данных; Раньше я просто набирал USE mailserver;

+-----------+-----------+-------------+
| user      | host      | plugin      |
+-----------+-----------+-------------+
| root      | localhost | unix_socket |
| mailuser  | 127.0.0.1 |             |
| mailadmin | localhost |             |
+-----------+-----------+-------------+

Ниже приведены команды, которые я использовал для проверки входа в систему с помощью mailuser, обе успешно выполнены.

-----------------------------------
mysql -u mailuser -p -h 127.0.0.1.
MariaDB: USE mailserver;
-----------------------------------
mysql -u mailuser -p -h 127.0.0.1 --database='mailserver'
-----------------------------------

(Same output for both commands)
MariaDB[mailserver]> SELECT * from virtual_users
+----+-----------+------------------+------------------+
| id | domain_id | email            | password         |
+----+-----------+------------------+------------------+
|  1 |         1 | john@example.org | {SHA256-CRYPT}.. |
+----+-----------+------------------+------------------+

Тестирование аутентификации через dovecot было сделано следующим образом:

openssl s_client -connect 127.0.0.1:993 -crlf
IMAP> a login john@example.org password

Временная ошибка аутентификации

Драйвер dovecot mysql выше содержит имя базы данных в строке подключения.

Журналы показывают много записей, подобных приведенной ниже, где проверка подлинности SQL не выполняется из-за неправильной идентификации.

dovecot: auth-worker(1394): Error: mysql(127.0.0.1): Connect failed to database (mailserver): Access denied for user 'mailuser'@'localhost' (using password: YES) - waiting for 125 seconds before retry.

РЕДАКТИРОВАТЬ: подробности см. В принятом ответе. TL; DR проблема заключалась в повреждении оборудования (ASPM) / сети докеров.

Спасибо, Майкл, я соответствующим образом скорректировал пост.

По сути, вышеупомянутый стек был стеком postfix / dovecot / msql, который был контейнерным и работал в течение нескольких лет. Сборка была недавно обновлена, и она пройдет тесты, но после развертывания выйдет из строя.

Проблема была странной, когда аутентификация с помощью dovecot не выполнялась во время ручного тестирования.

Аутентификация Dovecot будет работать без проблем, если компоненты находятся в отдельных контейнерах. Аутентификация Dovecot завершится ошибкой при подключении или тестировании через адаптер обратной петли в контейнере.

Примерно через неделю после публикации я работал со стеком и закончил тем, что сделал дамп TCP в разных местах и ​​на разных этапах процесса аутентификации.

Кто-то из списка разработчиков dovecot заметил, что были некоторые ошибки контрольной суммы, когда пакеты не отбрасывались, и эти пакеты приводили к сбою работы контейнерной службы в режиме обратной связи.

Примерно в то же время, копаясь в этой проблеме, я заметил ошибку шины PCIe на хосте, при которой ошибка L2 записывалась в кольцевой буфер ядра с кодом состояния 00001100, периодически и случайным образом.

В конце концов стало ясно, что ошибки не были полностью случайными, поскольку они, казалось, имели тенденцию к тому времени, когда большое количество контейнеров удалялось или создавалось (непоследовательно).

Ошибка отображалась как исправленная, и все обычные тесты tcp, udp, icmp прошли без проблем, никаких других проблем не было, поэтому ранее она не рассматривалась.

Я переместил образ на другой хост с другим оборудованием, и проблема исчезла.

Вернувшись к исходному хосту и покопавшись, я обнаружил, что причиной ошибки был ASPM благодаря сообщению Томаса Кренна; и передача ядру параметра pcie_aspm = off устранила ошибку.

Повторное тестирование проблемы впоследствии показало, что проблемы больше нет. Через три недели проблема еще не всплыла.

TL; DR - проблема не в проблеме голубятни, а в основной аппаратной проблеме, которая вызвала повреждение пакетов через некоторые сетевые интерфейсы докеров, и поврежденные пакеты по какой-то причине не отбрасывались.

В нашем случае тесты, запущенные с хоста или переданные от раннера, не имели проблем, а тесты, запущенные на интерактивной консоли в контейнере или запущенные службой контейнера, прошедшей петлю, неожиданно завершились ошибкой.

Если вы используете какие-либо виртуальные машины или контейнерную инфраструктуру; в идеальном мире виртуальные сети будут работать так же, как физические сети, и это определенно не идеальный мир.

Спасибо всем, кто помог.