Активные списки в OSSIM

Доброго времени суток, уважаемые читатели!

В этой статье хочу рассказать о реализации функционала активных списков, или как его называют на-английском — «active lists», в системах OSSIM/USM. Сперва пару слов о том, что же я имею ввиду, говоря «активные списки».

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

В решении этой задачи помогут «активные списки». В момент появления определенного события (в нашем случае это событие пользовательского входа в А), определенное поле из этого события (имя пользователя) помещается в активный список. Другое событие (в нашем случае это событие выхода пользователя из приложения А) удаляет поле (имя пользователя) из активного списка. Кроме этого, в момент срабатывания определенного правила (в нашем случае правило срабатывает при входе пользователя на сервер Б) происходит проверка наличия имени пользователя, выполняющего вход на Б в активном списке. Вся процедура изображена на рисунке ниже.

active-lists-rus-1

Рис.1 – Работа Списка

Ниже я опишу реализацию функционала активных списков (далее — Списков) в OSSIM/USM при помощи скрипта на python, трех корреляционных директив и политик и специально разработанного плагина.
В этой статье я использую функционал Списков для отслеживания подключений пользователей к системам. Однако, в Списки можно помещать любую информацию: имена файлов, IP адреса, номера портов и все-все-все.

  1. Ход работы

На моем демонстрационном стенде Списки работают следующим образом(рисунок 3):

  • Пользователь “root” подключается по ssh на сервер 192.168.2.30;
  • Политика “Add to logged users list on BCKP” использующая корреляционную директиву “User logon on BCKP” запускает скрипт active_list_manager.py следующим образом:
# ./active_list_manager_py add logins_list $USERNAME

в результате работы скрипта создается файл “logins_list” и в него добавляется имя пользователя, переданное в переменной $USERNAME;

  • Пользователь(любой) подключается по SSH к серверу 192.168.10.2;
  • Политика “Check logged users list on MAIL” использующая корреляционную директиву “User logon on MAIL” запускает скрипт active_list_manager.py следующим образом:
# ./active_list_manager_py check logins_list $USERNAME

Если имя пользователя было найдено в logins_list скрипт создает syslog сообщение следующего вида:

Sep 6 15:40:25 siem active_list_log: Match |List:logins_list |Value:root
  • Файл, в который попадает сообщение, читает созданный в OSSIM плагин “active_list_monitor” в результате чего в графическом интерфейсе OSSIM/USM появляется событие вида:

2

Рис. 2 – Совпадения со Списком

Можно настроить alert для данного типа сообщений;

  • Пользователь, выполнивший вход на 192.168.2.30 (в пункте 1) закрывает сессию с 192.168.2.30;
  • Политика “Remove user from logged users list on BCKP” использующая директиву “User logout from BCKP” запускает скрипт active_list_manager.py следующим образом:
# ./active_list_manager_py del logins_list $USERNAME

в результате работы скрипта $USERNAME удаляется из “logins_list”.

active-lists3

Рис. 3 – Схема лабораторного стенда

  1. Необходимые ресурсы

Для решения поставленной задачи были созданы следующие объекты:

  • Корреляционные директивы (directives):
    • “ User logon on BCKP “;
    • “ User logon on MAIL ”;
    • “ User logout from BCKP ”;
  • Политики:
    • “ Add to logged users list on BCKP ”;
    • “ Check logged users list on MAIL ”;
    • “ Remove user from logged users list on BCKP ”;
  • Скрипт “active_list_manager.py”;
  • плагин “active_list_monitor”.

 

  1. Корреляционные директивы

Созданные директивы приведены на рисунке ниже.
Основные параметры директивы “User logon on BCKP”:
DATA SOURCE – AlienVault HIDS-authentication_success
EVENT TYPE – 5501 (говорящий о событии успешного входа)
Я поместил объект “backup” в поле “TO”. IP адрес этого объекта — 192.168.2.30.
Таким образом, эта директива срабатывает когда происходит успешный вход пользователя на 192.168.2.30.
Основные параметры директивы “User logout from BCKP”:
DATA SOURCE – AlienVault HIDS-syslog
EVENT TYPE – 5502 (закрытие сессии)
Для этой директивы я поместил объект “backup” в поле “FROM”.
Директива срабатывает, когда пользователь закрывает сессию с 192.168.2.30.
Основные параметры директивы “User logon on MAIL”:
DATA SOURCE – AlienVault HIDS-authentication_success
EVENT TYPE – 5501 (успешный вход на сервер)
Я поместил объект “mail” в поле “TO”. Его IP адрес — 192.168.10.2.
Эта директива срабатывает когда пользователь выполняет вход на сервер 192.168.10.2.

4

Рис. 4 – Корреляционные директивы

  1. Политики

Политики предназначены для запуска скрипта “active_list_manager.py” с различными параметрами в момент срабатывания соответствующей директивы.
Когда директива, включенная в группу источников (DS group), используемую в политике, срабатывает, выполняется действие, указанное в политике (“policy action”). Это действие выполняет запуск скрипта и передает ему параметры из события.
Настройки, выполненные для каждой из трех политик включают в себя:

  • создание новой группы источников (DS group) на основе соответствующей директивы;
  • создание действия, выполняемого политикой – «policy action».

Политика “Add to logged users list on BCKP” использует директиву “User logon on BCKP“, включенную в одноименную группу «DS group» и действие “Add user to active list”. Это означает, что в случае срабатывания директивы (пользователь выполнил вход на BCKP) политика запускает соответствующее действие — “Add user to active list”.
Политика “Remove user from logged users list on BCKP” использует директиву “User logout from BCKP “, включенную в одноименную  «DS group» и действие “Remove user from active list”. Когда срабатывает директива, (пользователь закрывает сессию с BCKP) выполняется действие “Remove user from active list”.
Политика “Check logged users list on MAIL” использует директиву “User logon on MAIL “ посредством одноименной DS group и действие “Check user in active list”. Когда срабатывает директива, (пользователь выполнил вход на MAIL) выполняется действие “Check user in active list”.
Пример настройки политики приведен на рисунке ниже (для политики “Add to logged users list on BCKP”). Остальные политики настраиваются аналогичным образом, только в них используются другие DS groups и действия – «policy actions».

5

Рис.5 – Пример политики

       4.1  Группы DS Groups

Для создания группы DS (data source) Group перейдите в меню “Configuration” – “Threat intelligence” – “Policy” – “Data source”. Нажмите на кнопку “Add new group” в левом верхнем углу окна. Введите имя группы в соответствующее поле (в этом примере оно совпадает с названием директивы). Нажмите кнопку “ADD BY EVENT TYPE” и введите ключевое слово (часть названия) директивы (я ввел “BCKP”). Нажмите “Search”. В появившейся таблице поставьте галочку рядом с нужным источником и нажмите “Add Selected”. После этого нажмите “Update”. Подробнее на рисунке ниже.

6

Рис.6 –DS Group

       4.2  Действия, выполняемые политиками

Чтобы создать действие, которое будет выполняться политикой перейдите в меню “Configuration” – “Threat intelligence” – “Policy” – “Actions”.  Нажмите кнопку “New” и заполните поля, как показано на рисунке ниже. На рисунке изображено создание действия “Add user to active list”. Остальные действия создаются аналогичным образом с использованием параметров перечисленных ниже.
Общие для всех действия параметры: для “Add user to active list”, “Remove user from active list” и “Check user in active list” используйте TYPE – “execute action”. Поля NAME и COMMAND у каждого действия свои уникальные. В поле COMMENT можно написать что угодно.
Для действия “Add user to active list” значение поля COMMAND — “python /usr/share/ossim/scripts/active_list_manager.py add logins_list USERNAME”
Задача этой команды – запуск скрипта с параметрами, которые добавят значение поля USERNAME из события в Список “login_list”.
Для действия “Remove user from active list” значение поля COMMAND — “python /usr/share/ossim/scripts/active_list_manager.py del logins_list USERNAME”
Задача – запуск скрипта с параметрами, удаляющими USERNAME из Списка “login_list”.
Для действия “Check user in active list” значение поля COMMAND — “python /usr/share/ossim/scripts/active_list_manager.py check logins_list USERNAME”
Задача – запуск скрипта с параметрами, проверяющими наличие значения поля USERNAME из события в Списке “login_list”. В случае успеха, скрипт создаст syslog сообщение.

7

Рис.7 – Действия, выполняемые политиками

  1. Скрипт “active_list_manager.py”

Данный скрипт предназначен для добавления, удаления и проверки наличия имени пользователя в Списке. Конечно, он применим не только для имен пользователей, но также и для любых данных, которые вы можете включить в Список (IPадреса, имена файлов и хостов и т.д.).
Синтаксис, используемый скриптом следующий:

# active_list_manager.py <add|del|check list name username

Использовать его можно, например, вот так:

# active_list_manager.py add logins_list mario

Тем самым мы добавили “mario” в Список “logins_list”.
Если запускать скрипт с ключом “check”, то происходит проверка переданного значения на присутствие в Списке. Если совпадение найдено, то скрипт создает syslog сообщение уровня LOCAL5. Сообщение имеет следующий формат:

Timestamp hostname active_list_log: Match |List:list_name |Value:Value

Пример:

Sep  7 15:57:00 siem active_list_log: Match |List:user_list |Value:alex

Файл, в который попадает это сообщение, считывается и парсится плагином агента OSSIM, описанном в следующем разделе.
Листинг скрипта “active_list_manager.py” ниже:

#!/usr/bin/python
import sys
import os
import syslog

listfile="/usr/share/ossim/scripts/"+sys.argv[2]

if len(sys.argv) <> 4:
   print "Quit due to incorrect syntax.\nPlease check syntax:\nactive_list_manager.py (add|del|check)  <variable1,variable2,...variableN>"
   sys.exit()
if sys.argv[1] == "add":
   open(listfile, 'a').close()
   file = open(listfile, 'r+')
   lines = file.readlines()
   file.seek(0)
   file.truncate()
   for line in lines:
      if not line.startswith(sys.argv[3].split(",")[0]):
         file.write((line))
   for key_value in sys.argv[3].split(","):
      file.write((key_value+' '))
   file.write(('\n'))
   file.close()
elif sys.argv[1] == "del":
   if ',' in sys.argv[3]:
      print "Quit due to incorrect syntax.\nOnly one variable allowed for delete action.\nPlease check syntax:\nactive_list_manager.py (add|del|check)  <variable1,variable2,...va riableN>"
      sys.exit()
   file = open(listfile, 'r+')
   lines = file.readlines()
   file.seek(0)
   for line in lines:
      if not sys.argv[3] in line.split():
         file.write(line)
   file.truncate()
   file.close()
elif sys.argv[1] == "check":
   if ',' in sys.argv[3]:
      print "Quit due to incorrect syntax.\nOnly one variable allowed for delete action.\nPlease check syntax:\nactive_list_manager.py (add|del|check)  <variable1,variable2,...va riableN>"
      sys.exit()
   file = open(listfile, 'r')
   lines = file.readlines()
   file.close()
   for line in lines:
      if sys.argv[3] in line.split():
         print "found a match in:", line
         syslog.openlog( 'active_list_log', 0, syslog.LOG_LOCAL5 )
         syslog.syslog( ('Match |List:' + sys.argv[2] + ' |Value:' + sys.argv[3]) )
else:
   print "Quit due to incorrect syntax.\nPlease check syntax:\nactive_list_manager.py (add|del|check)  <variable1,variable2,...variableN>"
   sys.exit()

Скрипт следует разместить в /usr/share/ossim/scripts
Можно разместить его и в другой папке, но тогда нужно будет его немного подредактировать. Скрипт можно протестировать из консоли, например, вот так:

# active_list_manager.py add logins_list mario

Это создаст файл “logins_list” в рабочей папке скрипта (/usr/share/ossim/scripts) и добавит “mario” в этот файл.

  1. Плагин “active_list_monitor”

Этот плагин читает файл журнала в который пишет сообщения скрипт. Когда найдено соответствие в списке, скрипт передает сообщение rsyslog демону с меткой LOCAL5. Демон rsyslog настроен на запись всех сообщений с меткой LOCAL5 в файл. В данной статье это /var/log/active_list_alerts.log
Для настройки описанной конфигурации создадим новый файл (назовем его active_list_alerts.conf) в папке /etc/rsyslog.d/. Содержимое файла:

local5.* -/var/log/active_list_alerts.log
~

После чего перезапустим rsyslog командой /etc/init.d/rsyslog restart
Ниже приведен листинг файла .cfg созданного плагина:
active_list_monitor.cfg

[DEFAULT]
plugin_id=9005

[config]
type=detector
enable=yes
source=log
location=/var/log/active_list_alerts.log
create_file=false
process=rsyslogd
start=no
stop=no
startup=/etc/init.d/rsyslog start
shutdown=/etc/init.d/rsyslog stop

[translation]
Match=1

[active_list - 01]
event_type=event
regexp=(?P<date>\w+\s+\d+\s+\d+\:\d+\:\d+)\s+(?P<sensor>\S+)\s+\S+\s+(?P<sid>\S+)\s+\S+\:(?P<list_name>\S+)\s+\S+\:(?P<username>\S+)
date={normalize_date($date)}
device={resolv($sensor)}
plugin_sid={translate($sid)}
username={$username}
userdata1={$list_name}

Файл следует поместить в /etc/ossim/agent/plugins и назвать, например, active_list_monitor.cfg. Расширение файла обязательно должно быть “cfg”, это важно!
Ниже приведен листинг файла .sql, который добавляет в БД ossim информацию о новом плагине:

# active_list_monitor.sql
DELETE FROM plugin WHERE id = "9005";
DELETE FROM plugin_sid where plugin_id = "9005";
INSERT IGNORE INTO plugin (id, type, name, description) VALUES (9005, 1, 'Active list monitor', 'Monitoring plugin for active lists functonality');
INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name) VALUES (9005, 1, NULL, NULL, 'Active list Match detected');

Его можно создать в любом месте файловой системы, однако рекомендуется .sql файлы помещать в /usr/share/doc/ossim-mysql/contrib/plugins/
Добавим информацию о плагине в БД ossim следующей командой:

# ossim-db < active_list_monitor.sql

И в завершение всего включите плагин через графический или консольный интерфейс OSSIM. Подключившись по ssh к серверу OSSIM перейдите в меню “Configure sensor” – “Configure Data Source Plugins”. Отметьте в списке новый плагин. Нажмите “OK” – “Back” – “Apply all changes”.

После того как сервер перезапустится все должно работать.

  1. Резюме

Результатом проделанной работы является следующее сообщение в интерфейсе OSSIM всякий раз, когда пользователь, подключившийся по ssh к BCKP выполняет подключение по ssh к MAIL.

8

Рис.8 – Пример уведомления

Для данного события можно настроить срабатывание Alert’а и, например, отсылку письма-оповещения или чего-то более жестокого. Например, выполнение принудительного отключения пользователя.