27 Сентябрь 2016

Использование анализа MIME средствами Exim 4.88

Using MIME analysys in Exim 4.88

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 не забывая, однако, про раскрытые в этой статье недокументированные функции.


exim