dovecot 和 OS X 10.10.3++ 的 dotlock 权限问题

dovecot 和 OS X 10.10.3++ 的 dotlock 权限问题

我已经通过 安装了dovecot。但出于某种原因,自从 Apple 更新系统以来,我无法让它完全正常工作。当 dovecot 想要访问 INBOX 时,创建 dotlock 文件时会出现某种无法解决的权限问题。有趣的是,postfix 在OS X Yosemite同一个目录中创建 dotlock 文件没有任何问题。Homebrew10.10.3

$ dovecot --version
2.2.18

OS X 中的默认路径设置,也由 dovecot wiki 正式支持/记录。我希望保持原样,因为系统更新通常会将此处的权限改回来:

$ ls -lae /var/
...
drwxrwxr-x    3 root       mail        102 Aug 14 18:52 mail
...

$ ls -lae /var/mail
...
-rw-------  1 haru mail  542 Aug 14 18:53 haru
...

这是我最初的设置,直到OS X 10.10.2。我从输出中删除了一堆不相关的选项:

$ cat /usr/local/etc/dovecot/local.conf
protocols = pop3
listen = localhost
# Note: user _dovecot is member of the 'mail' group.
default_internal_user = _dovecot
default_login_user = _dovenull
mail_location = mbox:~/.mail:INBOX=/var/mail/%u
mail_privileged_group = mail

一切都运行正常,直到OS X 10.10.3更新后,提取邮件时突然dovecot[PID]: pop3(haru): Error: setegid(privileged) failed: Operation not permitted出现错误。它仍然可以提取邮件,但无法从收件箱中删除它们,因此每次提取时,相同的邮件都会一次又一次地出现。

经过大量研究和随机尝试后,我最终将其添加mail_access_groups = mail到了 dovecot 配置中。但我不太明白这个选项到底有什么用。

$ cat /usr/local/etc/dovecot/local.conf 
protocols = pop3
listen = localhost
# Note: user _dovecot is member of the 'mail' group.
default_internal_user = _dovecot
default_login_user = _dovenull
mail_location = mbox:~/.mail:INBOX=/var/mail/%u
mail_privileged_group = mail
mail_access_groups = mail

一切原本都运行良好,直到OS X 10.10.5昨天更新后突然一切都变得一团糟,系统完全崩溃dovecot[PID]: pop3(haru): Fatal: setgroups(mail,) failed: Too many extra groups。删除修复了这个错误,但又出现了之前描述的从 10.10.3 开始的错误行为。最后,我不得不通过从选项中删除默认条目来mail_access_groups = mail禁用点文件锁定:dotlockmbox_write_locks

$ cat /usr/local/etc/dovecot/local.conf 
protocols = pop3
listen = localhost
# Note: user _dovecot is member of the 'mail' group.
default_internal_user = _dovecot
default_login_user = _dovenull
mail_location = mbox:~/.mail:INBOX=/var/mail/%u
mail_privileged_group = mail
mbox_read_locks = fcntl
mbox_write_locks = fcntl

我是不是漏掉了什么或者没理解对吗?为什么默认权限设置(如 dovecot 文档中所述)不起作用?也许是与 OS X 10.10.3 开始出现某种不兼容性,或者是 dovecot 中存在一些错误?

答案1

失败的setgroups()原因是运行 Dovecot 的机器上的用户分配了超过 16 个组。

以 root 身份(或以该用户身份)运行id -G <user>id <user>以查看组数。

不幸的是,macOS 为用户分配了大量的组,以对屏幕共享等内容进行细粒度的访问控制。幸运的是,Dovecot 有一个选项可以设置“有效”组 ID 的范围。因此,您可以设置

last_valid_gid = 100

您的号码可能有所不同。

我刚刚遇到这个问题并在这里写了出来:http://pilhuhn.blogspot.com/2018/10/solution-for-dovecot-and-setgroups.html

相关内容