Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> документация —> EXIM —> 4.70 —> часть 41

41. Контентное сканирование во время ACL


    Расширение exim'a для включения контентного сканирования во время ACL, раньше известное как exiscan, изначально было реализовано как патч, Tom`ом Kistner`ом. Код был интегрирован в главный исходный код для 4.50 релиза exim'a, и Том продолжает его поддерживать. Большинство этой части взято из спецификации Тома.
   Также возможно просматривать содержимое сообщений в другой момент времени. Функция
local_scan() (смотрите раздел 42) позволяет контентное сканирование после выполнения всех 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 декодирует файлы, они, по умолчанию, кладутся в тот же самый каталог.

    41.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 in file. Для именного выражения, мы хотим извлечь строку W32/Magistr-B, таким образом, мы можем установить соответствие для одиночных кавычек - левой и правой. В целом, создаётся такая конфигурационная установка:
    av_scanner = cmdline:\
                     /path/to/sweep -ss -all -rec -archive %s:\
                     found in file:'(.+)'
    

  • 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 был запущен с тем же самым числом дочерних процессов. Например:
    av_scanner = mksd:2
    

       Вы можете спокойно пропустить эту опцию (т.к. значение по умолчанию 1).

  • sophie - Sophie - даемон использующий библиотеку Sophos’ libsavi для сканирования на вирусы. Вы можете получить его по адресу http://www.clanfield.info/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 чтобы принимать сообщения даже если какие-то проблемы с вирусным сканером. В противном случае, такая проблема вызывает задержку ACL.
       Когда вирус найден, условие устанавливает переменную раскрытия с именем
    $malware_name, которая содержит имя вируса. Вы можете использовать её в модификаторе message, который определяет ошибку, возвращаемую отправителю, и/или логгируемые данные.
       Если ваш вирусный сканер не может самостоятельно распаковать MIME и TNEF контейнеры, вы должны использовать условие
    demime (смотрите секцию 41.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. Он предполагает, что вы установили:
    av_scanner = $acl_m0
    

    в главной конфигурации 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 = *
    

    41.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.

       Переменная
    spamd_address раскрывается до её использования, если она начинается с символа доллара. В этом случае, раскрытие может вернуть строку которая используется как список, таким образом, результатом раскрытия может быть несколько серверов spamd.

    41.3 Вызов SpamAssassin из ACL exim'a

       Вот - простой пример использования условия spam в DATA ACL:
    deny message = This message was classified as SPAM
         spam = joe
    

       Правая сторона условия spam определяет имя пользователя. Это релевантно если у вас настроены многочисленные профили SpamAssasin. Если вы не хотите использовать сканирование конкретного пользователя, а хотите использовать профиль SpamAssassin как дефолтовый профиль системы, вы можете сканировать для неизвестного пользователя, или просто использовать nobody. Однако, вы должны поместить что-то в правую строну.
       Имя позволяет вам использовать антиспамовый профили на домен, или на пользователя, но, на практике это не просто, поскольку сообщение может иметь нескольких получателей, не обязательно всех в одном домене. Поскольку условие
    spam должно быть вызывано из ACL DATA, чтобы оно могло прочесть содержимое сообщения, переменные $local_part и $domain не установлены.
       Правая сторона раскрывается до использования, таким образом, в неё вы можете поместить поиск или условие. Когда правая строна вычисляется в
    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. Она может казаться несходящейся с $spam_score, поскольку $spam_score - окуруглена, и $spam_score_int - усечена. Целое значение полезно для цифровых сравнений в условиях. Это - специальная переменная; её значение сохраняется с сообщением, и пишется в файл спула exim'a. Это означает, что оно может быть использовано в течение всей жизни сообщения в вашей системе exim'a, в частности, роутерах или транспортах, в последующую фазу доставки.
  • $spam_bar - Строка содержит несколько символов + или -, изображая числовую часть значения счётчика спама. Счётчик спама 4.4 имел бы значение $spam_bar равное ++++. Это полезно для включения в предупреждающие заголовки, т.к. MUA могут сравнивать такие заголовки.
  • $spam_report - Многострочная текстовая таблица, содержащая полный отчёт SpamAssassin для сообщения. Полезна для включения в заголовки, или сообщение о отклонении.
       Условие
    spam кэширует свои результаты за исключением использования раскрытия в spamd_address. Если вы вызываете его для того же самого имени пользователя, он не сканирует заново, а снова возвращает те же самые значения.
       Условие
    spam возвращает DEFER, если при обработке сообщения SpamAssassin'ом происходит какая-то ошибка, или неудачного раскрытия spamd_address. Если вы хотите обработать 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  spam = nobody:true
          add_header = X-Spam-Score: $spam_score ($spam_bar)
          add_header = X-Spam-Report: $spam_report
    
    # add second subject line with *SPAM* marker when message
    # is over threshold
    warn  spam = nobody
          add_header = Subject: *SPAM* $h_Subject:
    
    # 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}}
    

    41.4 Сканирование частей MIME

       Глобальная опция acl_smtp_mime определяет ACL которая вызывается для каждой MIME части SMTP сообщения, включая типы состоящие из нескольких частей (multipart), в последовательности их позиций в сообщении. Точно также, опция acl_not_smtp_mime определяет ACL, которая используется для MIME частей не-SMTP сообщений. Эти опции могут обе относиться к одной и той же ACL если вы хотите одну и ту же обработку в обоих случаях.
       Эти ACL вызываются (возможно, несколько раз) лишь до ACL
    acl_smtp_data, в случае сообщения SMTP, или лишь до приёма не-SMTP сообщений, или, просто до ACL acl_not_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-частью (смотрите секцию 41.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. Если строка не начинается со слэша, она используется как имя файла, и используется дефолтовый путь.
       Условие
    decode, обычно, успешно. Оно ложно лишь для синтаксических ошибок или в необычных обстоятельтвах, типа нехватки памяти. Вы можете легко расшифровать с его оригинальным, предполагаемым именем, используя
    decode = $mime_filename
    

       Однако, вы должны иметь ввиду, что $mime_filename может содержать что угодно. Если вы помещаете файлы вне пути дефолтового пути, они не удаляются автоматически.
       Для вложений RFC822 (сообщений вложенных в сообщения, с типом содержимого
    message/rfc822), ACL вызывается снова, таким же самым образом как для первичного сообщения, лишь если установлена переменная раскрытия $mime_is_rfc822 (смотрите ниже). Приложенные сообщения всегда декодируются на диск до проверки, и файлы удаляются после завершения проверки.
       ACL MIME поддерживает условия
    regex и mime_regex. Они могут использоваться для сравнения регулярного выражения с сырыми и декодированными частями MIME, соответственно. Они описаны в секции 41.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.

    41.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, и содержит соответтсвующее регулярное выражение.
       Предупреждение: С большими сообщениями, это условие может быть довольно ресурсоёмким.

    41.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
    verifying by Gerk





  •  

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    Время генерации страницы 0.043 секунд
    Из них PHP: 48%; SQL: 52%; Число SQL-запросов: 56 шт.
    Исходный размер: 89992; Сжатая: 18459