Вопрос или проблема
Я обновил свой сервер с Debian Buster -> Bullseye -> Bookworm, и теперь exim4 и dovecot не доставляют письма в мои почтовые ящики.
Похоже, это связано со следующей строкой в /var/log/exim4/mainlog :
R=dovecot T=dovecot_virtual_delivery: Запятнанный аргумент 2 для команды транспортировки dovecot_virtual_delivery
В чем проблема?
Цитируя Кирилла Миазина в почтовом списке Dovecot :
Только что выпущенная RC0 для Exim 4.96 сломает доставку Dovecot LDA, как описано на https://wiki.dovecot.org/LDA/Exim [Примечание: устаревшая ссылка]
Вот соответствующая запись в ChangeLog:
JH/25 Проверка аргументов exec на наличие запятнанных значений для внешних процессов, инициированных транспортом. Ранее могли использоваться запятнанные значения. Это затрагивает команды “pipe”, “lmtp” и “queryprogram”, фильтры транспортов и ETRN. Также затрагивается расширение ${run}: в режиме “preexpand” ни одна часть командной строки не может быть запятнанной, в стандартном режиме имя исполняемого файла не может быть запятнанным.
На данный момент Debian Bookworm использует Exim 4.96. В следующем письме Кирилл Миазин предлагает, как временное решение, “создать простой обертку и вызывать ее вместо dovecot-lda
” :
$ cat /local/bin/dovecot-lda-wrapper
#!/bin/sh
exec /usr/local/libexec/dovecot/dovecot-lda \
-d "${LOCAL_PART}@${DOMAIN}" \
-a "${LOCAL_PART}${LOCAL_PART_SUFFIX}@${DOMAIN}" \
-r "${LOCAL_PART}${LOCAL_PART_SUFFIX}@${DOMAIN}" \
-f "${SENDER}"
Затем в файле транспортировки dovecot (в зависимости от вашей конфигурации, например, /etc/exim4/conf.d/transport/20_dovecot
) :
dovecot_pipe:
driver = pipe
## ДО
# command = /usr/local/libexec/dovecot/dovecot-lda \
# -d $local_part@$domain \
# -a $local_part$local_part_suffix@$domain \
# -r $local_part$local_part_suffix@$domain \
# -r $local_part$local_part_suffix@$domain \
# -f $return_path
## ПОСЛЕ
command = /local/bin/dovecot-lda-wrapper
[…]
(Конечно, адаптируйте пути к файлам и реальные настройки к вашей системе, в зависимости от сообщения в журнале в случае автора, это должно быть dovecot_virtual_delivery
, а не dovecot_pipe
.)
Насколько я понимаю, трюк состоит в том, что это обходит строгие проверки безопасности Exim на аргументы, потому что он видит только вызов скрипта, позволяя скрипту обрабатывать внутренние детали. Тем не менее, обертка скрипта инкапсулирует аргументы в переменные оболочки, гарантируя, что они очищены и обрабатываются как литеральные строки, поэтому это должно быть безопасно.
.
Ответ или решение
Проблема, с которой вы столкнулись после обновления вашего сервера с Debian Buster до Bookworm, связана с изменениями в Exim 4.96, которые затрагивают доставку почты через Dovecot. Давайте разберем это подробнее и предложим решение вашей ситуации.
Объяснение проблемы
В вашем журнале /var/log/exim4/mainlog
содержится сообщение:
R=dovecot T=dovecot_virtual_delivery: Tainted arg 2 for dovecot_virtual_delivery transport command
Это сообщение указывает на то, что переданные аргументы в команду доставки Dovecot помечены как "загрязненные" (tainted). В Exim 4.96 была внедрена проверка на безопасность аргументов для внешних процессов, что приводит к блокировке передачи таких аргументов, которые могут использоваться для потенциальных уязвимостей безопасности. По сути, некоторые переменные, используемые для передачи параметров в Dovecot, не проходят проверку и вызывают ошибку.
Причины возникновения
Упомянутый вами канонический ответ от Кирилла Мязина на Dovecot mailing list четко указывает на изменения в Exim 4.96, касающиеся выполнения внешних процессов через транспорт. Эти изменения направлены на повышение безопасности, однако в итоге могут привести к непредвиденным проблемам, таким как ваша.
Решение проблемы
Так как информация выводится о том, что Dovecot LDA (Local Delivery Agent) стоит перед чисткой аргументов, есть несколько способов обойти эту ситуацию. Самое лучшее решение, рекомендованное в вашем случае, – это создание обертки:
- Создайте скрипт-обертку для Dovecot LDA в
/local/bin/dovecot-lda-wrapper
:
#!/bin/sh
exec /usr/local/libexec/dovecot/dovecot-lda \
-d "${LOCAL_PART}@${DOMAIN}" \
-a "${LOCAL_PART}${LOCAL_PART_SUFFIX}@${DOMAIN}" \
-r "${LOCAL_PART}${LOCAL_PART_SUFFIX}@${DOMAIN}" \
-f "${SENDER}"
Убедитесь, что у вас есть права на выполнение этого скрипта, выполнив следующую команду:
chmod +x /local/bin/dovecot-lda-wrapper
- Измените конфигурацию транспортного файла Dovecot в Exim на использование вашей обертки:
Отредактируйте файл, например, /etc/exim4/conf.d/transport/20_dovecot
, чтобы добавить вашу обертку:
dovecot_virtual_delivery:
driver = pipe
command = /local/bin/dovecot-lda-wrapper
...
Здесь явно укажите ${LOCAL_PART}
, ${DOMAIN}
, ${SENDER}
и другие переменные, соответствующие вашей конфигурации.
Вывод
Используя обертку, вы сможете обойти строгие проверки Exim, поскольку теперь он будет запускать ваш скрипт, который сам будет обрабатывать аргументы. Это обеспечит более безопасную среду для работы и позволит избежать ошибок, связанных с «загрязненными» переменными.
Не забудьте протестировать изменения и убедиться, что система доставки почты функционирует стабильно после внесения всех корректив. Если у вас возникнут дополнительные вопросы о конфигурации, лучше обратиться к документации или запросить помощь на специализированных форумах.