dovecot /usr/lib/dovecot/deliver 仅对 root 失败

dovecot /usr/lib/dovecot/deliver 仅对 root 失败

将 Ubuntu 从 14.04 升级到 16.04 之后,我无法再以 root 身份使用 procmail 中的 dovecot 交付程序进行系统交付,因为它声称无法打开 auth-userdb 文件,即使普通用户可以打开并且 imap 服务器运行正常。

我清除并重新安装了 dovecot,但没有效果。文件权限似乎没问题,但调用 dovcot 的 deliver以 root 身份失败,并且记录的唯一错误(启用所有 dovecot 调试标志)是:

%# cat /tmp/testmail | /usr/lib/dovecot/deliver -d username
Error 75
%# tail -n2 /var/log/dovecot.log
Error: userdb lookup: connect(/var/run/dovecot/auth-userdb) failed: Permission denied (euid=0(root) egid=8(mail) UNIX perms appear ok (ACL/MAC wrong?))
Aug 24 22:05:14 lda: Fatal: Internal error occurred. Refer to server log for more information.

套接字上的文件权限已设置,因此任何人都可以对其进行读取/写入。错误消息甚至说权限看起来没有问题。

%# ls -l /var/run/dovecot/auth-userdb
srwxrwxrwx 1 root mtagroup 0 Aug 24 00:47 /var/run/dovecot/auth-userdb=

以 root 身份运行时对 deliver 运行 strace,显示在程序中止之前无法连接到套接字,但随后测试了 r/w 权限并且没有问题:

connect(7, {sa_family=AF_LOCAL, sun_path="/var/run/dovecot/auth-userdb"}, 110) = -1 EACCES (Permission denied)
close(7)                                = 0
...
stat("/var/run/dovecot", {st_mode=S_IFDIR|0755, st_size=740, ...}) = 0
getuid()                                = 0
geteuid()                               = 0
access("/var/run/dovecot", X_OK)        = 0
getuid()                                = 0
geteuid()                               = 0
access("/var/run/dovecot/auth-userdb", R_OK) = 0
getuid()                                = 0
geteuid()                               = 0
access("/var/run/dovecot/auth-userdb", W_OK) = 0
geteuid()                               = 0
getegid()                               = 0
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 7
fstat(7, {st_mode=S_IFREG|0644, st_size=3585, ...}) = 0
fstat(7, {st_mode=S_IFREG|0644, st_size=3585, ...}) = 0
read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 3585
lseek(7, -2281, SEEK_CUR)               = 1304
read(7, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\0\7\0\0\0\0"..., 4096) = 2281
close(7)                                = 0
write(6, "Aug 24 00:01:05 lda(cwolf): Erro"..., 180) = 180
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3585, ...}) = 0
write(6, "Aug 24 00:01:05 lda: Fatal: Inte"..., 95) = 95
exit_group(75)                          = ?
+++ exited with 75 +++

系统日志中没有任何有用的消息,并且所有 apparmor 配置文件都处于仅投诉模式。我使用一个小型 perl 程序以 root 身份连接到套接字。

Netstat 显示套接字处于活动状态:

%# netstat -nvlap | fgrep auth-userdb
unix  2      [ ACC ]     STREAM     LISTENING     1874526  12031/auth [0 wait, /var/run/dovecot/auth-userdb

由于套接字/文件权限似乎没有问题,并且套接字处于活动状态,我不知道如何进一步调试。有人知道如何修复这个问题吗?

答案1

Dovecot 会尝试在用户允许的情况下将每封电子邮件发送到其文件系统邮箱中。

这样,用户无需通过 IMAP 或 POP 或通过网络邮件客户端即可阅读电子邮件。

因此,系统上传递的权限错误是 dovecot 尝试将自身更改为用户权限,以便在他们的文件夹中传递电子邮件。

为此,dovecot-deliver 程序会尝试从 auth-userdb 读取适当的权限。如果设置不正确,则会失败并显示上述消息。

PS:我确实认为以 root 用户身份运行所有操作是正确的方法。

相关内容