RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
YandexMoney: 
41001198119846 
E-gold:
5128052

Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.

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

Расширение exim для включения контентного сканирования во время ACL, раньше известное как exiscan, изначально было осуществлено как патч Tom Kistner. Код был интегрирован в главный исходный код для 4.50 релиза exim, и Том продолжает его поддерживать. Большинство этой части взято из спецификации Тома.

Также возможно просматривать содержимое сообщений в другой момент времени. Функция local_scan() (смотрите раздел 41) позволяет контентное сканирование после выполнения всех ACL. Транспортный фильтр может использоваться для сканирования сообщений во время доставки (смотрите опцию transport_filter, описанную в части 24).

Если Вы хотите включить контентное сканирование во время ACL, при сборке exim Вам необходимо принять меры для задания WITH_CONTENT_SCAN в Вашем Local/Makefile. Когда Вы это сделаете, exim 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 путём установки опций в 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. Оно поддерживает общий (generic) интерфейс к сканерам, вызываемым через шелл, и специализированные интерфейсы для вирусных сканеров типа daemon, которые постоянно находятся в памяти и поэтому значительно быстрее.

    Вы можете установить опцию av_scanner в первой части конфигурационного файла exim для задания используемого сканера вместе с любыми необходимыми дополнительными опциями. Базовый синтаксис следующий:
    av_scanner = scanner-type:option1:option2:[...]:optionN
    

    Если Вы не установите av_scanner, по умолчанию она будет:
    av_scanner = sophie:/var/run/sophie
    

    Если значение av_scanner начинается с символа доллара, оно раскрывается до использования. В этой версии поддерживаются следующие типы сканеров:

    • Avast: Это демон сканера Avast. Тестировалось с Avast Core Security версии 1.1.7. Тестовая версия доступна на http://www.avast.com (для Linux http://www.avast.com/linux-server-antivirus). Этот тип сканера берет одну опцию, которая может быть или всем путем к сокету UNIX, или спецификаторами хоста и порта, разделенными пробелом. Хост может быть именем или IP-адресом. Порт единственное число или пара чисел с тире между ними. Дальнейшие опции даны в отдельных строках к демону как опции перед основной командой сканирования. Например:
      av_scanner = avast:/var/run/avast/scan.sock:FLAGS -fullfiles:SENSITIVITY -pup
      av_scanner = avast:192.168.2.22 5036
      
      Если Вы опускаете параметр, по умолчанию используется путь /var/run/avast/scan.sock. Если Вы используете удаленный хост, Вы должны сделать каталог спула доступным для этого, поскольку сканеру передают путь к файлу, а не содержимое файла. Для получения информации о доступных командах и их опциях Вы можете использовать:
      $ socat UNIX:/var/run/avast/scan.sock STDIO:
          FLAGS
          SENSITIVITY
          PACK
      
    • 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
      av_scanner = clamd:192.0.2.3 1234:local
      

      Если значение av_scanner будет указывать на файл сокета UNIX или содержать местное ключевое слово local, то интерфейс ClamAV передаст имя файла, содержащее данные, которые будут просмотрены, что обычно приводит к меньшему объему ввода/вывода и более эффективно. Обычно в случае TCP данные переданы потоком к ClamAV, поскольку Exim не предполагает, что есть общая файловая система с отдаленным узлом. В доступном src/EDITME теперь есть опция WITH_OLD_CLAMAV_STREAM, она должна быть активна для работы с ClamAV до версии 0.95. Если опция не задана, значение по умолчанию /tmp/clamd. Также следует помнить, что эта опция переключает используемый Exim ClamAV API между новой (INSTREAM) и старой (STREAM) версиями.

    • 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 был запущен с тем же самым числом дочерних процессов. Например:
      av_scanner = mksd:2
      
    • 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. Он предполагает, что Вы установили:
    av_scanner = $acl_m0
    
    в главной конфигурации exim
    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 следующим образом (например):
    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

    Вот простой пример использования условия 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. Если Вы хотите использовать условие spam для его сторонних эффектов (смотрите ниже переменные), можете заставить его всегда возвращать true путём добавления к имени пользователя :true. Когда выполняется условие spam, оно устанавливает множество переменных раскрытия. За исключением $spam_score_int, они доступны лишь внутри ACL; их значения не сохраняются с сообщением, и, таким образом, не могут быть использованы во время доставки.

    • $spam_score: Счётчик очков за спам, например, 3.4 или 30.5. Он полезен для включения в протоколы или сообщение об отклонении. Может быть использован во время доставки письма.
    • $spam_score_int: Счётчик очков за спам, умноженный на 10, как значение целого числа. Например, 34 или 305. Он полезен для цифровых сравнений в условиях. Это специальная переменная: её значение сохраняется с сообщением, и пишется в файл спула exim. Это означает, что оно может быть использовано в течение всей жизни сообщения в системе exim, в частности, в роутерах или в транспортах в последующую фазу доставки.
    • $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 сообщений. Эти опции могут обе относиться к одной и той же ACL, если Вы хотите одну и ту же обработку в обоих случаях.

    Эти 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. Если строка не начинается со слэша, она используется как имя файла и используется путь по умолчанию. Вы можете легко расшифровать с его оригинальным предполагаемым именем, используя:
      decode = $mime_filename
      

    Однако, Вы должны иметь в виду, что $mime_filename может содержать что угодно. Если Вы помещаете файлы вне пути по умолчанию, они не удаляются автоматически.

    Для вложений RFC 822 сообщения, вложенные в сообщения с типом содержимого 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:. Имя файла декодируется по RFC 2047, но никаких дополнительных проверок на адекватность не производится. Если имя файла не найдено, эта переменная содержит пустую строку.
    • $mime_is_coverletter: Эта переменная пытается отличить конверт письма (cover letter) от приложенных данных. Она может быть использована для пресечения кодированного содержимого в конверте письма, не ограничивая вложения вообще. Переменная содержит 1 (истина) для частей MIME, являющихся частями письма и 0 (ложь) для вложений. В настоящее время алгоритм такой:
      1. 1. Самая дальняя часть MIME всегда обёртка письма.
      2. 2. Если обёртка письма multipart/alternative или multipart/related-часть MIME, следовательно, все субчасти MIME внутри multipart.
      3. 3. Если любая другая multipart-часть обёртка письма, первая часть обёртка, а последующие вложения.
      4. 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). Счётчик действует на сообщение, таким образом, он сбрасывается при обработке вложений RFC 822 (смотрите $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
    

  • Поиск

     

    Найди своих коллег!