Монитор журнала аудита ORACLE
Что это? Зачем это?
Всё началось с желания получить на OSSIM более приличный журнал доступа к СУБД ORACLE. Более приличный, чем получается по сислогу. Это значит, что нужно читать его из базы данных, из вьюхи DBA_AUDIT_TRAIL
. Но, вот беда, database плагины OSSIM не умеют читать из БД ORACLE. Точнее говоря, чтобы это делать, надо прикрутить модуль cx_Oracle
для питона. А для этого, в свою очередь, надо установить клиента Oracle.
Тогда мне подумалось, что будет гораздо интереснее и полезнее сделать совсем отдельную систему, которая будет не только забирать и хранить лог, но и производить некоторую собственную обработку событий, а в OSSIM отдавать уже свой собственный лог, содержащий практически полезные алерты. Тем более, что OSSIM и так нагружается очень сильно. В результате появился вот этот ORAMON.
Принцип работы
Вся система представляет собой базу данных MySQL и скрипт на питоне oramon.py, который читает DBA_AUDIT_TRAIL
с сервера Oracle, помещает его в таблицу raw, в базу oramon MySQL и делает кое-какой дополнительный анализ событий. Пока анализируются только события LOGON/LOGOFF и SET ROLE. Скрипт отслеживает следующие события:
- Новый пользователь.
- Новый хост (новое место подключения к базе).
- Новая учетная запись Oracle использована для подключения.
- Новая роль использована данным пользователем.
- Одновременное подключение с двух и более хостов (отслеживаются незакрытые сессии).
- Смена пользователем хоста подключения.
- Подключение или использование роли после длительного перерыва (более трех недель)
- Много (более 10) и очень много (более 100) ошибок подключения или установки роли.
Соответственно, информация об истории различных событий накапливается в разных таблицах, где ее можно посмотреть. Для удобства сделаны несколько представлений. Главное называется ossim_log
— это то, что должен читать плагин OSSIM. А еще есть failures
— это информация об ошибочных событиях, userhost
— это информация о том, кто, откуда и когда подключался, и аналогичные представления os_ora_users
и user_roles
.
Подробно всю структуру можно увидеть в файле oramon_empty.sql
, в репозитарии этого проекта на bitbucket.
Как установить и запустить
Прежде всего потребуется LAMP сервер. На любой системе. Я настоятельно рекомендую установить phpMyAdmin, с ним будет удобнее, это пока очень предварительная версия. Затем необходимо установить на него клиента Oracle и модуль cx_Oracle для питона. Эта операция может оказаться не очень простой. Я делал на виртуалке с RHEL7, пришлось вручную искать пару пакетов для разрешения зависимостей. Инструкции по этому поводу давать нет смысла, поскольку в разных системах делается разными способами.
Важно, когда вы делаете LAMP в конфигурации MySQL прописать принудительную установку кодировки utf8 для клиентских подключений. Это необходимо для OSSIM, который не умеет указывать charset в параметрах соединения. Речь идет вот об этих параметрах:
[client] default-character-set=utf8 [mysqld] skip-character-set-client-handshake collation-server = utf8_unicode_ci init-connect='SET collation_connection = utf8_unicode_ci' character-set-server = utf8
В какой конфиг это вносить, зависит от системы. В RHEL это вообще да разных конфига.
Установить саму базу данных можно скриптом oramon_empty.sql
.
Кроме установки клиента Oracle, понадобится еще конфигурация путей к его библиотекам и конфигурация TNS (параметры соединения). Это опять же зависит от системы. У меня в RHEL7 это сделано так:
#!/bin/bash LD_LIBRARY_PATH="/usr/lib/oracle/12.1/client64/lib:${LD_LIBRARY_PATH}" export LD_LIBRARY_PATH TNS_ADMIN="/etc/oracle" export TNS_ADMIN ORACLE_HOME="/usr/lib/oracle/12.1/client64/lib" export ORACLE_HOME
И в /etc/oracle лежит файл tnsnames.ora со списком параметров соединений с серверами Oracle.
Перечень соединений вы также должны будете внести в базу oramon в таблицу connections. Структура таблицы такая:
-- -- Структура таблицы `connections` -- DROP TABLE IF EXISTS `connections`; CREATE TABLE IF NOT EXISTS `connections` ( `id` int(4) NOT NULL, `user` varchar(16) DEFAULT NULL, `passwd` varchar(16) DEFAULT NULL, `tns_name` varchar(32) DEFAULT NULL, `bookmark_type` enum('num','time') NOT NULL DEFAULT 'time', `bookmark_num` int(11) DEFAULT NULL, `bookmark_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
user, passwd
— это параметры логона для tns_name
указанного в файле tnsnames.ora. Разумется такой юзер должен быть создан в Oracle и у него должны быть права приконнектиться и прочитать таблицу (точнее вьюху) DBA_AUDIT_TRAIL
.
bookmark_type
— это способ отметки последней обработанной записи (по номеру или по времени), который будет использоваться для чтения из данной БД Oracle. А дальше, как понятно, текущая метка.
Прямо сейчас oramon.py не проверяет параметр bookmark_type
и считает, что записи отбираются по времени. Я оставил этот параметр на будущее. Внести записи в таблицу удобно с помощью phpMyAdmin.
В MySQL надо создать пользователя oramon с правами на базу oramon (select, isnert, update, delete). Пароль надо вписать непосредственно в файл oramon.py, в строку:
# ---- init ---- (dbhost, dbuser, dbpass, dbschema, dbcharset)=('localhost', 'oramon', 'your_oramonpass', 'oramon', 'utf8') # MySQL connection params
Это в самом начале файла. Пока так.
oramon.py не демонизирует себя. Опять же, это пока. Когда я сочту эту штуку достаточно полезной, я, возможно, вставлю демонизацию. Сейчас я использую cron.
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/oracle/12.1/client64/lib TNS_ADMIN=/etc/oracle ORACLE_HOME=/usr/lib/oracle/12.1/client64/lib LD_LIBRARY_PATH=/usr/lib/oracle/12.1/client64/lib MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed */5 * * * * oramon /home/oramon/bin/oramon.py
обратите внимание на заголовок crontab, там должны быть указаны пути необходимые для работы клиента Oracle.
И на конец, для работы с OSSIM понадобится создать в MySQL пользователя с правом коннектиться к серверу и читать вьюху ossim_log
из БД oramon. А для OSSIM понадобится вот такой маленький плагин:
# Alienvault plugin # Author: Eugene Sokolov esguardian@outlook.com # Plugin oramon id:9009 version:- # Last modification: 2016-05-04 # # Plugin Selection Info: # ESGuardian:oramon:-:n # # # [DEFAULT] plugin_id=9009 [config] type=detector enable=yes source=database source_type=mysql source_ip=xxx.xxx.xxx.xxx source_port=3306 user=dbusername password=dbuserpassword db=oramon sleep=60 process= start=no stop=no [start_query] query="SELECT id FROM ossim_log ORDER BY id DESC LIMIT 1" regexp= [query] query="SELECT id,timestamp,alert_code,alert,uname,host,host_ip,ora_user,ora_role,message,raw_id FROM ossim_log where id > $1 ORDER BY id" regexp= ref=0 date={normalize_date($1)} plugin_sid={$2} src_ip={$6} dst_ip= username={$4} userdata1={$5} userdata2={$7} userdata3={$8} userdata4={$9} # Payload log={$0}, Time: {$1}, Alert_code: {$2}, Alert: {$3}, User: {$4}, Host: {$5}, Host_ip: {$6}, ORA_User: {$7}, ORA_Object {$8}, Message: {$9}, RAW_id: {$10}
Собственно, это всё. Дальше я буду потихоньку развивать это дело.