Dovecot auth-sql 驱动程序不尊重 sql 用户名选项,我该如何解决这个问题?

Dovecot auth-sql 驱动程序不尊重 sql 用户名选项,我该如何解决这个问题?

Dovecot 正在监狱中运行,并正确设置了 SQL 连接。

dovecot-sql-conf.ext 有适当的选项,主要有问题的是连接。

连接 = 主机 = 127.0.0.1 dbname = 邮件服务器用户 = 邮件用户密码 = 密码

sql 用户设置为“mailuser”@“127.0.0.1”,因此 dovecot 或 postfix 尝试访问无法从 jail 访问的套接字时不会出现任何问题。

Dovecot 启动,没有问题。尝试 imap 登录,临时身份验证失败。

日志内容如下:

dovecot:auth-worker(1295):错误:mysql(127.0.0.1):连接数据库失败((mailserver)):拒绝用户“mailuser”@“localhost”访问(使用密码:是)。

是否有人知道如何强制 dovecot 使用 %u (username=user@domain) 格式作为 sql-driver 用户名而不是 %n (user)@'localhost'...

我几乎尝试了所有我能想到/找到的方法,包括深入研究更改“localhost”参数的源代码。它似乎是不可变的。

option_file 看起来很有希望,但测试表明它实际上并没有读取大多数连接参数,并且除了以 [client] 的 option_group 开头以避免致命错误之外,完全没有关于他们正在寻找的格式的文档。

我真的不想将 sql 套接字移动到 dovecot 文件夹,而必须创建单独的 sql 用户名,以便 dovecot 可以尽可能进行查询。

我希望这里有人可能知道如何解决这个问题......

作为参考,我使用的是 Bionic 提供的 2.2.33.2 包。我计划明天有时间时编译最新版本的 dovecot(尽管这方面没有错误/问题)。

编辑:@anx,我已经从 mysql.user 中包含了 SELECT User,Host,Plugin;我必须授予额外的权限才能拉取它;编辑:我已经调整了 mysql 测试以包含 dbname;我之前只是输入了 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 | [email protected] | {SHA256-CRYPT}.. |
+----+-----------+------------------+------------------+

通过 dovecot 测试身份验证如下:

openssl s_client -connect 127.0.0.1:993 -crlf
IMAP> a login [email protected] password

暂时身份验证失败

上面的 dovecot mysql 驱动程序在连接字符串中包含 dbname。

日志显示许多类似下面的条目,其中 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)/docker 网络损坏问题。

答案1

谢谢迈克尔,我已经对帖子进行了相应的调整。

基本上,上述堆栈是一个已容器化并运行了几年的 postfix/dovecot/msql 堆栈。该版本最近进行了更新,它可以通过测试,但一旦部署就会​​失败。

这个问题很奇怪,在手动测试期间使用 dovecot 进行身份验证无法进行身份验证。

当组件位于单独的容器中时,Dovecot 身份验证可以正常工作。当通过容器内的环回适配器进行连接或测试时,Dovecot 身份验证将失败。

在这篇文章发表大约一周后,我开始研究堆栈,并在身份验证过程的各个位置和阶段进行了 TCP 转储。

来自 dovecot 开发人员列表中的某个人注意到存在一些校验和错误,这些数据包未被丢弃,而这些数据包导致在环回上运行的容器服务失败。

大约在同一时间,在深入研究这个问题时,我注意到主机上出现了 PCIe 总线错误,其中 L2 错误被间歇性地随机写入内核环形缓冲区,状态代码为 00001100。

最终很明显,错误并不是完全随机的,因为它们似乎在大量容器被处置或创建(不一致)时出现。

该错误显示为已更正的错误,并且正常的 tcp、udp、icmp 测试全部成功而没有问题,没有其他问题存在,这就是之前没有查看它的原因。

我将图像移至具有不同硬件的另一台主机,问题就消失了。

回到原始主机并深入研究后,我发现 ASPM 是导致错误的原因,这要感谢 Thomas Krenn 的一篇文章;将 pcie_aspm=off 选项传递给内核解决了该错误。

之后重新测试发现问题不再存在。三周后,问题还没有再次出现。

TL;DR 的问题不是 dovecot 问题,而是底层硬件问题,它触发了某些 docker 网络接口上的数据包损坏,并且由于某种原因损坏的数据包没有被丢弃。

在我们的案例中,从主机运行或从运行器传入的测试没有问题,而在容器中的交互式控制台上启动的测试或由遍历环回的容器服务运行的测试会意外失败。

如果您正在使用任何类型的 VM 或容器化基础设施;在完美的世界中,虚拟网络将像物理网络一样工作,但它绝对不是一个完美的世界。

感谢所有提供帮助的人。

相关内容