|
www.lissyara.su
—> документация
—> EXIM
—> 4.62
—> часть 40
40. Контентное сканирование во время ACL
Расширение exim`a для включения контентного сканирования во время ACL, раньше известное как “exiscan ”, изначально было осуществлено как патч, Tom`ом Kistner`ом. Код был интегрирован в главный исходный код для 4.50 релиза exim`a, и Том продолжает его поддерживать. Большинство этой части взято из спецификации Тома.
Также возможно просматривать содержимое сообщений в другой момент времени. Функция “local_scan() ” (смотрите раздел 41) позволяет контентное сканирование после выполнения всех ACL. Транспортный фильтр может использоваться для сканирования сообщений во время доставки (смотрите опцию “transport_filter ”, описанную в части 24).
Если вы хотите включить контентное сканирование во время ACL, при сборке exim`a, вам необходимо принять меры для задания WITH_CONTENT_SCAN в вашем “Local/Makefile ”. Когда вы это сделаете, бинарник exim`a cобирается с:
Двумя дополнительными ACL ( “acl_smtp_mime ” и “acl_not_smtp_mime ”), которые работают для всех частей MIME для SMTP и не-SMTP сообщений, соответственно.
Дополнительные условия и модификаторы ACL: “decode ”, “malware ”, “mime_regex ”, “regex ” и “spam ”. Они могут использоваться в ACL, которзая апускается в конце приёма сообщения (ACL “acl_smtp_data ”).
Дополнительные функции управления ( “no_mbox_unspool ”), которые сохраняют копии помещённых в очередь сообщений, или частей сообщений, в целях отладки.
Дополнительные переменные раскрытия, которые устанавливаются в в новых ACL с новыми условиями.
Две новые опции главной конфигурации: “av_scanner ” и “spamd_address ”.
Есть другая опция контентного сканирования для “Local/Makefile ”, называемая WITH_OLD_DEMIME. Если она установлена, компилируется старое, не одобряемое условие ACL “demime ”, в дополнение ко всем другим возможностям контентного сканирования.
Контентное сканирование непрерывно развивается, и продолжают добавляться новые возможности. В то время, когда такие возможности остаются нестабильными, и склонны к несовместимым изменениям, они делаются доступными в exim`e путём установки опций в “Local/Makefile ”, чьи имена начинаются с EXPERIMENTAL_. Такие возможности не документированы в этом руководстве. Вы можете узнать о них путём прочтения файла с именем “doc/experimental.txt ”.
Все средства контентного сканирования работают с MBOX копией сообщения, временно создаваемой в названном файле:
<spool_directory>/scan/<message_id>/<message_id>.eml
| Расширение “.eml ” - дружелюбная подсказка вирусным сканерам, что они могут ожидать внутри файла структуру подобную MBOX. Файл создаётся при первом вызове средства контентного сканирования. Последующие вызовы условий контентного сканирования снова открывают тот же самый файл. Директория рекурсивно удаляется когда ACL “acl_smtp_data ” завершает работу, если не установлена опция:
control = no_mbox_unspool
| Когда ACL MIME декодирует файлы, они, по умолчанию, кладутся в тот же самый каталог.
40.1 Сканирование на вирусы
Условие ACL “malware ” позволяет вам подключить программу вирусного сканера к exim`y. Оно поддерживает “общий ” ( “generic ”) интерфейс к сканерам, вызываемым через шелл, и специализированные интерфейсы для вирусных сканеров типа “daemon ”, которые постоянно находятся в памяти и, поэтому, значительно быстрее.
Вы можете установить опцию “av_scanner ” в первой части конфигурационного файла exim, для задания используемого сканера, вместе с любыми необходимыми дополнительными опциями. Базовый синтаксис - следующий:
av_scanner = <scanner-type>:<option1>:<option2>:[...]
| Если вы не установите “av_scanner ”, по дефолту она будет:
av_scanner = sophie:/var/run/sophie
| Если значение “av_scanner ” начинается с символа доллара, оно раскрывается до использования. В этом релизе поддерживаются следующие типы сканеров:
“aveserver ” - Это даемон сканера Касперского, 5-й версии. Вы можете получить триальную версию по адресу http://www.kaspersky.com. Этот тип сканера обладает одной опцией, которая является путём к UNIX-сокету даемона. Значение по умолчанию показано в этом примере:
av_scanner = aveserver:/var/run/aveserver
|
“clamd ” - Этот сканер типа даемона, выпускается по лицензии GPL и явялется свободным софтом. Вы можете получить его по следующему адресу http://www.clamav.net. Некоторые старые версии clamd не просматривали запакованные контейнеры MIME, таким образом, для использовавших его было рекомендовано распаковывать вложения MIME в ACL MIME. Больше нет такой необходимости. Требуется одна опция: или путь с именем фалы UNIX-сокета, или имя хоста с IP-адресом, и портом, отделённым пробелом, как во втором из этих примеров:
av_scanner = clamd:/opt/clamd/socket
av_scanner = clamd:192.168.2.100 1234
|
“cmdline ” - Это ключевое слово - общий интерфейс командной строки сканера. Она может использоваться для для добавления вирусного сканера, который вызывается из шелла. Этот тип сканера принимает три обязательных опции:
1. Полное имя и путь к бинарному файлу сканера, со всеми опциями командной строки, и подстановку ( “%s ”) для директории которая сканируется.
2. Регулярное выражение для сравнеия с выводом STDOUT и STDERR вирусного сканера. Если выражение совпадает, найден вирус. Вы должны должны быть абсолютно уверены, что это выражение совпадает с “найден вирус ”. Его называют “триггерным ” ( “trigger ”) выражением.
3. Иное регулярное выражение, содержащее точную пару круглых скобок, для соответствия имени найденного вируса в выводе сканера. Его называют “именным ” ( “name ”) выражением.
Например, Sophos Sweep сообщает о вирусе в строке типа такой:
Virus 'W32/Magistr-B' found in file ./those.bat
| Для триггерного выражения, мы можем использовать лишь слово “found ”. Для именного выражения, мы хотим извлечь строку “W32/Magistr-B ”, таким образом, мы можем установить соответствие для одиночных кавычек - левой и правой. В целом, создаётся такая конфигурационная установка:
av_scanner = cmdline:\
/path/to/sweep -all -rec -archive %s:\
found:'(.+)'
|
“drweb ” - Интерфейс даемона сканера DrWeb (http://www.sald.com), получает один параметр, или полный путь к UNIX-сокету, или IP-адрес и порт, разделённые пробелом, как в этом примере:
av_scanner = drweb:/var/run/drwebd.sock
av_scanner = drweb:192.168.2.20 31337
| Если вы опускаете этот параметр, используется дефолтовый путь - “/usr/local/drweb/run/drwebd.sock ”. Спасибо Alex Miller, за внесение кода для этого сканера.
“fsecure ” - Интерфейс даемона сканера F-Secure (http://www.f-secure.com) принимает один аргумент, который является путём к UNIX-сокету. Например:
av_scanner = fsecure:/path/to/.fsav
| Если аргументов не задано, то значение по умолчанию - “/var/run/.fsav ”. Спасибо Johan Thelmen, за внесение кода для этого сканера.
“kavdaemon ” - Это - сканирующий даемон Касперского 4-й версии. Эта версия сканера Касперского является устаревшей. Пожалуйста, обновитесь (смотрите выше, опцию “aveserver ”). Этот тип санера принимает одну опцию, которая является путём к UNIX-сокету даемона. Например:
av_scanner = kavdaemon:/opt/AVP/AvpCtl
| Дефолтовый путь - “/var/run/AvpCtl ”.
“mksd ” - Этот сканер нацелен главным образом на польских юзеров, хотя, сейчас, некоторые части документации доступны на английском. Вы можете получить ее на http://linux.mks.com.pl. Единственная опция этого сканера - максимальное число одновременно используемых процессов для сканирования вложений, при условии что используется средство demime, и при условии, что mksd был запущен с тем же самым числом дочерних процессов. Например:
“sophie ” - Sophie - даемон использующий библиотеку Sophos’ libsavi для сканирования на вирусы. Вы можете получить его по адресу http://www.vanja.com/tools/sophie. Для этого типа сканера есть лишь одна опция - путь к UNIX-сокету, который Sophie используется для связи с клиентом. Например:
av_scanner = sophie:/tmp/sophie
| Дефолтовый путь - “/var/run/sophie ”, такчто если вы используете его, то можете опустить эту опцию.
Когда “av_scanner ” коректно установлена, вы можете использовать условие “malware ” в DATA ACL. Отметтьте: Вы не можете использовать условие “malware ” в MIME ACL.
Опция “av_scanner ” раскрывается при каждом вызове “malware ”. Это позволяет использовать различные сканеры. Смотрите ниже примеры использования. Условие “malware ” кэширует свои результаты, таким образом, вы можете использовать его неоднократно для одного и того же сообщения, фактически, процесс сканирования выполняется лишь один раз. Однако, использование раскрываемых элементов в “av_scanner ” отключает кэширование, и каждое использование условия “malware ” вызывает новое сканирование сообщения.
УСловие “malware ” берёт правый параметр, который раскрывается до использования. Он может быть одним из:
“true ”, “* ”, или “1 ”, в случае чего сообщение сканируется на вирусы. Условие успешно, если найден вирус, или неудачно в ином случае. Это - рекомендуемое применение.
“false ” или “0 ”, в случае чего сканирования не происходит и условие немедленно неудачно.
Регулярное выражение, в случае чего сообщение сканируется на вирусы. Условие успешно если найден вирус, и его имя совпадает с регулярным выражением. Это позволяет вам предпринимать специальные действия для определённых типов вирусов.
Вы можете добавить “/defer_ok ” к условию “malware ” чтобы принимать сообщения даже если какие-то проблемы с вирусным сканером.
Когда вирус найден, условие устанавливает переменную раскрытия с именем “$malware_name ”, которая содержит имя вируса. Вы можете использовать её в модификаторе “message ”, который определяет ошибку, возвращаемую отправителю, и/или логгируемые данные.
Если ваш вирусный сканер не может самостоятельно распаковать MIME и TNEF контейнеры, вы должны использовать условие “demime ” (смотрите секцию 40.6) до условия “malware ”.
Вот - очень простой пример сканирования:
deny message = This message contains malware ($malware_name)
demime = *
malware = *
| Следующий пример принимает сообщения когда у сканера проблемы:
deny message = This message contains malware ($malware_name)
demime = *
malware = */defer_ok
| Следующий пример показывает как использовать переменную ACL для сканирования обоими - sophie и aveserver. Он предполагает, что вы установили:
в главной конфигурации exim`a
deny message = This message contains malware ($malware_name)
set acl_m0 = sophie
malware = *
deny message = This message contains malware ($malware_name)
set acl_m0 = aveserver
malware = *
|
40.2 Сканирование с SpamAssassin
Условие ACL “spam ” вызывает даемона “spamd ” SpamAssassin’а для получения очков за спам и отчёта для сообщения. Вы можете получить SpamAssassin по адресу http://www.spamassassin.org, или, если у вас есть рабочая инсталляция Perl, вы можете использовать CPAN, путём запуска:
perl -MCPAN -e 'install Mail::SpamAssassin'
| SpamAssassin обладает собственным набором конфигурационных файлов. Пожалуйста, посмотрите его документацию, чтобы узнать, как вы можете его настроить. Однако, и дефолтовая инсталляция работает хорошо.
Установив и настроив SpamAssassin, запустите даемон “spamd ”. По умолчанию, он слушает 127.0.0.1, TCP порт 783. Если вы используете иной хост или порт для “spamd ”, вы должны установить лпцию “spamd_address ” в глобальной части конфигурации exim`a, следующим образом (например):
spamd_address = 192.168.99.45 387
| Вам нет нужды устанавливать эту опцию, если вы используете значение по умолчанию. Для версии 2.60, “spamd ” также поддерживает коммуникацию через UNIX-сокеты. Если вы хотите их использовать, установите “spamd_address ” в абсолютный путь до сокета, вместо пары адрес/порт:
spamd_address = /var/run/spamd_socket
| У вас может быть несколько серверов “spamd ”, для улучшения масштабируемости. Они могут находиться на других железках, доступных по сети. Для задания нескольких серверов “spamd ”, установите в опцию “spamd_address ” несколько пар адрес/порт, разделённых двоеточиями:
spamd_address = 192.168.2.10 783 : \
192.168.2.11 783 : \
192.168.2.12 783
| Поддерживается вплоть до 32 серверов “spamd ”. Сервера запрашиваются случайным образом. Когда сервер не в состоянии ответить на попытку подключения, пробуются все другие сервера, пока какой-либо не будет успешным. Если ни один сервер не ответил, условие “spamd ” задерживается.
Предупреждение: Невозможно использовать соединение через UNIX-сокет с несколькими серверами “spamd ”.
40.3 Вызов SpamAssassin из ACL exim`a
Вот - простой пример использования условия “spam ” в DATA ACL:
deny message = This message was classified as SPAM
spam = joe
| Правая сторона условия “spam ” определяет имя пользователя, для которого SpamAssassin сканирует. Если вы не хотите использовать сканирование конкретного пользователя, на использовать профиль SpamAssassin как дефолтовый профиль системы, вы можете сканировать для неизвестного пользователя, или просто использовать “nobody ”. Однако, вы должны что-то поместить в правую строну.
Имя пользователя позволяет вам использовать антиспамовый профили на домен, или на пользователя. Правая сторона раскрывается до использования, таким образом, в неё вы можете поместить поиск или условие. Когда правая строна вычисляется в “0 ” или “false ”, сканирования не происходит, и условие немедленно неуспешно.
Сканирование с помощью SpamAssassin использует много ресурсов. Если вы сканируете каждое сообщение, большие сообщения могут вызывать существенное ухудшение производительности. Поскольку, большинство спама - маленькие сообщения, рекомендуется, чтобы вы не просматривали большие. Например:
deny message = This message was classified as SPAM
condition = ${if < {$message_size}{10K}}
spam = nobody
| Условие “spam ” возвращает истину, если происходит соответсвие или превышение заданному в пользовательском профиле SpamAssassin`a. Если вы хотите использовать условие “spam ” для его стронних эффектов (смотрите ниже, переменные), вы можете заставить его всегда возвращать “true ”, путём добавления к имени пользователя “:true ”.
Когда выполняется условие “spam ”, оно устанавливает множество пеерменных раскрытия. За исключением
“$spam_score_int ”, они доступны лишь внутри ACL; их значения не сохраняются с сообщением, и, таким образом, не могут быть использованы во время доставки.
“$spam_score ” - Счётчик очков за спам, например, “3.4 ” или “30.5 ”. Он полезен для включения в логи или сообщение о отклонении.
“$spam_score_int ” - Счётчик очков за спам, умноженный на 10, как значение целого числа. Например, “34 ” или “305 ”. Он полезен для цифровых сравнений в условиях. Это - специальная переменная; её значение сохраняется с сообщением, и пишется в файл спула exim`a. Это означает, что оно может быть использовано в течение всей жизни сообщения в вашей системе exim`a, в частности, роутерах или транспортах, в последующую фазу доставки.
“$spam_bar ” - Строка содержит несколько символов “+ ” или “- ”, изображая числовую часть значения счётчика спама. Счётчик спама 4.4 имел бы значение “$spam_bar ” равное “++++ ”. Это полезно для включения в предупреждающие заголовки, т.к. MUA могут сравнивать такие заголовки.
“$spam_report ” - Многострочная текстовая таблица, содержащая полный отчёт SpamAssassin для сообщения. Полезна для включения в заголовки, или сообщение о отклонении.
Условие “spam ” кэширует свои результаты. Если вы вызываете его для того же самого имени пользователя, он не сканирует заново, а снова возвращает те же самые значения.
Условие “spam ” возвращает DEFER, если при обработке сообщения SpamAssassin`ом происходит какая-то ошибка. Если вы хотите обработать DEFER как FAIL (для перехода к следующему блоку утверждений ACL), добавьте “/defer_ok ” к правой стороне условия “spam ”, например так:
deny message = This message was classified as SPAM
spam = joe/defer_ok
| Это вызывает приём сообщения, даже если существуют со “spamd ”.
Вот - более длинный, прокомментированный пример использования условия “spam ”:
# put headers in all messages (no matter if spam or not)
warn message = X-Spam-Score: $spam_score ($spam_bar)
spam = nobody:true
warn message = X-Spam-Report: $spam_report
spam = nobody:true
# add second subject line with *SPAM* marker when message
# is over threshold
warn message = Subject: *SPAM* $h_Subject:
spam = nobody
# reject spam at high scores (> 12)
deny message = This message scored $spam_score spam points.
spam = nobody:true
condition = ${if >{$spam_score_int}{120}{1}{0}}
|
40.4 Сканирование частей MIME
Глобальная опция “acl_smtp_mime ” определяет ACL которая вызывается для каждой MIME части SMTP сообщения, включая типы состоящие из нескольких частей (multipart), в последовательности их позиций в сообщении. Точно также, опция “acl_not_smtp_mime ” определяет ACL, которая используется для MIME частей не-SMTP сообщений. Эти опции могут обе относиться к одной и той же AACL если вы хотите одну и ту же обработку в обоих случаях.
Эти ACL вызываются (возможно, несколько раз) лишь до ACL “acl_smtp_data ”, в случае сообщения SMTP, или лишь до приёма не-SMTP сообщений. Однако, MIME ACL вызывается лишь если сообщение содержит строку заголовка “MIME-Version: ”. Когда вызов MIME ACL не приводит к “accept ”, обработка ACL прерывается, и клиенту посылается соответствующий код результата. В случае SMTP-сообщения, ACL “acl_smtp_data ” не вызывается когда это происходит.
Вы не можете использовать условия “malware ” или “spam ” в MIME ACL; они могут использоваться лишь в DATA или не-SMTP ACL. Однако, вы можете использовать условие “mime_regex ” для сравнения с декодированной MIME-частью (смотрите секцию 40.5).
В начале MIME ACL, множество переменных устанавливаются из информации заголовков для релевантной части MIME. Это описано ниже. По умолчанию, содержимое части MIME не декодируется в файл на диске, исключая части MIME чей тип содержимого - “message/rfc822 ”. Если вы хотите декодировать часть MIME в файл на диске, вы можете использовать модификатор “decode ”. Общий синтаксис таков:
decode = [/<path>/]<filename>
| Правая строна раскрывается до использования. После раскрытия значение может быть:
1. “0 ” или “false ”, в случае чего декодирования не происходит.
2. Строка “default ”. В этом случае, файл кладётся во временную “дефолтовую ” директорию “<spool_directory>/scan/<message_id>/ ” с последующим именем файла, состоящим из идентификатора сообщения и последующего номера. Полный путь и имя доступны в “$mime_decoded_filename ” после декодирования.
3. Полный путь с именем начинается со слэша. Если полное имя - существующая директория, она используется как замена для дефолтовой директории. Имя файла добавляется последовательно. Если путь не существует; он используется как полный путь и имя файла.
4. Если строка не начинается со слэша, она используется как имя файла, и используется дефолтовый путь.
Вы можете легко расшифровать с его оригинальным, предполагаемым именем, используя
Однако, вы должны иметь ввиду, что “$mime_filename ” может содержать что угодно. Если вы помещаете файлы вне пути дефолтового пути, они не удаляются автоматически.
Для вложений RFC822 (они - сообщения ложенные в сообщения, с типом содержимого “message/rfc822 ”), ACL вызывается снова, таким же самым образом как для первичного сообщения, лишь если установлена переменная раскрытия “$mime_is_rfc822 ” (смотрите ниже). Приложенные сообщения всегда декодируются на диск до проверки, и файлы удаляются после завершения проверки.
ACL MIME поддерживает условия “regex ” и “mime_regex ”. Они могут использоваться для сравнения регулярного выражения с сырыми и декодированными частями MIME, соответственно. Они описаны в секции 40.5.
Следующий список описывает все переменные раскрытия, которые доступны в ACL MIME:
“$mime_boundary ” - Если текущая часть - multipart (смотрите ниже, “$mime_is_multipart ”), она должна иметь граничную строку, которая сохраняется, если доступна. Если текущая часть не имеет граничного параметра в заголовке “Content-Type: ”, эта переменная содержит пустую строку.
“$mime_charset ” - Эта переменная содержит идентификатор набора символов (кодировки), если он найден в заголовке “Content-Type: ”. Примеры идентификаторов наборов символов:
us-ascii
gb2312 (Chinese)
iso-8859-1
| Пожалуйста, отметтьте, что это значение не нормальзовано, таким образом, вы должны его сравнивать регистронезависимо.
“$mime_content_description ” - Эта переменая содержит нормализованное содержимое заголовка “Content-Description: ”. Он может содержать удобочитаемое описание части содержимого. Некоторые реализации повторяют тут имя вложенного файла, но, обычно они лишь используются для целей отображения.
“$mime_content_disposition ” - Эта переменная содержит нормализованное содержимое заголовка “Content-Disposition: ”. Тут вы можете ожидать строку типа “attachment ” или “inline ”.
“$mime_content_id ” - Эта переменная содержит нормализованное содержимое заголовка “Content-ID: ”. Это уникальный идентификатор который может использоваться для ссылки на часть от другой части.
“$mime_content_size ” - Эта переменая устанавливается лишь после успешного выполнения модификатора “decode ” (смотрите выше). Она содержит размер декодированной части в килобайтах, таким образом, лишь полностью пустые части имеют нулевой “$mime_content_size ”.
“$mime_content_transfer_encoding ” - Эта переменная содержит нормализованное содержимое заголовка “Content-transfer-encoding: ”. Это - символическое имя для типа кодировки. Типичное значение - “base64 ” и “quoted-printable ”.
“$mime_content_type ” - Если у части MIME есть заголовок “Content-Type: ”, эта переменная содержит его значение, в нижнем регистре, и без любых опций (типа “name ” и “charset ”). Вот - некоторые примеры популярных типов MIME, как они могут появляться в этой переменной:
text/plain
text/html
application/octet-stream
image/jpeg
audio/midi
| Если часть MIME не имеет заголовка “Content-Type: ”, эта переменная содержит пустую строку.
“$mime_decoded_filename ” - Эта переменная устанавливается лишь после успешной работы модификатора “decode ” (смотрите выше). Его содержимое содержит полный путь и имя файла содержащего декодированные данные.
“$mime_filename ” - Это - возможно самая важная из переменных MIME. Она содержит предложенное имя файля вложения, если оно было найдено в одном из заголовков - “Content-Type: ” или “Content-Disposition: ”. Имя файла декодируется по RFC2047, но никаких дополнительных проверок на адекватность не производится. Если имя файла не найдено, эта переменная содержит пустую строку.
“$mime_is_coverletter ” - Эта переменная пытается различить “конверт письма ” ( “cover letter ”) от приложенных данных. Она может быть использована для пресечения кодированного содержимого в конверте письма, не ограничивая вложения вообще. (Вообще, тут несколько иная фраза, и советую обратиться к документации, ибо смысл написанного, да ещё и с ошибками, понял лишь прочтя главу, и то не до конца - прим. lissyara).
Переменная содержит 1 (истина) для частей MIME, являющихся частями письма, и 0 (ложь) для вложений. В настоящее время алгоритм такой:
1. Самая дальняя часть MIME - всегда обёртка письма.
2. Если обёртка письма multipart/alternative или multipart/related часть MIME, следовательно, все субчасти MIME внутри - multipart.
3. Если любая другая multipart-часть - обёртка письма, первая часть - обёртка, и последующие - вложегия.
4. Все части содержащиеся в пределах multipart - вложения.
Как пример, следующее правило запретит “HTML mail ” (включая, что посылается с альтернативным чистым текстом), позволяя HTML-файлам быть прикрепленными. HTML обёртка письма, приложенная к не-HTML обёртке почты, также разрешена:
deny message = HTML mail is not accepted here
!condition = $mime_is_rfc822
condition = $mime_is_coverletter
condition = ${if eq{$mime_content_type}{text/html}{1}{0}}
|
“$mime_is_multipart ” - Эта переменная имеет значение 1 (истина), когда текущая часть имеет главный тип “multipart ”, например, “multipart/alternative ” или “multipart/mixed ”. Так как multipart объекты лишь служат контейнером для других частей, вы не можете захотеть предпринять для них специфические действия.
“$mime_is_rfc822 ” - Эта переменная имеет значение 1 (истина), если текущая часть - не непосредственно часть проверяемого сообщения, но часть приаттаченного сообщения. Приложенные сообщения декодируются полностью рекурсивно.
“$mime_part_count ” - Эта переменная - счётчик, увеличивающийся для каждой обрабатываемой части MIME. Он начинается с нуля для самой первой части (которая, обычно, multipart). Счётчик - на сообщение, таким образом, он сбрасывается при обработке вложений RFC822 (смотрите “$mime_is_rfc822 ”). Счётчик остаётся установленным после завершения “acl_smtp_mime ”, таким образом, вы можете использовать его в DATA ACL для опредления числа частей MIME в сообщении. Для не-MIME сообщений, эта переменная содержит “-1 ”.
40.5 Сканирование с регулярными выражениями
Вы можете задать ваши собственные регулярные сообщения, совпадающие с полным телом сообщения, или индивидуальными частями MIME.
Условие “regex ” получает одно или более регулярное выражение как аргумент, и сравнивает его с полным сообщением (при вызове в DATA ACL), или сырой частью MIME (при вызове в MIME ACL). Условие “regex ” сравнивается построчно, с максимальной длинной строки в 32k символов. Это означает, что вы не можете получить многострочные сравнения с условием “regex ”.
Условие “mime_regex ” может быть вызывано лишь в ACL MIME. Оно сравнивается вплоть до 32k декодированного содержимого (всё содержимое сразу, не построчно). Если часть не была декодирована с модификатором “decode ” ранее в ACL, она автоматически декодируется при выполнении “mime_regex ” (используя дефолтовый путь и значение имени файла). Если декодированные данные более 32k, проверяются лишь первые 32k.
Регулярные выражения передаются как список разделённый двоеточиями. Для включения символа двоеточия, вы должны его удвоить. Так как правая строка раскрыватся до использования, вы, также, должны экранировать символ доллара и обратные слэши обратными слэшами, или используя средство “\N ”, для отключения раскрытия. Вот - простой пример, который содержит два регулярных выражения:
deny message = contains blacklisted regex ($regex_match_string)
regex = [Mm]ortgage : URGENT BUSINESS PROPOSAL
| Условие возвращает истину, если совпадает любое регулярное выражение. Тогда устанавливается переменная раскрытия “$regex_match_string ”, и содержит соответтсвующее регулярное выражение.
Предупреждение: С большими сообщениями, это условие может быть довольно ресурсоёмким.
40.6 Условие “demime ”
Условие ACL “demime ” предоставляет распаковку MIME, проверяя корректность и блокируемые расширения файлов. Оно может использоваться лишь в DATA и не-SMTP ACL. Условие “demime ” использует более простой интерфейс к декодированию MIME, чем функциональность MIME ACL, но не предоставляет никаких дополнительных средств. Пожалуйста, отметтьте, что это условие устарело, и осавлено лишь для обратной совместимости. Вы должны установить опцию WITH_OLD_DEMIME в “Local/Makefile ” во время сборки, для возможности использовать условие “demime ”.
Условие “demime ” распаковывает в сообщении контейнеры MIME. Оно детектирует ошибки в MIME контейнерах, и может сравнивать расширения файлов найденные в сообщении со списком. Использование этого средства приводит к файлам содержащим распакованные части MIME сообщения во временной директории сканирования. Если вы производите сканирование антивирусом, рекомендуется использовать условие demime до условия антивируса ( “malware ”).
В правой строне условия “demime ” вы можете поместить список, разделённый двоеточиями, расширений файлов, с которыми оно будет сравниваться. Например:
deny message = Found blacklisted file attachment
demime = vbs:com:bat:pif:prf:lnk
| Если найдено одно из расширений файлов, условие истинно, иначе - ложно. Если при демимизации происходит временная ошибка (например, “disk full ”), условие задержано, и сообщение временно отклоняется (если только в условии не стоит команда “warn ”).
Правая строна раскрывается до использования как списка, таким образом, вы можете использовать в ней поиск. Если раскрытие приводит к пустой строке, “false ”, или нулю ( “0 ”), демимизации не происходит и условие неудачно.
Условие “demime ” устанавливает следующие переменные:
“$demime_errorlevel ” - Когда в контейнере MIME детектируется ошибка, эта переменная содержит серьёзность ошибки, как целое число. Чем выше значение, тем более серьёзная ошибка (текущее максимальное значение - 3). Если эта переменная незадана, или нулевая, ошибок не было.
“$demime_reason ” - Когда “$demime_errorlevel ” более нуля, эта переменная содержит удобочитаемую текстовую строку описывающую всреченную ошибку MIME.
“$found_extension ” - Когда условие “demime ” истинно, эта переменная содержит найденное расширение файла.
Обе, “$demime_errorlevel ” и “$demime_reason ” устанавливаются при первом вызове условия “demime ”, и не изменяются при последующих вызовах.
Если вы не хотите проверять расширения файлов, а использовать условие “demime ” для распаковки или с целью проверки ошибок, поместите “* ” в правую строну. Вот - более сложный пример использования этого средства:
# Reject messages with serious MIME container errors
deny message = Found MIME error ($demime_reason).
demime = *
condition = ${if >{$demime_errorlevel}{2}{1}{0}}
# Reject known virus spreading file extensions.
# Accepting these is pretty much braindead.
deny message = contains $found_extension file (blacklisted).
demime = com:vbs:bat:pif:scr
# Freeze .exe and .doc files. Postmaster can
# examine them and eventually thaw them.
deny log_message = Another $found_extension file.
demime = exe:doc
control = freeze
| =============
translated by lissyara
|
|