OSSIM и USM: баг в USM и способ обхода

Вот и появился повод вновь написать об OSSIM, впрочем скорее о его коммерческом собрате AlienVault USM. Повод не очень приятный. В AV USM 5.4 валятся плагины, обрабатывающие логи в кодировке utf8 (по крайней мере русские логи). Но это повод. Заметка будет не только об этом. Вообще о разнице между коммерческой и свободной версиями.

Но, пока, о баге.

Как он проявляется? После перезапуска ossim-agent плагины, читающие лог-файлы в кодировке utf8 перестают работать. Никаких сообщений об ошибках в логах агента вы не увидите, даже если включите режим debug. Плагин тихо умирает на этапе открытия лог-файла. После пристального всматривания и (нельзя, конечно, но дело чрезвычайное) частичной декомпиляции кода, становится ясно, что дело в «закладке». Агент OSSIM держит закладки (bookmarks) на все читаемые плагинами логи, чтобы помнить где он остановился. И очень похоже, что плагин сваливается на попытке прочитать закладку, еще до того, как открывает файл. В open source версии это было бы легко найти и поправить, но с коммерческой версией всё сложнее. Коммерческий код отличается от свободного, местами радикально. Это не тот случай, когда коммерческий продукт — это open source с технической поддержкой. И в части способа хранения закладок тоже отличается. Свободная версия хранит закладки в текстовом файле, а коммерческая в Редисе. Это влияет на производительность системы. Где именно они напортачили, я пока не понял. Редис индифферентен к кодировке, он байты хранит, ему пофигу, что за байты. Похоже, проблема в том, что когда закладка считывается из Редиса она не может быть декодирована в utf8. Неверная последовательность байтов. Видимо она корежится где-то при записи в Редис. Пока не знаю где. Да и если узнаю, толку мало. Всё равно это проприетарный код, поправить его нельзя. В лучшем случае можно будет написать в AlienVault подробное письмо и они когда-нибудь посмотрят в эту сторону. Проблема именно с utf8, с cp1251 такой проблемы нет, поскольку она байтовая.

Способ обхода.

Перед стартом агента ossim мы будем вносить правку в конфиг нашего плагина и в конфиг rsyslog для того, чтобы создать новый лог-файл. Он должен быть совсем новый, то есть иметь другое имя. Тогда агент не будет пытаться использовать закладку. Для этого мы используем мой /usr/local/bin/jailbreak/check_encoding.py, который создается после применения моего скрипта jailbreak-ossim-for-rus.sh. Это скрипт русификации OSSIM и USM. Подробнее о нем в статье OSSIM. Обзор. После джайлбрейка, вызов этого самого check_encoding вставляется в скрипт инициализации агента ossim. Его задача восстановить параметры кодировки плагинов, если при апдейте системы они были стерты из файла конфигурации агента. Мы нагрузим его дополнительной работой. просто вставим в конец файла вот такой код:

import datetime
kasper_path = '/etc/ossim/agent/plugins/kasper_rus.cfg'
rsyslog_conf_path ='/etc/rsyslog.d/kasper.conf'
new_kasper_log = 'kasper-' + datetime.datetime.now().strftime("%Y-%m-%d.%H.%M.%S") + '.log'
cmd = "sed -i 's:location=/var/log/kasper.*:location=/var/log/" + new_kasper_log + ":' " + kasper_path
p = subprocess.Popen (cmd, shell=True)
p_stutus = p.wait()
cmd = "sed -i 's:-/var/log/kasper.*:-/var/log/" + new_kasper_log + ";kaspertpl:' " + rsyslog_conf_path
p = subprocess.Popen (cmd, shell=True)
p_stutus = p.wait()
cmd = 'service rsyslog stop'
p = subprocess.Popen (cmd, shell=True)
p_stutus = p.wait()
cmd = 'service rsyslog start'
p = subprocess.Popen (cmd, shell=True)
p_stutus = p.wait()

Такой код надо вставить для всех плагинов типа ParserLog, использующих кодировку utf8. Для cp1251 такой проблемы нет. Так же ее нет с плагинами типа ParserDatabase, поскольку там не используются текстовые закладки.

Строка правки конфига rsyslog у вас может отличаться. У меня просто соответствующий конфиг для этого плагина выглядит так:

$Template kaspertpl,"%rawmsg:R,ERE,1,BLANK:.+#011.+#011.+#011.+#011.+#011.+#011.+#011.+#011.+#011.+#011.+#011.+#011#011(.+)#011.+--end%\n"

if $syslogtag contains 'MSWinEventLog' and $rawmsg contains 'Kaspersky Event Log' then {        
    -/var/log/kasper-2017-07-08.20.16.40.log;kaspertpl
    stop
}

#Stop processing the message after it was written to the log

Как нетрудно догадаться, это вырезка из сообщения SNARE по заданному шаблону.
Вот и всё.

И немного о разнице между OSSIM и USM

Как я уже сказал выше, разница есть. USM это не «OSSIM с технической поддержкой», это существенно другой продукт. Другой на уровне кода. Код переписан для повышения производительности всей конструкции. Например, уже упомянутый Redis Database вместо файлов. Но, не только это. Еще поддержка multiprocessing и threading. В OSSIM этого нет. Даже при поверхностном взгляде на код, видно, что очень много сделано именно для повышения производительности системы. На практике эти изменения хорошо видны. Производительность USM действительно несравнимо выше. Разница огромная. Это плюс. А вот ошибки в коде — это минус. В AlienVaut никак не соберутся сделать свой продукт действительно интернациональным. С utf8 у них беда просто всюду.

И я в своем репозитории немножко покопался

Выложил туда плагин для Касперского, как раз вот этот, который дебажил. Ну, еще там перетасовал файлы чуть-чуть.
Репозиторий здесь: ESGuardin OSSIM on gitHub

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s