Вопрос или проблема
Я впервые настроил sieve на машине с Debian, работающей под управлением postfix/dovecot/lmtp. Это работает, однако я хочу прояснить ошибку, которую я получал:
lmtp(joeblow)<17980><GG5KL91cf188RgAAajKqBA>: Ошибка: sieve: сохранение двоичного файла: не удалось создать временный файл: open(/var/lib/dovecot/sieve/default.svbin.) не удалось: Доступ запрещен (euid=1008(joeblow) egid=1009(joeblow) отсутствует +w разрешение: /var/lib/dovecot/sieve, папка принадлежит 0:0 режим=0755)
lmtp(joeblow)<17980><GG5KL91cf188RgAAajKqBA>: Ошибка: sieve: Плагин LDA Sieve не имеет разрешения на сохранение глобальных двоичных файлов сценартов Sieve; глобальные сценарты Sieve, такие как '/var/lib/dovecot/sieve/default.sieve', нужно предварительно компилировать с помощью инструмента sievec
Насколько я могу судить, это происходит, когда приходит электронное письмо. Я не совсем уверен, нужен ли мне lda, если у меня есть lmtp, но я на самом деле не знаю, что делаю, поэтому не знаю, что делать вообще. Мне потребовалось некоторое время, чтобы разобраться с этой конфигурацией, и я сделал это несколько дней назад.
Мой файл 90-sieve.conf:
plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_default = /var/lib/dovecot/sieve/default.sieve
sieve_default_name = Defaults
sieve_global = /var/lib/dovecot/sieve
sieve_user_log = ~/.dovecot.sieve.log
}
# 2.3.4.1 (f79e8e7e4): /etc/dovecot/dovecot.conf
# Версия Pigeonhole 0.5.4 ()
# ОС: Linux 4.19.0-11-cloud-amd64 x86_64 Debian 10.6
auth_debug = yes
auth_debug_passwords = yes
auth_mechanisms = plain login
auth_username_format = %Ln
auth_verbose = yes
mail_debug = yes
mail_location = maildir:~/Maildir
mail_privileged_group = mail
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext
namespace inbox {
inbox = yes
location =
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
auto = subscribe
special_use = \Junk
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
special_use = \Trash
}
prefix =
}
passdb {
driver = pam
}
plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_default = /var/lib/dovecot/sieve/default.sieve
sieve_default_name = Defaults
sieve_global = /var/lib/dovecot/sieve
sieve_user_log = ~/.dovecot.sieve.log
}
protocols = " imap lmtp sieve pop3 sieve"
service auth {
unix_listener /var/spool/postfix/private/auth {
group = postfix
mode = 0666
user = postfix
}
unix_listener auth-userdb {
mode = 0666
}
}
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
service_count = 1
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
group = postfix
mode = 0600
user = postfix
}
}
service managesieve-login {
inet_listener sieve {
port = 4190
}
process_min_avail = 1
}
service pop3-login {
inet_listener pop3s {
port = 995
ssl = yes
}
}
service pop3 {
process_limit = 1024
}
service submission {
process_limit = 1024
}
ssl_cert = </opt/bitnami/letsencrypt/certificates/email.example.org.crt
ssl_client_ca_dir = /etc/ssl/certs
ssl_dh = # скрыто, используйте -P, чтобы показать его
ssl_key = # скрыто, используйте -P, чтобы показать его
userdb {
driver = passwd
}
protocol lmtp {
mail_plugins = " sieve"
}
protocol lda {
mail_plugins = " sieve"
Давайте разберем это сообщение об ошибке
lmtp(joeblow)<17980>:
Это сервис LMTP, который обращается к вам
ошибка: sieve: Плагин LDA Sieve не имеет разрешения на сохранение глобальных двоичных файлов сценартов Sieve;
Вы применяете некоторую фильтрацию sieve глобально, и сервис LMTP (более конкретно, часть доставки, отсюда и термин LDA
) настроен на вызов фильтрации sieve, которая в свою очередь в данный момент не может записать двоичные кеши глобальных сценартов.
глобальные сценарты Sieve, такие как ‘/var/lib/dovecot/sieve/default.sieve’, нужно предварительно компилировать с помощью инструмента sievec
Это именно то, что вы можете сделать, чтобы решить эту проблему – скомпилировать ваш файл:
sievec /var/lib/dovecot/sieve/default.sieve
Это создаст двоичный кеш этого файла в /var/lib/dovecot/sieve/default.svbin
, который может использоваться плагином sieve.
Dovecot мог бы сделать это автоматически, но ваши права доступа к файлам этому препятствуют (что вполне справедливо в вашей конфигурации, поскольку аутентификация через PAM означает, что пользователи входят в систему от своего имени, как указано в подсказке euid=
выше). Поэтому вам просто нужно вызвать sievec
вручную.
Спасибо, это решило мою проблему.
Я получал ошибки “Только для чтения файловая система” от dovecot lmtp, которые на самом деле означали “ваш глобальный сценарий sieve не был скомпилирован” – даже несмотря на то, что процесс dovecot имел права на запись в файловую систему…
Ответ или решение
Ошибка "Permission Denied" при использовании Sieve в Dovecot: Подробный Анализ и Решение
При настройке системы фильтрации писем с использованием Sieve на платформе Debian с Postfix и Dovecot может возникнуть ошибка, связанная с правами доступа. Это может вызвать неудобства, особенно если вы только начали работать с этой технологией. В этой статье мы подробно рассмотрим проблему, связанную с ошибкой "Permission Denied", и предложим шаги для ее устранения.
Контекст Проблемы
Согласно предоставленному описанию, проблема возникает при попытке Dovecot сохранить бинарный кэш глобального Sieve-скрипта во время обработки входящего письма. В частности, вы видите ошибку:
Error: sieve: binary save: failed to create temporary file: open(/var/lib/dovecot/sieve/default.svbin) failed: Permission denied
Это указывает на то, что процесс, от имени которого выполняется Dovecot, не имеет необходимых прав для записи в директорию /var/lib/dovecot/sieve
.
Анализ Ошибки
Согласно сообщению об ошибке:
-
Проблема с правами доступа: Dovecot пытается создать файл
default.svbin
, но из-за недостатка прав для пользователя (в вашем случаеjoeblow
, который имеет euid=1008 и egid=1009) возникает ошибка. -
Отсутствие предкомпиляции: Сообщение ясно указывает, что глобальные скрипты Sieve, такие как
/var/lib/dovecot/sieve/default.sieve
, должны быть предварительно скомпилированы с помощью утилитыsievec
. Это означает, что вам необходимо выполнить эту команду вручную, поскольку Dovecot не может сделать это автоматически из-за ограничений прав.
Решение Проблемы
Для устранения ошибки выполните следующие шаги:
-
Предварительная компиляция Sieve-скрипта:
Откройте терминал и выполните следующую команду:sievec /var/lib/dovecot/sieve/default.sieve
Эта команда скомпилирует скрипт и создаст бинарный файл
default.svbin
в директории/var/lib/dovecot/sieve
, что позволит Dovecot использовать его при фильтрации. -
Проверка прав доступа:
Убедитесь, что каталог/var/lib/dovecot/sieve
имеет правильные права доступа. Ваша текущая конфигурация показывает, что каталог принадлежит пользователюroot
и группеroot
с правами0755
. Также вы можете изменить владельца каталога на пользователя Dovecot (или к группеmail
), например:sudo chown -R dovecot:mail /var/lib/dovecot/sieve
Либо вы можете предоставить необходимые права группам, добавив
+w
для группы:sudo chmod g+w /var/lib/dovecot/sieve
Завершение Настройки
После выполнения указанных шагов перезапустите Dovecot, чтобы убедиться, что изменения вступили в силу:
sudo systemctl restart dovecot
Теперь вы должны быть в состоянии использовать Sieve без возникновения ошибок, связанных с правами доступа.
Заключение
Решение проблемы с "Permission Denied" при использовании Sieve в Dovecot включает в себя предварительную компиляцию скриптов и правильную настройку прав доступа. Четкое понимание конфигурации и порядка выполнения действий поможет вам избежать подобных проблем в будущем и обеспечит бесперебойную работу почтового сервера. Научившись управлять этими аспектами, вы значительно улучшите стабильность и функциональность ваших почтовых решений.