Использование Scheme в разработке семейства продуктов «Дозор-Джет»Алексей Отт |
Аннотация: Данная статья представляет собой краткий обзор использования функционального программирования в разработке семейства продуктов «Дозор-Джет» — программного обеспечения для контентной фильтрации трафика, применяемого для предотвращения утечек производственной информации, и соблюдения законодательства в части сохранения информации [2], [1].
This article provides a brief overview of the use of the functional programming in the development of the «Dozor-Jet» family of products. The «Dozor-Jet» software employs traffic content filtering to provide enterprise information leak prevention and ensure legal compliance.
Обсуждение статьи ведётся по адресу
http://community.livejournal.com/fprog/2368.html.
1 Что такое «Дозор-Джет»?
Семейство продуктов «Дозор-Джет» состоит из нескольких продуктов, реализующих функциональность по фильтрации почтового и веб-трафика. История данного семейства продуктов началась в 1999 году с разработки системы мониторинга и архивирования почтовых сообщений (СМАП) для одного крупного заказчика. Первая версия продукта1 была поставлена заказчику в начале 2000 года [4]. Постепенно систему начали внедрять и у других заказчиков, и она стала обретать черты «коробочного» продукта. К 2006 году система была внедрена уже у более, чем 200 клиентов, среди которых были крупные государственные и коммерческие организации, объем продаж достиг нескольких миллионов долларов в год2.
В 2005 году был выпущен еще один продукт семейства «Дозор-Джет» — система контроля веб-трафика (СКВТ) [3], на основе которой были затем разработаны и другие продукты этого семейства.
Отличительной чертой линейки продуктов по сравнению с конкурирующими продуктами являлась возможность построения сложных условий обработки трафика, поддержка всех используемых в России и СНГ кодировок3, автоматическое определение типов файлов и кодировок документов, большое количество поддерживаемых форматов документов и архивов. Все это позволяло создавать очень гибкие политики безопасности и предотвращать утечки важной для организации информации.
С точки зрения программиста эта линейка продуктов интересна тем, что при её разработке активно использовался язык программирования Scheme (а именно, PLT Scheme). СМАП «Дозор-Джет» практически полностью написан на этом языке (за исключением небольших платформенно-зависимых частей, написанных на языке C), а в СКВТ Scheme используется для реализации серверной части веб-интерфейса.
2 Архитектура систем
В данном разделе приводится краткое описание архитектуры продуктов семейства «Дозор-Джет»4.
2.1 Архитектура СМАП «Дозор-Джет»
СМАП «Дозор-Джет» может функционировать в двух режимах: режиме фильтрации почты, когда полученные сообщения обрабатываются в соответствии с определенной политикой безопасности, после чего система принимает решение о дальнейшей отправке или задержании сообщения, и режиме архивации, когда почтовые сообщения после обработки могут быть сохранены в долговременном архиве.
СМАП «Дозор-Джет» состоит из нескольких взаимодействующих между собой подсистем (см. рис. 1). К основным подсистемам относятся:
- Подсистема приема почтовых сообщений, обеспечивающая прием почты от внешних клиентов и серверов. На этом этапе производится первоначальная фильтрация почтовых сообщений для предотвращения рассылки спама и несанкционированной отправки почты через почтовый сервер. Эта подсистема была реализована на базе SMTP-прокси из другого продукта компании — Z–2.
- Подсистема фильтрации, которая обеспечивает обработку почтовых сообщений в соответствии с политикой безопасности и принимает решение о дальнейшей судьбе почтового сообщения – должно ли оно быть отправлено получателю, помещено в архив, требуется ли уведомить администратора безопасности или совершить сразу несколько действий.
- Подсистема выполнения действий над письмами, которая выполняет конкретные действия, определенные в процессе фильтрации почтовых сообщений. Эта подсистема также используется для выполнения периодических и отложенных действий.
- Подсистема управления, предоставляющая веб-интерфейс, через который администратор может управлять как политикой безопасности, так и системными настройками продукта. Данная подсистема состоит из серверной части, написанной на Scheme, и клиентской части, написанной на JavaScript. Политики безопасности вместе с другой информацией хранятся в базе данных. Также через веб-интерфейс производится работа с архивом почтовых сообщений, хранящимся в базе данных.
- Подсистема архивации, реализующая интерфейс к базе данных (Oracle или PostgreSQL) и обеспечивающая работу с почтовыми сообщениями, хранимыми в базе данных.
- Монитор ресурсов, который отслеживает наличие всех необходимых для работы процессов, следит за свободным местом на диске и в базе данных, и в случае неполадок, оповещает системного администратора.
Практически все подсистемы СМАП, за исключением подсистемы приема почтовых сообщений и клиентской части подсистемы управления, написаны на языке Scheme.
Модульная архитектура СМАП позволяет разнести разные подсистемы по нескольким серверам (когда это было необходимо), обеспечивая балансировку нагрузки между серверами и надежность работы комплекса. Эксплуатация продукта у больших клиентов показала, что система может обрабатывать десятки гигабайт почтовых сообщений в день даже при использовании одного сервера фильтрации (при выделенном сервере базы данных).
2.2 Архитектура СКВТ «Дозор-Джет»
В отличие от СМАП, СКВТ «Дозор-Джет» работает только в одном режиме — режиме фильтрации трафика. Система состоит из следующих подсистем, стандартных для систем фильтрации веб-трафика:
- Подсистема фильтрации трафика, выполняющая проверку передаваемых данных на соответствие политике безопасности, а также архивирование передаваемой информации (веб-почта и т. п.) в СМАП «Дозор-Джет»;
- Подсистема управления, предоставляющая веб-интерфейс администратора, предназначенный для работы с политиками безопасности, предоставления отчетов о работе системы и выполнения прочих административных задач;
- Подсистема кэширования данных на базе кэш-сервера Squid.
В данном продукте на языке Scheme написана только серверная часть подсистемы управления, при этом используются те же самые библиотеки, что и в подсистеме управления СМАП «Дозор-Джет». В связи с этим реализация веб-интерфейса СМАП «Дозор-Джет» практически полностью соответствует реализации интерфейса СКВТ «Дозор-Джет».
3 Почему Scheme?
Язык Scheme5 был выбран по ряду причин, подробнее описанных ниже:
-
Простота и выразительность языка. Scheme — достаточно простой язык, с
легковесной средой выполнения. Существовавший на то время стандарт языка, R5RS, занимал
около 50 страниц, в отличие от значительно более «подробного» Common Lisp. Простота
языка позволяла быстро вводить новых разработчиков в курс дела, даже если до прихода в
компанию они не имели опыта разработки на языке Scheme.
В процессе разработки использовались макросы Scheme, с помощью которых сильно сокращался объем кода, который необходимо было поддерживать, и программа писалась в терминах целевой предметной области. Стоит отметить, что размер кода системы СМАП (вместе с различными модулями расширений и дополнительными утилитами) составляет порядка 35 тысяч строк на Scheme и несколько тысяч строк кода на языках C и С++. Для сравнения, размер кода одного из конкурирующих продуктов (с меньшей функциональностью), написанного на языке C++, составляет более 200 тысяч строк.
Сокращение размера кода позволило уменьшить общее количество ошибок в продукте, а достаточно небольшой процент кода на C и C++ позволил избежать типичных для этих языков ошибок, таких как утечки памяти и ошибки доступа к памяти.
- Возможность интерактивной разработки. Используя REPL, разработчик может писать и тестировать код без пересборки всего продукта, что существенно ускоряет разработку частей продукта. За счет более короткого цикла разработки время вывода продуктов на рынок было существенно сокращено.
- Возможность выполнения сгенерированного кода во время выполнения программы — политика безопасности, созданная администратором безопасности, преобразовывается в исходный код Scheme, проводится оптимизация этого кода и выполняется как часть программы, обновляясь на лету, без перезапуска процессов.
- Переносимость. Кроссплатформенность Scheme позволила использовать СМАП «Дозор-Джет» на разных Unix-совместимых операционных системах — различные дистрибутивы Linux, Sun Solaris на процессорах Sparc и x86/AMD, HP-UX на процессорах PA-RISC. Платформенно-зависимая часть продукта составлял несколько сотен строк на языке C и в основном использовалась для реализации привязки к различным библиотекам, в том числе и для баз данных.
Еще одной причиной выбора этого языка, было наличие наработок в части создания веб-приложений на языке Scheme — наличие готовых компонентов, что также позволило уменьшить время вывода продукта на рынок.
4 Использование DSL
В продуктах семейства также используются и Domain-Specific Languages — для библиотеки определения типов, созданной для замены библиотеки libmagic и утилиты file, был спроектирован отдельный язык с Lisp-образным синтаксисом. Данный язык позволяет разработчику или администратору безопасности описывать процедуру точного определения типа файла, используя логические операторы, и функции доступа к содержимому определяемого файла ([2], с. 35). Пример процедуры определения типов, написанной на этом языке приведен ниже:
В приведенном примере показаны процедуры определения типов для архивов в формате RAR, а также для исполняемых файлов MS DOS и MS Windows. Как видно из примера, язык позволяет описывать достаточно сложные проверки, недоступные в существующих библиотеках, включая объявление и использование локальных (для правил) переменных.
Политики безопасности СМАП также можно рассматривать как пример программы на DSL. Обладая соответствующими знаниями, можно модифицировать политику, не прибегая к использованию веб-интерфейса. Сформированная администратором политика безопасности, компилируется в программу на Scheme, загружается в среду выполнения, и автоматически начинает применяться ко всем новым почтовым сообщениям. Пример скомпилированной политики безопасности вы можете увидеть ниже:
В данной политике определяется несколько условий («All mail», «Confidential data» и «Executable files») и действий, из которых формируется политика безопасности под названием «Main Rule». Данная политика выполняет следующие действия с проходящей почтой:
- проверяет текст писем (включая вложения) на наличие конфиденциальной информации, и в случае обнаружения, информирует администратора безопасности о таком письме, вместе с его задержанием в архиве;
- удаляет письмо в том случае, если в письме передается исполняемый файл;
- доставляет адресатам всю остальную почту.
Каждое условие определенное администратором превращается в набор итераторов по соответствующим частям письма — заголовков письма, вложений, текстовых частей и т. п. К этим частям применяются базовые условия, определенные администратором, в случае срабатывания которых, условие возвращает истинное значение, и выполняются действия, указанные администратором. Базовые условия могут объединяться друг с другом, используя логические операции, что позволяет формировать сложные условия проверки частей письма.
5 Реализация СМАП
5.1 Подсистема фильтрации
Подсистема фильтрации является самой важной подсистемой СМАП «Дозор-Джет» — она обрабатывает всю почту, попадающую в систему, и, в зависимости от политики безопасности, определенной администратором безопасности, принимает решение о дальнейшей её судьбе.
Для определения политики безопасности администратор безопасности может использовать различные комбинации из условий и действий. При этом список условий и действий не является фиксированным, они могут добавляться путем подключения новых модулей, расширяющих функциональность продукта.
В качестве условий могут использоваться различные параметры обрабатываемых писем6: содержимое заголовков письма, кем оно отправлено и кому оно предназначено, количество, размер и формат вложений и многое другое. При этом отдельные условия могут комбинироваться в более сложные посредством логических операторов.
В зависимости от срабатывающих условий администратор может определять различные действия и их комбинации: дальнейшую отправку письма, помещение письма в архив, отправку уведомления о письме, выдачу запроса отправителю письма на явное подтверждение отправки письма и т. д.
В текущей версии продукта все условия по умолчанию являются «ленивыми» — вычисление соответствующих параметров (разбор заголовков письма, извлечение вложений из письма, извлечение текста из документов) откладывается до первого вызова соответствующего условия. Это позволяет снизить нагрузку на систему, особенно в тех случаях, когда политика безопасности достаточно простая и не требует разбора всех вложений.
Обработка вложений обычно производится с помощью внешних утилит, которые извлекают вложенные объекты (для архивов) и текст (для документов). Затем извлеченные части передаются на обработку в соответствии с политикой безопасности, и процесс повторялся заново до тех пор, пока не будет извлечен последний вложенный элемент, или размер распакованных данных не достигнет заданного предельного размера.
5.2 Веб-интерфейс
Веб-интерфейс администратора безопасности состоит из серверной и клиентской частей. Клиентская часть написана на JavaScript и использует AJAX для получения данных от сервера и представления их в браузере.
Серверная часть реализована на Scheme и использует самостоятельно написанный mod_mzscheme для выполнения кода внутри веб-сервера Apache7. Веб-сервер производит отдачу статического и динамического контента. Динамический контент генерируется из файлов, содержащих шаблоны, которые заполняются данными из базы данных или конфигурационных файлов. Возможность выполнения кода на Scheme внутри веб-сервера позволяет существенно ускорить работу веб-интерфейса за счет однократной загрузки кода и сохранению открытых соединений с базой данных между запросами к серверу.
Пример интерфейса администратора безопасности вы можете видеть на рис. 2.
6 Основные результаты
Как показывает десятилетний опыт разработки и эксплуатации продуктов линейки «Дозор-Джет», функциональные языки могут применяться для разработки коммерческих продуктов, поставляемых конечным пользователям. За счет оперирования высокоуровневыми понятиями и применения REPL, цикл разработки продуктов может быть ускорен, а количество разработчиков может сравнительно малым, что позволяет выводить продукты на рынок в более короткие сроки и с меньшими затратами.
Список литературы
- [1]
- Алексей Отт. О контентной фильтрации. Продолжение темы. Jet Info, (10):2–21, 2006.
- [2]
- Олег Слепов. Контентная фильтрация. Jet Info, (10), 2005.
- [3]
- Олег Слепов and Алексей Отт. Контроль использования Интернет-ресурсов. Jet Info, (2), 2005.
- [4]
- Александр Таранов and Владимир Цишевский. Система мониторинга и архивирования почтовых сообщений. Jet Info, (9):10–28, 2001.
- *
- Я хочу поблагодарить своих коллег по «Инфосистемам Джет» за помощь в написании этой статьи.
- 1
- Первая версия продукта была разработана силами трех разработчиков, и после начала продаж группа постепенно была увеличена до восьми человек, по мере увеличения функциональности продукта.
- 2
- Данные по продажам взяты из пресс-релиза компании, опубликованного в журнале Jet Info, №10 за 2006-й год, стр. 22.
- 3
- Это было одной из проблем при использовании продуктов иностранных компаний.
- 4
- Описания архитектуры взяты из официальной документации соответствующих продуктов, которую вы можете найти на сайте компании: http://www.jetsoft.ru/. Документация также содержит подробное описание возможностей продуктов данного семейства.
- 5
- Для первых версий СМАП «Дозор-Джет» использовалась PLT Scheme v103, но позднее, в 2004 году, был выполнен переход на версию PLT Scheme v30x, в которой реализовано много полезных вещей, таких как FFI, система модулей и т. п.
- 6
- В СМАП практически для всех параметров используются собственные процедуры определения корректных значений формата файлов, кодировки текста и т. д. Это позволяло избежать проблем с неправильным указанием параметров письма в MUA, а также правильно обрабатывать письма с целенаправленно измененным содержимым: переименованными файлами и т. п.
- 7
- В последних версиях СКВТ вместо связки Apache + mod_mzscheme используется веб-сервер, поставляемый вместе с PLT Scheme.
Этот документ был получен из LATEX при помощи HEVEA