Использование 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). К основным подсистемам относятся:


Рис. 1: Архитектура СМАП «Дозор-Джет»

Практически все подсистемы СМАП, за исключением подсистемы приема почтовых сообщений и клиентской части подсистемы управления, написаны на языке Scheme.

Модульная архитектура СМАП позволяет разнести разные подсистемы по нескольким серверам (когда это было необходимо), обеспечивая балансировку нагрузки между серверами и надежность работы комплекса. Эксплуатация продукта у больших клиентов показала, что система может обрабатывать десятки гигабайт почтовых сообщений в день даже при использовании одного сервера фильтрации (при выделенном сервере базы данных).

2.2  Архитектура СКВТ «Дозор-Джет»

В отличие от СМАП, СКВТ «Дозор-Джет» работает только в одном режиме — режиме фильтрации трафика. Система состоит из следующих подсистем, стандартных для систем фильтрации веб-трафика:

В данном продукте на языке Scheme написана только серверная часть подсистемы управления, при этом используются те же самые библиотеки, что и в подсистеме управления СМАП «Дозор-Джет». В связи с этим реализация веб-интерфейса СМАП «Дозор-Джет» практически полностью соответствует реализации интерфейса СКВТ «Дозор-Джет».

3  Почему Scheme?

Язык Scheme5 был выбран по ряду причин, подробнее описанных ниже:

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

4  Использование DSL

В продуктах семейства также используются и Domain-Specific Languages — для библиотеки определения типов, созданной для замены библиотеки libmagic и утилиты file, был спроектирован отдельный язык с Lisp-образным синтаксисом. Данный язык позволяет разработчику или администратору безопасности описывать процедуру точного определения типа файла, используя логические операторы, и функции доступа к содержимому определяемого файла ([2], с. 35). Пример процедуры определения типов, написанной на этом языке приведен ниже:

; RAR archives (and (= @0 "Rar!\x1a") (byte @44) (<= (byte @35) 4)) => (format "RAR archive data, v~x, " (byte @44)) => (case (byte @35) ((0) "os: MS-DOS") ((1) "os: OS/2") ((2) "os: Win32") ((3) "os: Unix")) (= @0 "MZ") > (and (lelong @#x3c) (= @(lelong @#x3c) "PE\x0\x0")) => "MS Windows PE" > (and (lelong @#x3c) (= @(lelong @#x3c) "NE")) => "MS Windows 3.x NE" > #t => "MS-DOS executable" => (and (= @24 "@") "\b, OS/2 or MS Windows") => (and (search "Rar!" @#xc000 10000) "\b, Rar self-extracting archive") => (and (= @11696 "PK\003\004") "\b, PKZIP SFX archive v1.1")

В приведенном примере показаны процедуры определения типов для архивов в формате RAR, а также для исполняемых файлов MS DOS и MS Windows. Как видно из примера, язык позволяет описывать достаточно сложные проверки, недоступные в существующих библиотеках, включая объявление и использование локальных (для правил) переменных.

Политики безопасности СМАП также можно рассматривать как пример программы на DSL. Обладая соответствующими знаниями, можно модифицировать политику, не прибегая к использованию веб-интерфейса. Сформированная администратором политика безопасности, компилируется в программу на Scheme, загружается в среду выполнения, и автоматически начинает применяться ко всем новым почтовым сообщениям. Пример скомпилированной политики безопасности вы можете увидеть ниже:

(define |filter-file:Confidential data| (make-filter-file "filter-file.100")) (define |message:Confidential data| '((("from" "admin@localhost") ("to" "security_admin@localhost") ("subject" "Confidential data found!")) "Mail with confidential data was found" "Confidential data")) (define (|cond:All mail| message) (log-condition "cond:All mail" (lambda (message) #t) message)) (define (|cond:Executable files| message) (log-condition "cond:Executable files" (lambda (message) (iter-mime-part1 (rfc822:message-info-body (filtering-info-message message)) (lambda (x) (string-contains-ci? (mime-part-content-type x) "executable")))) message)) (define (|cond:Confidential data| message) (log-condition "cond:Confidential data" (lambda (message) (iter-mime-part1 (rfc822:message-info-body (filtering-info-message message)) (lambda (x) (text-match-regexp-list? (mime-part-text-file x) (filter-file-escaped-regexp-list |filter-file:Confidential data|))))) message)) (define (|set:Template rule set| message) (call/ec (lambda (return) (let ((result (|cond:All mail| message))) (when result (action:relay-message message) (return #t))) #f))) (define (|set:Main Rule| message) (call/ec (lambda (return) (let ((result (|cond:Confidential data| message))) (when result (action:archive-message message) (action:send-notification message #t |message:Confidential data|) (return #t))) (let ((result (|cond:Executable files| message))) (when result (action:void) (return #t))) (let ((result (|cond:All mail| message))) (when result (action:relay-message message) (return #t))) #f))) |set:Main Rule|

В данной политике определяется несколько условий («All mail», «Confidential data» и «Executable files») и действий, из которых формируется политика безопасности под названием «Main Rule». Данная политика выполняет следующие действия с проходящей почтой:

Каждое условие определенное администратором превращается в набор итераторов по соответствующим частям письма — заголовков письма, вложений, текстовых частей и т. п. К этим частям применяются базовые условия, определенные администратором, в случае срабатывания которых, условие возвращает истинное значение, и выполняются действия, указанные администратором. Базовые условия могут объединяться друг с другом, используя логические операции, что позволяет формировать сложные условия проверки частей письма.

5  Реализация СМАП

5.1  Подсистема фильтрации

Подсистема фильтрации является самой важной подсистемой СМАП «Дозор-Джет» — она обрабатывает всю почту, попадающую в систему, и, в зависимости от политики безопасности, определенной администратором безопасности, принимает решение о дальнейшей её судьбе.

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

В качестве условий могут использоваться различные параметры обрабатываемых писем6: содержимое заголовков письма, кем оно отправлено и кому оно предназначено, количество, размер и формат вложений и многое другое. При этом отдельные условия могут комбинироваться в более сложные посредством логических операторов.

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

В текущей версии продукта все условия по умолчанию являются «ленивыми» — вычисление соответствующих параметров (разбор заголовков письма, извлечение вложений из письма, извлечение текста из документов) откладывается до первого вызова соответствующего условия. Это позволяет снизить нагрузку на систему, особенно в тех случаях, когда политика безопасности достаточно простая и не требует разбора всех вложений.

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

5.2  Веб-интерфейс

Веб-интерфейс администратора безопасности состоит из серверной и клиентской частей. Клиентская часть написана на JavaScript и использует AJAX для получения данных от сервера и представления их в браузере.


Рис. 2: Пример интерфейса СМАП «Дозор-Джет»

Серверная часть реализована на 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