Sorry. This is for Russians only, so no English more.
Этот гист исключительно для русской аудитории. Здесь я сведу все советы по кастумизации OSSIM для работы с русским языком в одну инструкцию, понятную тем, кто этим языком пользуется в работе и жизни.
Некоторые предварительные пояснения:
Я буду использовать недокументированные фичи и некоторые собственные хаки, которые помогают бороться с уничтожением всех внесенных изменений при апдейте системы.
Для реализации хаков существуют два основных скрипта, которые лежат в дирректории
/usr/local/bin
и называются
check_my_config.py
и
check_mysql_config.py
соответственно. А еще в этой же директории обязан лежать файл с именем
my_ParserUtil.tail
который должен начинаться строкой
# my ParserUtil tail
(регистр имеет значение). Это файл предназначен для реализации дополнительных функций в плагинах собственной разработки. По смыслу он именно то, как называется, хвост, который приклеивается к файлу
/usr/share/alienvault/ossim-agent/ParserUtil.py
Позже поясню, почему я так поступил.
Эти скрипты здесь выложены отдельнымы файлами обязательно поместите их на место и обязательно дайте права на исполнение:
chmod 755 /usr/local/bin/check_mysql_config.py chmod 755 /usr/local/bin/check_my_config.py
Что делают эти скрипты? Первый проверяет, что файл
/etc/mysql/my.cnf
содержит директиву
!includedir /usr/local/etc/mysql/
и если ее нет, то дописывает в конец файла. Второй проверяет, что файл конфигурации плагинов содержит указание на использование кодировки для каждого из них и если его нет, то переписывает файл с указанием кодировки. По умолчанию ставится кодировка cp1251, но в файле есть «словарь исключений», где можно задать кодировки индивидуально. Вы можете поправить этот словарь, как вам надо. Кроме того, второй скрипт проверяет, что файл ParserUtil.py содержит «хвост» и если его там нет, то дописывает.
Начнем потихоньку ломать систему.
Первым делом мы должны установить в системе нужные нам русские локали, а именно UTF-8 и cp1251. Изначально они не установлены. Это делается легко и приятно с помощью команды
#dpkg-reconfigure locales
не устанавливайте русские локали в качестве системных. Это совершенно не нужно и может вылезти боком. Достаточно, чтобы они просто были. Апдейты OSSIM не меняют эти настройки. Можно к этому больше не возвращаться.
Еще одна вещь, которую можно сделать один раз. Конфигурация FreeTDS. FreeTDS используется в качестве драйвера для доступа к внешним БД в плагинах, которые читают данные из баз (database type plugins) вы должны исправить общую секцию настроек в конфигурационном файле
#/etc/freetds/freetds.conf [global] tds version = 7.0 client charset = UTF-8
Этот файл также не изменяется при апдейтах.
Теперь приступим к поправке mySQL
Для начала создадим файл mysql.cnf в каталоге /usr/local/etc/mysql (каталог тоже нужно создать)
# /usr/local/etc/mysql/mysql.cnf [client] default-character-set=utf8 [mysqld] collation-server = utf8_unicode_ci init-connect='SET collation_connection = utf8_unicode_ci' character-set-server = utf8
Теперь самое время проверить, что мы поместили в нужное место скрипт check_mysql_config.py и назначили ему права на исполнение. Если проверили то редактируем файл
/etc/init.d/mysql
добавляем запуск нашего скрипта в секцию «start» как показано здесь. Не перепутайте место 🙂
# # main() # case "${1:-''}" in 'start') sanity_checks; # Start daemon log_daemon_msg "Starting MySQL (Percona Server) database server" "mysqld" if mysqld_status check_alive nowarn; then log_progress_msg "already running" log_end_msg 0 else /usr/local/bin/check_mysql_config.py > /dev/null "${PERCONA_PREFIX}"/bin/mysqld_safe > /dev/null 2>&1 &
Готово дело. Можем дать с консоли команду /etc/init.d/mysql restart
Теперь займемся улучшением самого OSSIM.
Для этого в двух файлах
/etc/init.d/ossim-server и /etc/init.d/ossim-agent
вставляем одну строчку в одной и той же секции (они одинаковые):
d_start() { /usr/local/bin/check_my_config.py > /dev/null
Вот прямо так и ставим первой строкой в секции d_start().
Теперь достаточно дать команду /etc/init.d/ossim-agent restart
Зачем так сделано?
Дело в том, что по меньшей мере с версии 5 в файле конфигурации /etc/ossim/agent/config.cfg можно задать кодировку для каждого плагина простым добавлением конструкции |cp1251 в конце строки с декларацией плагина. Тогда русские буковки можно использовать как в самом тексте файла конфигурации данного плагина, напроимер в регулярных выражениях, так и в данных которые этот плагин обрабатывает. Но эта фича не только не документирована, но и не доделана до конца. При любом апдейте или при включении нового плагина с консоли, короче при любой операции ossim-reconfig, файл конфигурации перезапишется без указания параметра кодировки. По этой причине я и вставил такой вот хак. Последняя команда любого апдейта или реконфига это перезапуск сервисов, поэтому я вставил в скрипты инициации проверку и правку конфигурации. Это сильно облегчило мою жизнь.
Теперь о «хвосте».
Все дело в кастомных функциях, которые можно использовать в плагинах. Существует механизм создания файла с такими функциями и включения его в плагин. Однако он не документирован. В документации никак не описан допустимый синтаксис и только приведены примеры элементарных функций. Не ясно даже можно ли передать функции более одного параметра. Очень похоже, что нельзя. Не понятно, можно ли использовать в таких кастомных функциях объекты и методы из модулей питона, например открывать файлы. Позже я разберусь по исходному коду, как именно парсится файл с описанием кастомных функций и выясню эти вопросы, но пока я решил, что проще дописать собственные функции в файл ParserUtil.py, который содержит набор «стандартных» функций для плагинов.
Вот так и появился «хвост». С хвостом надо обращаться осторожно, все, что вы туда дописываете, надо тщательно отлаживать. И кстати, при написании кода, ни в коем разе не забывайте, что конец строки в linux — это lf, а не cr+lf, как в Windows. Это существенный вопрос. Если пишете код на компе с виндой, не забывайте убедиться в том, что файл сохранен с правильными концами строк. Это умеет делать и MS Visual Studio и FAR.
Пожалуй всё. Есть вопросы — задавайте.
Тексты скриптов я здесь конечно вставил, но удобнее все это смотреть на https://gist.github.com/ESGuardian
#/usr/local/bin/check_my_config.py #! /usr/bin/python # -*- coding: latin1 -*- import sys #import codecs import subprocess cfg_path = '/etc/ossim/agent/config.cfg' new_cfg_path = '/var/local/config.tmp' encoding_exceptions = {'wmi-monitor':'utf8'} my_encoding = 'cp1251' with open (cfg_path,'r') as f: conf = f.read() f.close start_flag = False continue_flag = True need_update = False out_lines=[] for line in conf.splitlines(): out_lines.append(line.strip()) if start_flag and continue_flag : if not '=' in out_lines[-1]: continue_flag = False elif not '|' in out_lines[-1]: key = out_lines[-1].split('=')[0] need_update = True if key in encoding_exceptions: out_lines[-1] = out_lines[-1] + '|' + encoding_exceptions[key] else: out_lines[-1] = out_lines[-1] + '|' + my_encoding if '[plugins]' in out_lines[-1]: start_flag = True if need_update : with open(new_cfg_path,'w') as f: for line in out_lines: f.write(line + '\n') f.close cmd = '/bin/cp -f /etc/ossim/agent/config.cfg /etc/ossim/agent/config.cfg.myreconfig.bak' p = subprocess.Popen (cmd, shell=True) p_stutus = p.wait() cmd = '/bin/cp -f /var/local/config.tmp /etc/ossim/agent/config.cfg' p = subprocess.Popen (cmd, shell=True) p_stutus = p.wait() # check PerserUtil.py pu_need_update = False with open ('/usr/share/alienvault/ossim-agent/ParserUtil.py', 'r') as f: pu=f.read() f.close() if not 'my ParserUtil tail' in pu: cmd = 'cp -f /usr/share/alienvault/ossim-agent/ParserUtil.py /usr/share/alienvault/ossim-agent/ParserUtil.py.myreconfig.bak' p = subprocess.Popen (cmd, shell=True) p_stutus = p.wait() cmd = 'cat /usr/local/bin/my_ParserUtil.tail >> /usr/share/alienvault/ossim-agent/ParserUtil.py' p = subprocess.Popen (cmd, shell=True) p_stutus = p.wait()
—
# /usr/local/bin/check_mysql_config.py #! /usr/bin/python # -*- coding: latin1 -*- import sys #import codecs import subprocess cfg_path = '/etc/mysql/my.cnf' with open (cfg_path,'r') as f: conf = f.read() f.close if not '!includedir /usr/local/etc/mysql' in conf: cmd = 'cp -f /etc/mysql/my.cnf /etc/mysql/my.cnf.myreconfig.bak' p = subprocess.Popen (cmd, shell=True) p_stutus = p.wait() with open (cfg_path,'a') as f: f.write('\n!includedir /usr/local/etc/mysql\n') f.close
—