TPmail тестовой вывод.

Почтовый пакет TPmail для Unix систем

Выбор языка

[анг]  [рус]


Начало

Документация

Поддержка

Новости

Ресурсы

Контакты


Модуль milter_agent. Описание и работа с ним.

Оглавление

Общие замечания о milter модулях
Модуль milter-agent
Список возможностей milter-agent
Ключи модуля milter-agent
Конфигурационный файл для milter-agent
Классификация фильтров по назначению
Теория фильтров
Регулярные выражения
Пример конфигурационного файла
Примеры адресных фильтров
Примеры фильтров сообщений
Программа диагностики ma_client
Создание динамических библиотек для модуля milter-agent

Общее замечание о milter модулях.
Эти модули являются промежуточными агентами при обработке почты, т.е. они могут изменять тело и заголовок сообщения, список получателей, а также предлагать sendmail принять и не принять сообщение. Однако эти агенты (модули) не являются локальными агентами доставки или транспортными агентами. Наиболее эффективны milter модули для проверки сообщений на присутствие вирусов, нежелательной корреспонденции, а также применения прозрачного шифрования или ведения архива почты. Иными словами, такие модули обеспечивают возможности для централизованной обработки почтовых сообщений.



Модуль milter-agent реализует идею организации конвейерной обработки информации в почтовом потоке программы sendmail. Ключевая идея модуля заключается в предоставление возможности подключения других программ для обработки сообщения. Часто в других системах такие программы называют внешними фильтрами. Запуск фильтра для обработки может происходить всегда или при выполнении определенных условий. Например, один фильтр может проверять сообщение на присутствие вирусов, другой фильтр может осуществлять контентную проверку на присутствие спама и так далее. Главное отличие механизма фильтров в milter-agent от других подобных реализаций заключается в простоте, естественности и функциональности вызова внешних программ (подобно запуску сценариев в shell). При создании фильтров можно использовать любые средства разработки:
shell, C, C++, Perl, Basic, Lisp, Prolog, Haskel, Ruby и так далее.



Модуль milter-agent обладает следующими возможностями для обработки сообщений:

- Динамическая конфигурация. Модуль автоматически загружает новую конфигурацию, если в ней не найдено синтаксических ошибок;
- Загрузка по требованию. Конфигурация может быть загружена по внешнему сигналу (USR1);
- Синтаксис конфигурационного файла очень прост и прозрачен для понимания;
- Для сообщения (письма) можно запустить на исполнение внешную программу. Можно указать определенные условия для исполнения этого фильтра, например, совпадение имен получателя или отправителя, совпадение темы письма;
- Для сообщения (письма) можно запустить на исполнение внутренний модуль (подгружаемая динамическая библиотека). Возможности такие же как и для внешних программ, однако, конечно, эти модули работают быстрее чем внешние программы;
- Добавление/удаление пользователей из списка получателей сообщений (например, автоматическая копия некоторой рассылки);
- Изменение служебных заголовков письма (например, указание того, что сообщение прошло некоторый контроль);
- Изменение тела сообщения (например, удаление нежелательной части сообщений, т.е. цензура почты);
- Поддержка регулярных выражений для списков (IEEE Std. 1003.2);
- Выдача текущей конфигурации и состояния модуля;
- Не останавливать обработку в случае фатальных ошибок - переполнение дисков и т.д.;
- Возможность завершать "зависшие" процессы по таймуту или отключать "сбойные" динамические библиотеки или те же "плохие "процессы при превышении порога ошибок;
- Детализация событий в журнале по уровням;
- Обработка кодов возврата от вызываемых программ/модулей для приема сообщения или отказа в приеме сообщения;
- Легко изменяемые параметры конфигурации для фильтров;
- Возможность запуска только одного (или нескольких) экземпляра приложения в том случае, если оно использует ресурсы в монопольном режиме (например, антивирусные сканеры);
- Поддержка времени/даты в расширенном формате демона cron;


Программа milter_agent поддерживает следующие опции командной строки
(они также описаны в стандартном руководстве man для milter_agent):


ОпцияНазначение
-hпечатать краткую помощь
-Vпечатать версию
-vболее детальный вывод информации
-c configиспользовать данный файл как конфигурационный (по умолчанию=/etc/mail/milter-agent.conf)
-p pipeлокальный сокет (Unix domain socket) для обмена данными с sendmail (по умолчанию=unix:/var/spool/milter-agent/sock)
-i socketлокальный сокет (Unix domain socket) для обмена данными с пользователем (по умолчанию=unix:/var/spool/milter-agent/cmd)
-t timeout таймаут операций для сокета sendmail (по умолчанию=0)
-u userимя пользователя, с правами которого работает milter-agent (по умолчанию=_milter-agent)
-l vlevelуровень отладочной печати (по умолчанию=0)
-d modeрежим работы (0=демон,>0=терминал отладки)
-m err_levelпорог ошибок при запуске внешних программ и внутренних модулей (по умолчанию=0)
-Aразрешить добавление получателей для сообщения
-Rразрешить удаление получателей для сообщения
-Hразрешить добавление служебных полей в заголовке письма
-Gразрешить изменение служебных полей в заголовке письма
-Bразрешить изменения тела письма
-aиспользовать блокировку для доступа к конфигурации
-Cзакрыть все открытые файлы при запуске внешней программы (после fork, перед exec)
-Eостанов при любой ошибке
-Fдинамический контроль за изменением конфигурации
-Tразрешить завершение внешней программы после истечения таймаута
-Mразрешить завершение внутреннего модуля после истечения таймаута
-Xвключить поддержку регулярных выражений (POSIX.2)
-Iвыводить информацию о временном файле (для систем архивации)
-1для упрощения конфигурации разрешает следующие опции -ARHGITMX
-Qиспользовать последнего в списке получателей при обработке сообщения (по умолчанию=первый из списка)



Общие параметры конфигурационного файла milter-agent такие же как и опции для командной строки. Помните, что по умолчанию практически все опции модуля отключены.

Пример 1. Запуск модуля milter-agent.
# /usr/local/libexec/milter_agent -c /etc/mail/milter/milter-agent.conf -u mailnull -HIBFGARXavTM -m 5 -l 1


В настоящее время модуль поддерживает два типа фильтров по назначению: по адресам и сообщениям.

Адресный фильтр предназначен для управления списком получателей или заголовком письма. Его главные возможности - это упрощение ведения централизованных адресных листов, дублирование почтового потока, переадресация и другие аналогичные задачи.

Фильтр сообщений предназначен для запуска внешних приложений или динамических библиотек для работы с письмом и передачи результатов по обработке в sendmail для приема или отказа данного письма.

Все конфигурационные файлы считываются и обрабатываются последовательно. Порядок запуска фильтров также последователен. Это позволяет самому администратору решать что и в каком порядке нужно обрабатывать. Все правила в фильтре соединяются логическим И (AND).
Регулярные выражения (см. re_format(7) и regex(3)) допускаются в большинстве списков.


Рассмотрим наиболее важные моменты, которые необходимо понимать для правильного использования фильтров.

Все фильтры запускаются в контексте процесса milter-agent. Это означает, что внешние программы и внутренние модули будут иметь те же права, что и milter-agent. Поэтому, если вы будете использовать какие-либо каталоги для доступа и хранения программ или данных, кроме, возможно, каталога /tmp, нужно убедиться в том, что не будет проблем с правами доступа. То же самое будет справедливым и в отношении прав доступа для запускаемых программ или динамических библиотек.

Milter-agent запускает все фильтры последовательно. Если какой-либо из фильтров отвергает (reject,tempfail) или принимает (accept,discard) сообщение, используя механизм выходных кодов, тогда все последующие фильтры уже вызываться не будут. В противном случае запуск фильтров продолжается до конца списка фильтров. Sendmail предоставляет возможность фильтру сообщить причину отказа в приеме сообщения. Для этого можно использовать соответствующие директивы как reject_message или tempfail_message.

Использование директивы run_single_instance позволяет исполнять одновременно не более N экземпляров приложений, в которых есть внутренние ограничения на доступ к соответствующим ресурсам, например, используется доступ к файлам в монопольном режиме. Примерами таких приложений могут служить антивирусные сканеры KAV, DrWeb, ClamAV и ряд других программ.

Поддержка динамической конфигурации в milter-agent позволяет администратору "на лету" подключать внешние программы и внутренние модули для обработки сообщений. Именно эта возможность дает администраторам пробовать любые программы в качестве фильтров, не боясь остановить почтовую систему при каких-либо ошибках или сбоях этих программ. Такая надежность обеспечивается тем, что каждый фильтр исполняется как отдельный процесс. В этом случае даже фатальные ошибки этих приложений не могут повлиять на дальнейшую обработку сообщения. Механизм таймаутов является средством отслеживания состояния этого процесса. В случае истечения интервала времени, который был задан для выполнения задачи (по умолчанию он равен одной минуте), задача завершается принудительно сигналом TERM или просто игнорируется в надежде на то, что приложение все-таки завершит свою работу через какое-то время. Однако в последнем случае возможно появление большего числа незавершенных процессов, если приложение так никогда и не остановится.

Минимальный фильтр может состоять всего из двух параметров - имени задачи, имени приложения и комадной строки для него.

Главным недостатком при использовании внешних программ является снижение производительности при обработке. Для достижения высокой скорости обработки можно использовать внутренние модули (динамически загружаемые библиотеки). Интерфейс взаимодействия включает в себя всего одну функцию process_message_by_module. Примеры таких модулей входят в комплект поставки. Отметим наиболее важное. Синтаксис для модулей почти такой же как и для приложений. Только в строке запуска exec_cmd нужно написать строку параметров без имени модуля. Имя модуля для исполнения указывается директивой module_name. Так как модули подключаются в адресное пространство milter-agent, то любые фатальные ошибки приводят к останову milter-agent. Рекомендуется тщательное тестирование кода модулей перед началом их реальной эксплуатации. Единственная возможность для внешнего контроля ошибок для модулей дается директивой module_safe_use. При ее использовании модуль запускается как отдельный поток (thread) с отслеживанием состояния по таймауту. Если разрешено завершение модуля, то milter-agent отсоединяет этот поток и пробует завершить поток, используя механизм отмены исполнения (cancellation).

Для внешних приложений и модулей администратор может установить порог ошибок, при превышении которого приложение или модуль более вызываться не будет. Стандартными ошибками являются указание неверного местоположения программы или модуля, неверные параметры при вызове, отсутствие функции в модуле при динамическом подключении (dynamic binding of function). Если другие пакеты требуют определенного порядка аргументов при вызове задачи, в milter-agent администратор может использовать любой порядок следования аргументов при вызове (т.е. определяется логикой самой задачи). Перед вызовом задачи milter-agent разбирает строку вызова и заменяет найденные формальные переменные как %f и другие на текущие значения для этого сообщения, т.е. ,например, %s становится адресом отправителя из конверта сообщения. Если необходимо использовать такие же параметры при вызове без замены, то для экранирования нужно использовать %, т.e %%f будет %f при реальном вызове. Такой мощный и гибкий механизм подстановки позволил решить просто и эффективно практически все основные задачи при обработке сообщений. Отказ или прием сообщения по кодам возврата, условия исполнения фильтра для всех или для определенных получателей/отправителей, запись результатов работы фильтра в файл (например, используется антивирусными сканерами для указания какие вирусы были найдены при проверке письма), запись нового тела сообщения в файл (прозрачное шифрование, сохранение "вылеченного" письма) и другие свойства делают milter-agent мощным и полезным средством в промежуточной обработке почты.

В качестве иллюстрации работы milter-agent рассмотрим практический пример: как происходит замена "на лету" динамической библиотеки. Администратор комментирует описание выбранного фильтра в конфигурационном файле. В момент прихода нового сообщения milter-agent, обнаружив изменения в конфигурации, перегружает ее, эффективно удаляя закомментированный фильтр из списка фильтров. Так как этот фильтр использовал динамическую библиотеку, то эта библиотека выгружается перед удалением из списка. Теперь можно загрузить новый модуль. Администратор вносит необходимые изменения в описание фильтра и снимает комментарии с модуля. Когда придет новое сообщение, то milter-agent загрузит новую конфигурацию и добавит этот фильтр в список. Далее при первом вызове этого фильтра milter-agent динамически загрузит указанную библиотеку и осуществит динамическое разрешение адреса функции обработки перед вызовом этой функции. Такая несложная схема позволяет, не останавливая работы почтового сервера: удалять устаревшее программное обеспеченние, обновлять существующие версии и расширять функциональность, добавляя новые фильтры (программы или библиотеки).

По умолчанию все опции milter-agent отключены, поэтому необходимо включить их с командной строки или использовать конфигурационный файл. В любой момент админинстратор с помощью утилиты ma_client может посмотреть текущие установки milter-agent, а также какие фильтры активны сейчас, их статистику. Такая самодиагностика позволяет администратору видеть состояние системы и даже строить системы с обратной связью. Например, если какой-либо фильтр превысил порог ошибок и был отключен, то можно об этом получить уведомление. Если же какой-либо фильтр вообще не использовался в течение заданного периода, то об этом также можно получить уведомление и принять соответствующие меры. Выдача текущего состояния с помощью ma_client является естественной возможностью для архитектуры системы, где администратору были обещаны ясность и прозрачность.

Одной из интересных возможностей milter-agent является следующая - это получать текстовые ответы от фильтров сообщений и возвращать их в sendmail как причину отказа. Именно так реализованы сценарии работы с антивирусными сканерами. Их сообщения о найденных вирусах передаются обратно в sendmail вместе с кодом возврата. Sendmail записывает код возврата и причину в журнал maillog. Затем когда модуль sma_stat обрабатывает статистику, то он выдает детальную статистику по вирусам: сколько, откуда, кому и от кого. Картина получается качественной и достоверной. Часто хорошо это видно в моменты вирусных эпидемий. Конечно, такое применение идеи конвейера можно использовать не только в сочетании с антивирусным ПО.



Регулярные выражения в milter-agent реализованы на базе стандарта POSIX 1003.2 c использованием стандартной системной библиотеки (см. re_format(7) и regex(3)). Однако для упрощения просмотра вначале всегда производится сравнение на точное совпадение, а затем уже используется поиск по совпадению с шаблоном регулярного выражения.

Пример 1. Простое точное совпадение
run_message_recipient = "test@home.jp"

Пример 2. Список для точного совпадения
run_message_recipient = "test@home.jp test@home.us"

Пример 3. Совпадение по шаблону регулярного выражения
run_message_recipient = "test@home\.(ru|jp|us)"




Пример конфигурационного файла (входит в комплект поставки): milter-agent.conf.sample


Примеры адресных фильтров.

Пример 1. Добавление наблюдателя к паре
[Address]
message_sender = "user1@domain1.com"
message_recipient = "user2@domain2.com"
add_recipient = "user3"

Пример 2. Переадресация
[Address]
message_recipient = "^user1@"
message_forward_recipient = "user2 user3"
message_forward_recipient = "user4@domain4.net"

Пример 3. Дублирование почтового трафика
[Address]
message_recipient = "user56@domain99.com"
add_recipient = "watching_user"

Пример 4. Пересылка почты с одного бюджета на другой с добавлением служебной отметки
[Address]
message_recipient = "user1@domain1.com"
message_forward_recipient = "user2@domain2.org"
add_header_name = "X-Forward-Mail-From"
add_header_value = "user1@domain1.com"



Примеры фильтров сообщений.

Пример 1. Архивация почты
[Filter]
task_name = mail_archive_task
exec_cmd = "/usr/local/sbin/mail_archive.sh %f /usr/local/tmp/mail_archive"

Пример 2. Берем только текст
[Filter]
task_name = test_html_mail_task
task_timeout = 0
reject_exit_codes = "1"
reject_message = "HTML mail or attachments not accepted."
run_message_sender = "user1"
run_message_recipient = "user2"
exec_cmd = "/usr/local/sbin/test_html_mail.sh %f"

Пример 3. Лечим "зараженную" почту
[Filter]
task_name = virus_cure_kav
run_single_instance = 1
exec_cmd = "/usr/local/sbin/kav50_cure_uue.sh %f %n"

Пример 4. Проверяем почту антивирусом ClamAV
[Filter]
task_name = virus_check_clamav
run_single_instance = 1
exec_cmd = "/usr/local/sbin/clamavscanner.sh %f /usr/local/share/clamav /usr/local/tmp/clamav_archive %r %h"

Пример 5. Проверяем почту разными антивирусами
[Filter]
task_name = virus_check
#reject_exit_codes = "1"
run_single_instance = 1
#skip_recipient = "root"
#skip_message_subject = "ALERT! Virus Scanner Problem!"
exec_cmd = "/usr/local/sbin/virus_scanner.sh /usr/local/tmp/avir_archive %f %r %n %h"

Пример 6. Тестовой модуль
[Filter]
task_name = module_sample_task
module_name = "/usr/local/libexec/module_sample.so"
exec_cmd = "%f"

Пример 7. Модуль проверки сообщения на RHTA маркер
[Filter]
task_name = test_rhta_mail_module_task
module_name = "/usr/local/libexec/module_test_rhta_mail.so"
exec_cmd = "%f"




Программа ma_client взаимодействует с загруженным модулем milter_agent через локальный сокет (Unix domain socket). Для краткой помощи можно просто вызвать ma_client без параметров.

Пример использования 1. Вернуть текущие глобальные настройки milter-agent.
# ma_client /var/spool/milter-agent/cmd 1

Пример использования 2. Вернуть текущую конфигурацию для всех фильтров сообщений в milter-agent.
# ma_client /var/spool/milter-agent/cmd 2



Модуль milter-agent имеет в поставке все необходимое для построения динамических библиотек с новыми функциями.
Ниже следует краткое описание назначения поставляемых файлов:

makefile.modules - файл проекта сборки всех модулей
module.h - определение интерфейса для модуля
module_dummy.c - фильтр-модуль (пустой)
module_sample.c - фильтр-модуль (пример)
module_test_rhta_mail.c - фильтр-модуль для детектирования отказа по RHTA
module_test_html_mail.c - фильтр-модуль для детектирования почты в HTML формате или почты с вложениями
module_mail_archive.c - фильтр-модуль для архивирования всей входящей почты

Загрузить архив с примерами модулей для milter-agent.



Valid HTML 3.2! Авторское Право © 2006 Дмитрий Стефанков Last modified: $Date: 2008-01-03 13:27:07+03 $ Powered by FreeBSD. Powered by Apache. Powered by OpenSSL.