Створення плагіна 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
Для вирішення задачі необхідно виконати наступні кроки:
  1. Створити конфігураційний файл .cfg плагіна OSSIM в папці /etc/ossim/agent/plugins/ (це основний конфігураційний файл, що містить налаштування підключення до БД та налаштування парсинга одержуваних подій);
  2. Створити конфігураційний файл .sql плагіна OSSIM в папці /usr/share/doc/ossim-mysql/contrib/plugins/ (цей файл описує типи новий плагін – його назва, назви класів подій, їх пріоритезацію та ін) і завантажити інформацію про новому плагіні в базу плагінів OSSIM;
  3. Увімкнути плагін створений.
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»).
Функції, що використовуються в цих параметрах потрібні для:
  1. Передачі в OSSIM тимчасової мітки події у коректному форматі;
  2. Визначення класу події.
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), і довільний опис в полі «опис»:
INSERT IGNORE INTO plugin (id, type, name, description) VALUES (9020, 1, "Mysql_logs", "from Logs mysql database");

Далі йдуть рядки, що описують різні класи подій. Для кожного класу – окремий рядок. У рядку задано значення параметрів «plugin_id», «sid» (має відповідати цифрі, призначеної класу в розділі «translate» файлу .cfg), category_id, subcategory_id (номер категорії та підкатегорії. Перелік категорій і підкатегорій можна подивитися в файлах: /usr/share/ossim-taxonomy/alienvault-вкладені категорії.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", "from Logs 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), встановити поруч з ним «Х» натисканням клавіші пробіл. Повернутись в головне меню, натиснувши кілька разів «ОК». У головному меню вибрати пункт «Застосувати» і «ОК» і дочекатися рестарту сервісів OSSIM.
Плагін готовий до роботи.

Малюнок 1 – Головне меню OSSIM


Малюнок 2 – Меню «Configure sensor»


Малюнок 3 – Меню «Configure Data Source Plugins»

На малюнку нижче наведений приклад відображуваних подій налаштованого плагіна в графічному інтерфейсі OSSIM.

Малюнок 4 – Відображення подій в інтерфейсі OSSIM

4. Діагностика і усунення помилок

Для діагностування несправностей можна зробити наступне:
1) Перевірити підключення до сервера OSSIM до серверу БД, звідки забираються журнали подій:
#mysql –u <username> -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
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.