Title: Использование анализа MIME средствами Exim 4.88 Content: SMTP-сервер Exim снискал большую популярность благодаря гибкости и поддержке современных технологий. Он занимает в настоящее время доминирующее положение в области средств доставки электронной почты в сети Интернет.
Несмотря на то, что последним опубликованным релизом на момент публикации этой статьи является версия 4.87, анализ грядущих в ближайшем будущемизменений и, возможно, необходимая последующая адаптация конфигурации Exim к этим переменам, несомненно, будет не только не лишней, но и полезной.
Просматривая changelog грядущего релиза 4.88 я обратил внимание на следующий абзац в списке изменений.
JH/02 The obsolete acl condition "demime" is removed (finally, after ten years of being deprecated). The replacements are the ACLs acl_smtp_mime and acl_not_smtp_mime.
Действительно, "старый добрый" механизм контентного сканирования вложений demime в Exim давно уже значится в стадии deprecated что автоматически делает его не рекомендуемым к использованию в текущих конфигурациях. На его место уже давно рекомендуется новый механизм ещё более незатейливо именуемый mime, который даёт существенно более широкие возможности по анализу вложений в сообщениях электронной почты.
Поскольку исторически у меня (да и, я уверен, в подавляющем большинстве конфигураций Exim) используется старый механизм, разумно будет заранее подготовиться к выходу новой версии переработав настройки в современном ключе.
В ходе анализа исходных текстов Exim в файле mime.c обнаружилось наличие пары недокументированых (!) переменных ответственных за оценку корректности сформированных в письме вложений в формате MIME существующему стандарту, которые по своему смыслу соответствуют старым переменным в demime: $mime_anomaly_level (аналог $demime_errorlevel) и $mime_anomaly_text (аналог $demime_reason). При этом, обратите внимание,что $mime_anomaly_level имеет три уровня оценки — от 0 до 2 в отличие от старого $demime_errorlevel, который имел от 1 до 3.
Правила Exim у меня используются для синтаксического разбора почты на предмет соблюдения отправителем стандартов на электронную почту и бальной оценке письма на принадлежность к спаму, поэтому переработанная конфигурация с применением mime приобрела следующий вид.
root@beta:~ # cat /usr/local/etc/exim/configure
# $Cambridge: exim/exim-src/src/configure.default,v 1.14 2009/10/16 07:46:13 tom Exp $
# --- by Max Kostikov (c) 2010...2016 v.20160830
...
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_dkim = acl_check_dkim
acl_smtp_mime = acl_check_mime
acl_smtp_data = acl_check_data
...
begin acl
acl_check_rcpt:
...
acl_check_dkim:
...
# -- by xM 2016-06-14
acl_check_mime:
accept hosts = :
# --- accept messages for abuse / postmaster
accept condition = $acl_m_pm
deny decode = default
condition = ${if >{$mime_anomaly_level}{1}}
message = This message contains a MIME error ($mime_anomaly_text)
# --- Check MIME boundary delimiter according RFC2046
deny condition = ${if match{$mime_boundary}{\N( |\t)$\N}}
message = MIME boundary delimiter ends with whitespace
deny condition = ${if >{${strlen:$mime_boundary}}{70}}
message = Too long MIME boundary delimiter
accept authenticated = *
warn !hosts = +relay_from_hosts
condition = ${if >{$mime_anomaly_level}{0}}
set acl_c0 = ${eval:$acl_c0+20}
set acl_c1 = DEMIME(20) found MIME error ($mime_anomaly_text); $acl_c1
accept
acl_check_data:
...
Как видно, первым правилом производится распаковка вложений MIME и проверка их на наличие ошибок внутренним анализатором Exim с использованием вышеупомянутых переменных. Далее дополнительно проверяется соответствие вложений на соответствие стандарту RFC2046. И, наконец, за некритичные ошибки дополнительно начисляются баллы к внутреннему счётчику оценки письма.
Если существует потребность фильтрации почты по вложениям, то можно воспользоваться, к примеру, такой конструкцией с перечнем запрещённых к пересылке расширений.
...
deny condition = ${if match{${lc:$mime_filename}}{\N(\.com|\.vbs|\.bat|\.pif|\.scr|\.exe|\.js)$\N}}
message = Forbidden file type in attachment found
...
За прочими подробностями для более утончённых манипуляций со вложениями прошу обращаться в официальную документацию Exim не забывая, однако, про раскрытые в этой статье недокументированные функции.