Обработка логов MS TMG-2010 на OSSIM

Да, TMG — закончил свою жизнь, как думает Microsoft, но сисадмины огромного количества больших и маленьких компаний верят в жизнь после смерти. И с этим фактом придется мириться. Займемся интеграцией TMG и Open Source SIEM (OSSIM). И постараемся извлечь из логов TMG кое-какую интересную для ИБ информацию.

Отправка логов с TMG на OSSIM.

Прежде всего, следует настроить TMG на сохранение логов в формате w3c в текстовом виде. Затем решить, чем вы их отправите на OSSIM по протоколу syslog. Бесплатных способов в сущности два: syslog-ng и snare epilog. Я выбрал последний, как более привычный для меня. Справедливости ради, надо заметить, что snare epilog давно никем не поддерживается и SNARE Alliance будет настойчиво вам советовать купить у них SNARE Enterprise. Они забросали меня письмами-страшилками о том, какие страшные беды упадут на мою голову, если я буду продолжать использовать open source snare epilog.  Поэтому исходники snare я спрятал в надежном месте. Чтобы долго не лазить по гуглу, вот две нужные сылки:

Агент SNARE Epilog:
http://sourceforge.net/projects/snare/files/Epilog%20for%20Windows/1.6.0/
Установка агента и настройка TMG:
http://tmgblog.richardhicks.com/2010/04/04/configuring-syslog-on-isa-and-tmg-with-splunk-log-management/

Сервер OSSIM принимает syslog на порт UDP 514. На сервере OSSIM тоже кое что подкручиваем.

Разборка по источникам в rsyslog:

#/etc/rsyslog.d/tmg.conf
if ($fromhost-ip == '<TMG_ip>' and $rawmsg contains 'ISAFWSLog') then /var/log/tmg-fws.log
if ($fromhost-ip == '<TMG_ip>' and $rawmsg contains 'ISAWebLog') then /var/log/tmg-web.log

Ротация логов:

#/etc/logrotate.d/tmg-log-rotate
/var/log/tmg-fws.log /var/log/tmg-web.log{
daily
rotate 5
compress
missingok
notifempty
copytruncate
create 640 avapi alienvault
}

Делаем плагины для обработки.

Логи пошли писаться. Очень хорошо. Делаем агентов для разбора логов в OSSIM. Сначала простенький для ISAFWSLog.

# Alienvault plugin
# Author: Eugene Sokolov at esguardian@outlook.com
# Plugin TMG-FWS id:9005 version: 0.0.1
# Last modification: 2015-06-09 20:35
#
# Accepted products:
# microsoft - TMG 2010
# 
# /etc/rsyslog.d/tmg.conf
#

[DEFAULT]
plugin_id=9005

[config]
type=detector
enable=yes

source=log
location=/var/log/tmg-fws.log

create_file=false

process=
start=yes
stop=no
startup=
shutdown=

[tmg-fws-plain]
event_type=event
regexp="(?P<sl_date>\SYSLOG_DATE).*ISAFWSLog#011.*?#011.*?#011(?P<date>.*?)#011(?P<time>.*?)#011(?P<ip_proto>.*?)#011(?P<s_ip>.*?):(?P<s_port>.*?)#011(?P<d_ip>.*?):(?P<d_port>.*?)#011(?P<or_ip>.*?)#011(?P<s_net>.*?)#011(?P<d_net>.*?)#011(?P<action>.*?)#011(?P<status>.*?)#011(?P<rule>.*?)#011(?P<app_proto>.*?)#011(?P<b_sent>.*?)#011(?P<b_sent_inter>.*?)#011(?P<b_received>.*?)#011(?P<b_received_inter>.*?)#011(?P<con_time>.*?)#011(?P<con_time_inter>.*?)#011(?P<username>.*?)#011(?P<agent>.*?)#011(?P<session_id>.*?)#011(?P<con_id>.*?)#011(?P<nis_result>.*?)#011(?P<nis_signature>.*?)#011(?P<nat_addr>.*?)#011(?P<fwc_app_path>.*?)#011(?P<internal_service_info>.*?)#011(?P<nis_app_proto>[\S\s]+?)"
src_ip={$or_ip}
#src_port={$s_port}
dst_ip={$d_ip}
dst_port={$d_port}
plugin_sid=1
date={normalize_date($sl_date)}
username={$username}
userdata1={$action}
userdata2={$b_received}
userdata3={$b_sent}
userdata4={$ip_proto}
userdata5={$app_proto}
userdata6={$status}
userdata7={$rule}
userdata8={$fwc_app_path}

Помещаем этот файл в /etc/ossim/agent/plugins/tmg-fws.cfg

Делаем скрипт для модификации ossim-db и помещаем его в /etc/my_ossim/tmg-fws.sql

-- TMG-FWS
-- plugin_id: 9005

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, 'TMG-FWS', 'TMG-FWS logger');

INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9005, 1, NULL, NULL, 'TMG FWS Record',1, 3);

Заходим на консоль OSSIM, выбираем в меню jailbreak и делаем команды:

#cd /etc/my_ossim
#cat tmg-fws.sql|ossim-db
#/etc/init.d/ossim-server restart

Теперь, либо с веб-консоли, либо с обычной консоли, можно включить агента.

Этот агент такой скучный, поскольку в моем случае он дает мало интересной информации. В основном соединения устанавливаются через веб-прокси, а не через файрвол. Следующий агент гораздо интереснее.

# Alienvault plugin
# Author: Eugene Sokolov at esguardian@outlook.com
# Plugin TMG-WEB id:9004 version: 0.0.2
# Last modification: 2015-06-10 16:10
#
# Accepted products:
# microsoft - TMG 2010
# 
# /etc/rsyslog.d/tmg.conf
#

[DEFAULT]
plugin_id=9004

[config]
type=detector
enable=yes
#custom_functions_file=/etc/ossim/agent/plugins/custom_functions/my_tmg_custom_functions.cfg
source=log
location=/var/log/tmg-web.log

create_file=false

process=
start=yes
stop=no
startup=
shutdown=

[tmg-web-plain]
event_type=event
regexp="(?P<sl_date>\SYSLOG_DATE).*ISAWebLog#011\S#011(?P<c_ip>\S+?)#011(?P<cs_username>[\S\s]+?)#011(?P<c_agent>[\S\s]+?)#011(?P<date>[\S\s]+?)#011(?P<time>[\S\s]+?)#011(?P<cs_compname>[\S\s]+?)#011(?P<cs_reffered>[\S\s]+?)#011(?P<r_host>[\S\s]+?)#011(?P<r_ip>[\S\s]+?)#011(?P<r_port>[\S\s]+?)#011(?P<time_taken>[\S\s]+?)#011(?P<sc_bytes>[\S\s]+?)#011(?P<cs_bytes>[\S\s]+?)#011(?P<cs_protocol>[\S\s]+?)#011(?P<s_oper>[\S\s]+?)#011(?P<cs_uri>[\S\s]+?)#011(?P<cs_mime_type>[\S\s]+?)#011(?P<s_object_source>[\S\s]+?)#011(?P<sc_status>[\S\s]+?)#011(?P<rule>[\S\s]+?)#011(?P<filter_info>[\S\s]+?)#011(?P<cs_network>[\S\s]+?)#011(?P<sc_network>[\S\s]+?)#011(?P<error_info>[\S\s]+?)#011(?P<action>[\S\s]+?)#011(?P<authServer>[\S\s]+?)#011(?P<nis_scan_result>[\S\s]+?)#011(?P<nis_signature>[\S\s]+?)#011(?P<threat_name>[\S\s]+?)#011(?P<malware_inspection_action>[\S\s]+?)#011(?P<malware_inspection_result>[\S\s]+?)#011(?P<url_category>[\S\s]+?)#011(?P<MI_delivery_method>[\S\s]+?)#011(?P<MI_duration>[\S\s]+?)#011(?P<MI_threat_level>[\S\s]+?)#011(?P<internal_service_info>[\S\s]+?)#011(?P<NIS_app_protocol>[\S\s]+?)#011(?P<NAT_address>[\S\s]+?)#011(?P<url_categorization_reason>[\S\s]+?)#011(?P<session_type>[\S\s]+?)#011(?P<url_dest_host>[\S\s]+?)#011(?P<s_port>[\S\s]+?)#011(?P<soft_block_action>[\S\s]+?)"
src_ip={$c_ip}
dst_ip={$r_ip}
dst_port={$r_port}
plugin_sid={my_tmg_web_sid($sc_bytes,$cs_bytes,$r_host)}
username={$cs_username}
date={normalize_date($sl_date)}
userdata1={$r_host}
userdata2={$cs_bytes}
userdata3={$sc_bytes}
userdata4={$cs_protocol}
userdata5={$s_oper}
userdata6={$sc_status}
userdata9={$cs_uri}
userdata8={$cs_reffered}
userdata7={$rule}

Кое что о функциях в плагине.

Обращаем внимание на выделенные жирным строки. В одной вы видите закомментированное определение файла с описанием с custom functions, а в другой вы видите вызов функции, описание которой очевидно должно быть в этом файле. Но это не вызов кастомной функции. Это вызов встроенной функции. Дело в том, что сначала я, как хороший мальчик, хотел заделать кастомную функцию для генерации типа события на основе данных из записи в логе, но мой файл с определением кастомной функции не парсится. И в логах нет никаких ошибок. Как будто парсер плагина вообще не увидел соответствующую инструкцию в секции [config]. Поскольку использование кастомных функций в OSSIM не документировано никак и нигде, понять в чем дело, можно только вычитывая исходный код и выискивая в нем обработку этих самых кастомных функций. Тратить на это время я не стал. Гораздо проще поступить по-плохому, отредактировать файл /usr/share/alienvault/ossim-agent/ParserUtil.py. Что я и сделал. Конечно его придется исправлять при каждом апдэйте на новую версию, но поскольку ранее уже пришлось править TailFollowBookmark.py для русификации, то семь бед — один ответ.

В упомянутом файле содержатся определения «встроенных функций», кстати, на поверку оказалось, что их там больше, чем можно найти в какой-либо документации на OSSIM. Это мило. Вносим правки. В начале файла в раздел помеченный комментарием # GLOBAL IMPORTS пишем определение одной глобальной переменной:

UNWANTED_URLS=[]
with open("/etc/my_ossim/unwanted_urls.list","r") as f:
    UNWANTED_URLS=[line.rstrip() for line in f]
f.close()

Как нетрудно догадаться, это считывание файла со списком нежелательных адресов. Термин URL здесь не очень хорош. На самом деле это имя или ip адрес хоста, то есть значение параметра r-host в логе TMG. Формат файла: один адрес в одной строке. Если в строке написано domain.com, то будут ловиться и domain.com и something.domain.com но не mydomain.com. Если указывать ip адрес, то полный.

Теперь добавляем (можно куда угодно) описание нашей функции.

def my_tmg_web_sid(bsent=0, breceived=0, url='0'):
        sid = 1
        bsent = int(bsent)
        breceived = int (breceived)
        if bsent > 1000000:
            return 2000
        if bsent > breceived:
            sid = sid + 10
        if bsent > 200000: 
            sid = sid + 100
        for elem in UNWANTED_URLS:
            dot_elem="."+elem
            if elem == url or dot_elem in url:
               sid = sid + 1000
               break
        return sid

Отлично. Кладем исправленный файл на место. Делаем файл tmg-web.sql и кладем его в /etc/my_ossim/

-- TMG-WEB
-- plugin_id: 9004

DELETE FROM plugin WHERE id = "9004";
DELETE FROM plugin_sid where plugin_id = "9004";

INSERT IGNORE INTO plugin (id, type, name, description) VALUES (9004, 1, 'TMG-WEB', 'TMG-WEB');

INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9004, 1, NULL, NULL, 'TMG WEB Record',1, 3);
INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9004, 11, NULL, NULL, 'TMG WEB Client sent more than received',1, 3);
INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9004, 101, NULL, NULL, 'TMG WEB Client sent large amount of data',1, 3);
INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9004, 111, NULL, NULL, 'TMG WEB Client sent large amount of data and more than received',1, 3);
INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9004, 1001, NULL, NULL, 'TMG WEB unwanted url',1, 3);
INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9004, 1011, NULL, NULL, 'TMG WEB Client sent more than received for unwanted url',1, 3);
INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9004, 1101, NULL, NULL, 'TMG WEB Client sent large amount of data for unwanted url',1, 3);
INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9004, 1111, NULL, NULL, 'TMG WEB Client sent large amount of data and more than received for unwanted url',1, 3);
INSERT IGNORE INTO plugin_sid (plugin_id, sid, category_id, class_id, name, priority, reliability) VALUES (9004, 2000, NULL, NULL, 'TMG WEB Possible data leek',1, 3);

 

Заходим на консоль OSSIM, выбираем в меню jailbreak и делаем команды:

#cd /etc/my_ossim
#cat tmg-web.sql|ossim-db
#/etc/init.d/ossim-server restart
#/etc/init.d/ossim-agent restart

Зачем?

Из текста примерно понятно какие события различает плагин. Эти события очень удобны для выявления, например, коммуникаций с Command and Control центрами ботнетов, в том числе неизвестными, или использования «облачных сервисов», или средств удаленного управления вроде teamviewer.  Вы можете очень тщательно позакрывать возможности таких коммуникаций на TMG, но у вас всегда найдутся исключительные люди, для которых запрещающие правила будут отключены. Как понятно, открытыми исключениями могут воспользоваться не только эти люди, но и трояны запущенные от их имени. Поэтому нужно удобное средство мониторинга.

Кстати, заданные изначально определения типов событий, которые выдает ваш плагин, вы можете поправить с веб-консоли в разделе Configuration — threat intelligence — data source. Там вы можете переопределить типы событий, задать категории и подкатегории и такие параметры как priority и reliability, на основе которых вычисляется значение риска и принимается решение о необходимости генерировать Alarm и открывать Ticket на инцидент. Кроме того, в разделе Directives, полезно задать директивы корреляции событий. Например, тот факт, что Client sent more than received ни о чем серьезном не говорит, но если это событие постоянное и происходит между одним и тем же источником и пунктом назначения, то это может быть признаком работы шпионского софта на машине сотрудника.

Берегите себя.

Реклама

Обработка логов MS TMG-2010 на OSSIM: Один комментарий

  1. Уведомление: И еще несколько отчетов для OSSIM … | ESGUARDIAN

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

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

Логотип WordPress.com

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

Google+ photo

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

Фотография Twitter

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

Фотография Facebook

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

w

Connecting to %s