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

dovecot / usr / lib / dovecot / delivery не работает только для root

После обновления Ubuntu с 14.04 до 16.04 я больше не могу использовать программу доставки dovecot в procmail для системной доставки от имени пользователя root, потому что она утверждает, что не может открыть файл auth-userdb, хотя обычные пользователи могут это сделать, а сервер imap в остальном работает нормально.

Я очистил и переустановил голубятню безрезультатно. Права доступа к файлам кажутся нормальными, но вызов dovcot delivery как корень не выполняется, и единственная ошибка, которая регистрируется (со всеми включенными флагами отладки 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=

Запуск strace при доставке при запуске от имени пользователя root показывает, что не удалось подключиться к сокету непосредственно перед прерыванием программы, но затем проверяются разрешения 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 +++

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

Netstat показывает, что сокет активен:

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

Поскольку права доступа к сокету / файлу кажутся прекрасными, а сокет активен, я не знаю, как отладить это глубже. У кого-нибудь есть идеи, как это исправить?

Dovecot пытается доставлять каждое электронное письмо с разрешения пользователя в его почтовый ящик файловой системы.

Так что пользователь может читать свою электронную почту, не будучи root через IMAP или POP или через клиент веб-почты.

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

Для этого программа dovecot-delivery пытается прочитать из auth-userdb соответствующие разрешения. Если это не настроено правильно, это не сработает с сообщением выше.

PS: Я действительно думаю, что запуск всего от имени пользователя root - правильный способ сделать это.