Создание плагина OSSIM для сбора логов из базы данных
1. Для чего это нужно?
Предположим, у вас есть приложение, которое ведет запись журналов событий в базу данных (например, Kaspersky Security Center, Symantec Endpoint Security Server, и многие другие) и вы хотите собирать эти журналы с помощью SIEM системы Alienvault OSSIM (USM), но в поставке «из коробки» OSSIM не умеет собирать и парсить логи Вашего приложения.
2. Исходные данные
Установленное на сервер программное обеспечение Alienvault OSSIM (в примере использовалась версия 5.3).
Сервер базы данных, в которую приложение, чьи журналы событий нужно собирать в OSSIM, записывает события (для данной статьи используется созданная тестовая база данных, запись в которую осуществляется вручную).
OSSIM сервер IP: 192.168.0.111
IP сервера с базой данных: 192.168.0.113
В настоящем примере используется база данных (далее — БД) MySQL с названием «event_data», в которой создана таблица «data_table» для хранения журналов событий.
Для доступа к БД создана учетная запись (далее — УЗ) пользователя с именем «mysql_user» и паролем «SQL_con_1». УЗ пользователя наделена правами подключения и чтения информации из БД по сети. Все данные хранятся в одной таблице — «data_table».
Схема таблицы:
+------------+--------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+-------------------+-------+
| date | timestamp | NO | | CURRENT_TIMESTAMP | |
| event_id | int(11) | NO | PRI | 0 | |
| event_type | varchar(40) | YES | | NULL | |
| username | varchar(30) | YES | | NULL | |
| message | varchar(100) | YES | | NULL | |
+------------+--------------+------+-----+-------------------+-------+
Пример заполнения таблицы:
+---------------------+----------+------------+----------+----------------+
| date | event_id | event_type | username | message |
+---------------------+----------+------------+----------+----------------+
| 2016-06-26 22:22:09 | 159 | type1 | unknown | Message text |
| 2016-06-26 22:22:10 | 160 | type1 | valeriy | Message text |
| 2016-06-26 22:22:11 | 161 | type1 | alex | Message text |
| 2016-06-26 22:22:12 | 162 | type1 | cisco | Message text |
| 2016-06-26 22:22:14 | 163 | type1 | net_adm | Message text |
+---------------------+----------+------------+----------+----------------+
3. Решение
Перед тем, как начать решать данную задачу, определимся с используемой терминологией.
Источник (журналов) событий (ИБ) — программное обеспечение (в данном случае — база данных) или аппаратный комплекс, журналы событий которого передаются на OSSIM для обработки и хранения.
Тип источника — все множество источников можно разделить на группы — типы источников (например, сеть из 5 одинаковых маршрутизаторов представляет собой 5 источников, но все они одного и того же типа).
Плагин — настроенный в OSSIM механизм для приема и обработки журналов событий от источников. Для каждого типа источников нужен свой плагин с уникальным номером (plugin_id).
Тип плагина — один из 4 типов, доступных в OSSIM — database, log, sdee, wmi.
Класс событий — все множество событий, генерируемых источником может быть разделено на разные классы. Выделение классов производится экспертным путем. Например, у источника в данном примере есть несколько классов событий — «type 1», «connect success», «suspicious activity». Идентификатор класса событий — «plugin_sid».
Для наглядности, приведена таблица ниже.
Таблица 1 — Источники и классы событий
Источник | Тип источника | Плагин | Тип плагина | Plugin_id | Класс события | Plugin_sid |
---|---|---|---|---|---|---|
Сервер БД 192.168.0.113 | БД mysql приложения «тест» | Mysql_logs | database | 9020 | type 1 | 1 |
connect success | 2 | |||||
suspicious activity | 3 |
Для решения задачи необходимо выполнить следующие шаги:
- Создать конфигурационный файл .cfg плагина OSSIM в папке /etc/ossim/agent/plugins/ (это основной конфигурационный файл, содержащий настройки подключения к БД и настройки парсинга получаемых событий);
- Создать конфигурационный файл .sql плагина OSSIM в папке /usr/share/doc/ossim-mysql/contrib/plugins/ (этот файл описывает типы новый плагин — его название, названия классов событий, их приоритезацию и др.) и загрузить информацию о новом плагине в базу плагинов OSSIM;
- Включить созданный плагин.
3.1. Конфигурационный файл .cfg
Данный конфигурационный файл необходим для настройки основных параметров плагина — способа получения журналов событий, учетные данные для подключения к источнику событий, парсер (если он есть), схемы нормализации данных, полученных из события.
Имя для данного файла можно выбрать произвольное, главное — чтобы расширение у файла было .cfg, например, db_logs.cfg, cisco-router.cfg и т.д. В данном примере файл называется db_logs.cfg.
Конфигурационный файл содержит ряд секций, каждая из которых обозначается: [<имя секции>].
Секция «DEFAULT»
В данной секции присутствует только один параметр — уникальный идентификатор плагина «plugin_id». У каждого плагина он свой и должен быть уникальным в рамках одной инсталляции OSSIM (не путать с идентификатором класса события plugin_sid, этот идентификатор уникален в рамках одного источника). Для создаваемых плагинов зарезервированы номера с 9000 по 10000, однако, чтобы убедиться точно свободен ли выбранный вами номер можно подключиться к серверу OSSIM по ssh, выбрать меню «Jailbreak» и, оказавшись в консоли выполнить:
grep «plugin_id=» /etc/ossim/agent/plugins/*.cfg |grep <искомый номер>
В выводе появится строка с именем плагина в котором используется выбранный номер идентификатора. Если вывод отсутствует, значит номер свободен и его можно использовать.
Секция «config»
В данной секции присутствуют множество параметров, отвечающих за подключение к источнику, тип плагина и т.д.
Параметр «type» говорит системе какого типа данный плагин. Их бывает два — «detector» и «monitor». Плагины типа «detector» предназначены для получения журналов событий от источников и выделения из них полезной информации (парсинга). Плагины типа «monitor» получают информацию от источников и проверяют состояние контролируемых параметров на момент выполнения запроса. Т.е. плагины типа «monitor» выполняют мониторинг различных показателей источников. Для выполнения нашей задачи необходимо выбрать тип плагина «detector».
Параметр «enable» отвечает за статус плагина (включен/выключен). Для работы плагина должен быть выставлен в значение «yes» (Спасибо, кэп!).
Параметр «source» задает тип источника и сообщает плагину какой из доступных в OSSIM механизмов должен использоваться для получения журналов событий, им может быть «database» (для баз данных mssql и mysql), «log» (для файлов), «sdee»(логи устройств cisco), «wmi» (журналы событий ОС Windows, получаемые по протоколу WMI). В нашем случае значение данного параметра должно быть установлено «database».
Параметры «source_type», «source_ip», «source_port», «user», «password», «db», «sleep» задают параметры подключения OSSIM к источнику для получения журналов событий. Параметр «source_type» может принимать два значения — «mysql» и «mssql» — в зависимости от БД источника. Остальные параметры задают настройки подключения к БД:
- «source_ip» — IP адрес сервера БД;
- «source_port» — порт по которому отвечает БД на сервере;
- «user» — пользователь (не забудьте дать ему разрешение на подключение к БД по сети, а также настроить межсетевой экран, если таковой имеется);
- «password» — пароль пользователя;
- «db» — название базы данных;
- «sleep» — интервал обращения OSSIM к БД в секундах.
- Параметры «process», «start», «stop» относятся к настройкам процессов, генерирующих журналы событий и находящихся локально, т.е. на сервере OSSIM. Для данной конфигурации эти поля должны быть оставлены пустыми.
Секция «translate»
Данная секция предназначена для того, чтобы назначать классы событиям источника. Классы назначаются в зависимости от значения определенного поля, извлеченного посредством парсинга из «сырого» события. Каждая строка данной секции имеет вид: <слово или словосочетание> = <код>. Для рассматриваемого примера, события, имеющие в выбранном поле (как выбирается поле читайте ниже в секции «query») значение «type 1» получают код »1», «connect success» — 2 и т.д.
Секция «start_query»
Секция описывает запрос (параметр «query»), с помощью которого получается идентификатор, относительно которого события будут рассматриваться как новые (не обработанные OSSIM). Например, в БД, используемой мной есть поле «event_id» — номер события, увеличивающийся на 1 у каждого нового события. Данный запрос получает номер (event_id) последнего события в БД на момент запроса и сохраняет его. События со значением этого «маркера» больше, чем значение, сохраненное в предыдущий раз, будут считаться вновь пришедшими и будут обрабатываться OSSIM.
Обратите внимание на то, что для плагина типа «database» параметр «regexp» должен обязательно быть оставлен пустым.
Секция «query»
В секции описывается получение и разбор (парсинг) данных из БД.
В первом параметре — «query» — находится запрос к БД, с помощью которого должна быть получена информация, позже помещаемая в поля схемы OSSIM. Схема представляет собой некоторое кол-во фиксированных полей, описывающих каждое событие (например, IP адреса источника и получателя, имя пользователя, порты, дополнительная служебная информация и прочее), попадающее в OSSIM. Подробнее со схемой можно ознакомиться в официальной документации к OSSIM.
В данном примере текст запроса «select event_id, date, event_type, username, message from data_table» возвращает все значения столбцов «event_id», «date», «event_type», «username», «message» из таблицы «data_table». Последняя часть запроса, а именно »…where event_id > $1;» как раз отсылает нас к секции «start_query» и сообщает OSSIM, что собрать нужно не ВСЕ события из БД, а только те, которые имеют метку события «event_id» больше, чем последнее ее сохраненное значение (которое было сохранено прошлым запросом).
Параметр «regexp» должен быть оставлен пустым, а «ref» равен »0».
Все параметры, следующие далее описывают нормализацию информации (т.е. распределение ее по полям схемы OSSIM), полученной запросом, указанным в параметре «query». Они имеют вид:
<наименование поля в схеме OSSIM> = <функция – не обязательный параметр><$номер поля запроса>.
Здесь необходимо отметить, что счет полей запроса начинается с »0» (Текст запроса: select event_id, date, event_type, username, message from data_table. Номера полей: 0 — «event_id», 1 — «date», 2 — «event_type», 3 — «username», 4 — «message»). Поэтому, в данном примере, в поле схемы OSSIM «username» попадает информация поля, следующего четвертым по счету в запросе, т.е. «username», но обращение к нему производится по $3. Поэтому, целесообразно первым в запрос «query» включать то самое уникальное значение — идентификатор события (как и сделано в примере — «event_id»).
Функции, используемые в этих параметрах нужны для:
- Передачи в OSSIM временной метки события в корректном формате;
- Определения класса события.
OSSIM умеет распознавать временную метку в различных форматах, подробнее об этом в документе «Alienvault Building Connector Plugins». Данная строка конфигурации:
date={normalize_date($1)}
сообщает OSSIM, о том, что в параметре »1» передается временная метка, которую нужно преобразовать к формату, используемому OSSIM. В случае, если формат передаваемой временной метки не соответствует поддерживаемым OSSIM, в поле «date» будет помещено текущее значение времени сервера OSSIM.
Выделение класса события. Выше мы уже говорили о том, что у событий данного типа источника есть 3 класса: «type 1», «connect success», «suspicious activity». В данном примере их определение связано со значением поля «event_type». Об этом говорит строка:
plugin_sid={translate($2)}
«Plugin_sid» — это идентификатор класса события (должен быть уникальный в рамках одного типа источника). Приведенная выше строка конфигурации сообщает OSSIM о том, что plugin_sid для каждого события будет вычисляться посредством сравнения значения, находящегося в поле »2» с данными, приведенными в секции «translate» данного конфигурационного файла. Т.е. событиям со значением «type 1» в поле «event_type» будет назначаться идентификатор «plugin_sid» со значением »1», событиям, у которых «event_type» = «suspicious activity» — plugin_sid = 2 и т.д. Далее этот идентификатор будет применяться в файле конфигурации .sql (см.ниже). Если класс событий только один, то можно не использовать функцию «translate», а просто указать plugin_sid=1.
Пример конфигурации .cfg:
[DEFAULT]
plugin_id=9020
[config]
type=detector
enable=yes
source=database
source_type=mysql
source_ip=192.168.0.113
source_port=3306
user=mysql_user
password=SQL_con_1
db=event_data
sleep=2
process=
start=no
stop=no
[translation]
type 1=1
connect success=2
suspicious activity=3
[start_query]
query="select event_id from data_table order by event_id desc limit 1;"
regexp=
[query]
query="select event_id, date, event_type, username, message from data_table where event_id > $1;"
#order by event_id desc limit 1
regexp=
ref=0
date={normalize_date($1)}
plugin_sid={translate($2)}
username={$3}
userdata1={$4}
userdata2={$2}
3.2. Конфигурационный файл .sql
Конфигурационный файл .sql, находящийся в папке /usr/share/doc/ossim-mysql/contrib/plugins, необходим для настройки отображения событий от источника в интерфейсе OSSIM, назначения величин Reliability и Priority различным классам событий источника (на основе которых рассчитывается величина риска).
По факту данный файл представляет собой инструкции по созданию необходимых для описания источника записей в БД OSSIM.
Пример файла .sql, созданного для данного примера приведен ниже.
Первые две сроки стирают все данные из базы, описывающие источник с указанным plugin ID, в примере — 9020 (этот номер должен соответствовать «plugin_id» из секции «Default» конфигурационного файла .cfg).
DELETE FROM plugin WHERE id="9020";
DELETE FROM plugin_sid WHERE plugin_id="9020";
Строка идущая следом описывает новый плагин — задает его «id» (соответствует «plugin_id» из .cfg файла), «type» (должен быть установлен в »1»), название (которое будет отображаться в интерфейсе OSSIM), и произвольное описание в поле «description»:
INSERT IGNORE INTO plugin (id, type, name, description) VALUES (9020, 1, "Mysql_logs", "Logs from mysql database");
Дальше идут строки, описывающие различные классы событий. Для каждого класса — отдельная строка. В строке задаются значения параметров «plugin_id», «sid» (должен соответствовать цифре, назначенной классу в разделе «translate» файла .cfg), category_id, subcategory_id (номер категории и подкатегории. Перечень категорий и подкатегорий можно посмотреть в файлах: /usr/share/ossim-taxonomy/alienvault-subcategory.sql и alienvault-categories.sql). Параметр «class_id» должен быть установлен в значение «null». В параметре «name» указывается название класса события, которое будет отображаться в интерфейсе OSSIM, параметры «reliability» и «priority» — целочисленные значения от 1 до 5.
INSERT IGNORE INTO plugin_sid(plugin_id, sid, category_id, subcategory_id, class_id, name, priority, reliability) VALUES (9020, 1, 11, 139, null, "Mysql logs: Type 1", 1, 1);
Полностью текст файла .sql (в примере он назван db_logs.sql):
DELETE FROM plugin WHERE id="9020";
DELETE FROM plugin_sid WHERE plugin_id="9020";
INSERT IGNORE INTO plugin (id, type, name, description) VALUES (9020, 1, "Mysql_logs", "Logs from mysql database");
INSERT IGNORE INTO plugin_sid(plugin_id, sid, category_id, subcategory_id, class_id, name, priority, reliability) VALUES (9020, 1, 11, 139, null, "Mysql logs: Type 1", 1, 1);
INSERT IGNORE INTO plugin_sid(plugin_id, sid, category_id, subcategory_id, class_id, name, priority, reliability) VALUES (9020, 2, 11, 139, null, "Mysql logs: Connection successfull", 1, 1);
INSERT IGNORE INTO plugin_sid(plugin_id, sid, category_id, subcategory_id, class_id, name, priority, reliability) VALUES (9020, 3, 11, 139, null, "Mysql logs: Suspicious activity", 1, 1);
3.3. Включение плагина
Для включения плагина необходимо добавить информацию о созданном плагине в БД OSSIM, выполнив скрипт-файл .sql, созданный на прошлом этапе, а затем активировать плагин.
Для добавления информации о плагине в БД нужно выполнить команду:
# ossim-db < /usr/share/doc/ossim-mysql/contrib/plugins/<имя файл.sql>
В данном примере:
# ossim-db < /usr/share/doc/ossim-mysql/contrib/plugins/db_logs.sql
Для активирования плагина нужно подключиться к серверу OSSIM по ssh, перейти в меню «Configure sensor» — «Configure Data Source Plugins», и в появившемся списке найти название плагина (оно соответствует полю «name» в конфигурационном файле .sql), установить рядом с ним «Х» нажатием клавиши пробел. Вернуться в главное меню, нажав несколько раз «ОК». В главном меню выбрать пункт «Apply» и «ОК» и дождаться рестарта сервисов OSSIM.
Плагин готов к работе.
Рисунок 1 — Главное меню OSSIM
Рисунок 2 — Меню «Configure sensor»
Рисунок 3 — Меню «Configure Data Source Plugins»
На рисунке ниже приведен пример отображаемых событий настроенного плагина в графическом интерфейсе OSSIM.
Рисунок 4 — Отображение событий в интерфейсе OSSIM
4. Диагностика и устранение ошибок
Для диагностирования неисправностей можно сделать следующее:
1) Проверить подключение с сервера OSSIM к серверу БД, откуда забираются журналы событий:
#mysql –u -p –h <адрес сервера БД>
После ввода пароля выбрать БД и выполнить запрос к ней, указанный в поле «query»:
mysql> use event_data;
mysql> select event_id, date, event_type, username, message from data_table;
2) Проверить, что записи о новом плагине присутствуют в БД OSSIM запросом:
# ossim-db
mysql> use alienvault;
mysql> select id,name from plugin where id=’<уникальный идентификатор плагина plugin_id>’;
3) Проверить лог-файл агента на предмет ошибок и тревожных сообщений:
# grep –E "Discarded|ERR|WARN” /var/log/alienvault/agent/agent.log
5. Дополнительные материалы
Официальные документы Alienvault по настройке плагинов:
Alienvault Building Collector Plugins
Creating new plugin