Вы находитесь на странице: 1из 4

безопасность

MRTG + SNORT

«Лучше один раз увидеть, чем сто раз услышать» гласит пословица. Многие вещи мы лучше
понимаем, представляем и запоминаем, если видели их собственными глазами. При этом не
всякое нами увиденное воспринимается одинаково хорошо. Очень сильно на процесс восприятия
влияет наглядность. В этой статье будет рассмотрен именно такой вариант отображения данных
об интенсивности атак, регистрируемых с помощью Snort. В качестве средства отображения
используется MRTG.

ПАВЕЛ ЗАКЛЯКОВ
22
безопасность
Предполагается, что имеется СОА Snort, данные с одного от имени пользователя snort. Выполним подключение ко-
или нескольких сенсоров которой заносятся в БД инци- мандой:
дентов. Необходимо организовать визуальное отображе-
ние среднего уровня атак в зависимости от времени. Для # mysql -u snort -p
отображения удобнее всего использовать штатное сред-
ство большинства Linux-систем – MRTG (The Multi Router введя после соответствующий пароль, если он был задан.
Traffic Grapher) [1, 2 стр. 52-53, 3 стр. 316, 4 стр. 208-216]. Далее выберем БД snort командой:
Предполагается, что MRTG у вас уже установлен. Рассмот-
рим его настройку. Конфигурационный файл MRTG обыч- mysql> USE snort;
но называется mrtg.cfg и находится в директории /etc/mrtg.
Нам необходимо отредактировать или создать заново этот и выполним вышеописанный SQL-запрос. В результате на
файл, добавив туда следующие строки: экране у вас может быть примерно следующее:

mrtg.cfg

# Ðàáî÷àÿ äèðåêòîðèÿ mrtg, ãäå ñîçäàþòñÿ ïîääèðåêòîðèè


# äëÿ îò÷¸òîâ, îáû÷íî îíà óæå óêàçàíà
WorkDir: /var/www/html/mrtg
# Âûáîð ÿçûêà – âíîñèò â çàãîëîâîê html-còðîêó
# ñ CONTENT="text/html; charset=koi8-r" è ëîêàëèçóåò
# html-ôàéëû ñîçäàâàåìûõ îò÷¸òîâ
Language: russian
# Âíåøíèé ôàéë, êîòîðûé áóäåò ÿâëÿòüñÿ èñòî÷íèêîì äàííûõ
# äëÿ mrtg, çàïèñûâàåòñÿ â îáðàòíûõ êàâû÷êàõ
Target[snort]:`/etc/mrtg/snort_stat.pl`
# Ìàêñèìàëüíîå ÷èñëî àòàê â åäèíèöó âðåìåíè
# Çíà÷åíèÿ âûøå èãíîðèðóþòñÿ, íóæíî áîëüøå äëÿ íàãëÿäíîñòè
MaxBytes[snort]: 2000
AbsMax[snort]: 2000
# Çàãîëîâîê îêíà áðàóçåðà, òåã <title> â html Если БД с инцидентами у вас достаточно большая, то
Title[snort]: Ñòàòèñòèêà àòàê (äàííûå Snort) запрос может выполняться несколько десятков секунд.
# Çàãîëîâîê ñòðàíèöû ñ ãðàôèêàìè
PageTop[snort]: <H1>Ñòàòèñòèêà àòàê (äàííûå Snort)</H1> Убедившись, что число строк в таблице event, время
# Ïîääèðåêòîðèÿ â WorkDir, ãäå áóäóò ñîçäàâàòüñÿ îò÷¸òû которых лежит в интервале последних 300 секунд, счита-
Directory[snort]: snort
# Ðàçìåð ãðàôèêîâ ïî øèðèíå â òî÷êàõ ется правильно, создадим файл snort_stat.pl в директории
XSize[snort]: 600 /etc/mrtg, который будет выполнять все проделанные нами
# Ðàçìåð ãðàôèêîâ ïî âûñîòå â òî÷êàõ
YSize[snort]: 160 действия в автоматическом режиме. Подробнее о созда-
# Ïîäïèñü ãðàôèêîâ ïî îñè îðäèíàò нии подобных скриптов можно прочитать в [7, 8].
YLegend[snort]: Attacks per minute
# Ïîäïèñü ëåãåíäû, ïîÿñíåíèå, ÷òî èìåííî çà ãðàôèê
# íàðèñîâàí òàêèì-òî öâåòîì.(Íåîáõîäèìî, ÷òîáû íå Ôàéë snort_stat.pl
# çàïóòàòüñÿ, êîãäà ãðàôèêîâ íåñêîëüêî)
Legend1[snort]: ×èñëî àòàê â ìèíóòó #!/usr/bin/perl
# Óáðàòü ëèøíþþ èíôîðìàöèþ # Ôàéë, âûäàþùèé ÷èñëî àòàê çà ïîñëåäíèå 300 ñåêóíä
LegendI[snort]: &nbsp;
LegendO[snort]: use DBI;
# Çàäàòü íàïðàâëåíèå ðèñîâàíèÿ ãðàôèêîâ è ÷òî çíà÷åíèÿ,
# âûäàâàåìûå ïðîãðàììîé, óêàçàííîé â Target, ÿâëÿþòñÿ # Õîñò, ãäå çàïóùåíà ÁÄ MySQL
# àáñîëþòíûìè $hostname="àäðåñ_õîñòà_MySQL_ñ_ÁÄ_snort";
Options[snort]: absolute, growright # Ïîðò, íà êîòîðîì çàïóùåíà ÁÄ MySQL
# Ïîäïèñü åäèíèö èçìåðåíèÿ àòàê $port="3306";
ShortLegend[snort]: àòàê/ìèí # Èìÿ ïîëüçîâàòåëÿ, îò êîòîðîãî ïîäêëþ÷àòüñÿ ê ÁÄ
$user="snort";
# Ïàðîëü ïîëüçîâàòåëÿ, óêàçàííîãî âûøå
После того как внесена правка в конфигурационный $password="ïàðîëü_ïîäêëþ÷åíèÿ_ê_ÁÄ";
файл mrtg.cfg, необходимо создать файл, на который мы # Èìÿ ÁÄ, ê êîòîðîé îñóùåñòâëÿåòñÿ ïîäêëþ÷åíèå
$database="snort";
сделали ссылку в поле Target[snort]: /etc/mrtg/snort_stat.pl.
Этот файл будет запускаться по запросу mrtg, и он должен # Ïîäêëþ÷èòüñÿ ê ÁÄ
$dbh = DBI->connect("DBI:mysql:$database:$hostname:$port", ↵
подключаться к БД snort и подсчитывать число атак, на- $user,$password);
пример за последние 5 минут, после чего выдавать это зна- # Ïîäãîòîâèòü SQL-çàïðîñ, âûïîëíÿþùèé ïîäñ÷¸ò ÷èñëà àòàê
# çà ïîñëåäíèå 300 ñåêóíä íà âûïîëíåíèå
чение в требуемом mrtg формате. Реализовать данную $sth = $dbh->prepare("SELECT count(timestamp) FROM event ↵
идею возможно с помощью следующего SQL-запроса: WHERE unix_timestamp(now())-unix_timestamp(timestamp)<300");
# Âûïîëíèòü çàïðîñ
$sth->execute;
SELECT count(timestamp) FROM event # Ðåçóëüòàò âûïîëíåííîãî ðàíåå çàïðîñà ïîìåñòèòü â ìàññèâ ref
WHERE unix_timestamp(now())-unix_timestamp(timestamp)<300 @ref = $sth->fetchrow_array;
# Âûâåñòè ïîëó÷åííîå â ðåçóëüòàòå çàïðîñà çíà÷åíèå
который фактически является основным ядром нижесле- print $ref[0],"\n";
дующего perl-скрипта, который лишь осуществляет авто- # Çàâåðøèòü ðàáîòó ñ ÁÄ è îòêëþ÷èòüñÿ îò íå¸.
матизацию процесса подключения и работы с БД и выво- $rc = $sth->finish;
$rc = $dbh->disconnect;
дит результат в нужном формате.
Перед созданием скрипта убедимся, что данный зап- # Âûâåñòè äîïîëíèòåëüíûå çíà÷åíèÿ, íåîáõîäèìûå äëÿ ñîáëþäåíèÿ
# ôîðìàòà ïåðåäà÷è äàííûõ â mrtg
рос работает правильно, подключившись к БД из консоли print "0\n";

№5(18), май 2004 23


безопасность
print "0\n"; После того как как мы убедились, что скрипт работа-
print "snort\n"; ет, можно запустить mrtg. Первые три раза лучше это сде-
Соответствующие параметры: адреса MySQL-сервера лать вручную, так как директория snort к моменту запуска
и пр. следует задать самостоятельно, в зависимости от скорее всего будет отсутствовать со всем её будущим
вашей конфигурации. Следует отметить, что сам скрипт содержимым, то в первые два раза будет выдано сооб-
и БД могут быть разнесены и выполняться на разных ком- щение о создании директории, и будут выданы сообще-
пьютерах, если вы запускаете скрипт на том же самом ния об ошибках. Mrtg будет жаловаться на то, что отсут-
компьютере, где находится БД, что наиболее вероятно, то ствует log-файл, где хранятся данные и отсутствует его
без сомнения можно использовать значение «localhost». резервная копия. Третий раз запуск программы должен
После указания в файле правильных значений необходи- пройти тихо, без выдачи каких-либо сообщений об ошиб-
мо придать файлу атрибут запускаемости следующей ко- ках. Если это так, то можно смело переходить к автомати-
мандой: зации процесса запуска mrtg. Если бы мы сразу решили
автоматизировать запуск, то эти и, возможно, другие со-
# chmod +x /etc/mrtg/snort_stat.pl общения об ошибках могли бы оказаться в log-файлах
вашей системы, что усложнило бы процесс отладки и по-
Далее, для того чтобы данный сценарий работал без иска возможных ошибок.
ошибок, перед его тестовым запуском необходимо убе- Дополнительно убедиться в правильности работы mrtg
диться в том, что в системе установлен не только сам perl можно, изучив содержимое директории /var/www/html/mrtg/
по тому адресу, что указан в первой строчке, который бу- snort командой:
дет выполнять написанный нами скрипт, но и его пакеты-
расширения, позволяющие ему взаимодействовать с БД. # ls /var/www/html/mrtg/snort
Это perl-DBD-MySQL и perl-DBI. Проверить их наличие
можно командой: Там должны быть 7 файлов:
! snort-day.png ! snort.html
# rpm -qa|grep perl ! snort.log ! snort-month.png
! snort.old ! snort-week.png
которая выдаст имена всех пакетов в вашей системе, в ! snort-year.png
которых содержится слово perl. В случае отсутствия двух
вышеуказанных пакетов, содержащих необходимые нам Процесс автоматизации запуска mrtg возможно орга-
для работы perl-модули, следует установить их, например низовать двумя путями: запускать mrtg в виде демона один
для RedHat v.7.3, командами: раз из стартовых скриптов, например из /etc/rc.d/rc.local,
указав дополнительно соответствующий параметр в фай-
# rpm -ihv perl-DBI-1.21-1.i386.rpm ле конфигурации, либо запускать с помощью демона
# rpm -ihv perl-DBD-MySQL-1.2219-6.i386.rpm
crond. Второй вариант мне нравится больше. Для его реа-
(Эти rpm-пакеты с модулями можно найти на втором и лизации необходимо в файле /etc/crontab прописать сле-
третьем компакт-дисках соответственно.) дующие две строчки:
В случае если система обнаружения атак у вас рабо-
тает и регистрирует атаки, запустив данный скрипт вруч- # mrtg-ñòàòèñòèêà
0-59/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg ↵
ную, при правильной его работе вы сможете увидеть при- --logging /var/log/mrtg.log
мерно следующий результат в виде четырёх строк.
Строка-комментарий никакой смысловой нагрузки не
19 несёт, кроме того, что это правила хорошего тона, пояс-
0
0 нять все записи в crontab-файлах, да и потом в случае
snort чего проще будет разобраться.
Сообщения от mrtg лучше вести в отдельный файл /var/
Первая цифра – число атак за последние 5 минут, сле- log/mrtg.log, дабы не замусоривать и так перегруженный
дует заметить, что она может отличаться от той цифры, /var/log/messages, хотя это не обязательно. MRTG лучше
что была выдана при ручном вводе соответствующего запускать раз в пять минут (запись 0-59/5), каждого часа,
SQL-запроса ранее, так как время не стоит на месте, то каждого дня месяца, каждого месяца в любой день неде-
пятиминутные интервалы, в промежутке которых осуще- ли (оставшиеся четыре *). Подробнее про синтаксис и про-
ствляется подсчёт, будут разные для разных моментов цесс автоматизации см. [9 стр.34-38]. В случае если вы
запуска. В случае отсутствия атак первая цифра будет 0. будете запускать его чаще или реже, следует изменить и
Три последующие строки меняться не будут, что легко скрипт, подсчитывающий значение числа атак, заменив
заметить из последних строчек выводящего их скрипта. там соответствующее 5 минутам значение в 300 секунд.
Нужны они лишь для того, чтобы правильно работал После того как добавлены эти строчки, можно считать,
mrtg и не ругался. Так как чаще всего mrtg работает с мар- что работа по настройке закончена, и если у вас, как и
шрутизаторами, то на месте этих строчек оказываются не положено, запущен демон crond, то всё будет работать. И
пустые значения, а значения входящего и исходящего тра- уже через несколько часов можно будет наблюдать не
фика, uptime соответствующего устройства и его имя. совсем пустые гистограммы. В случае если у вас запу-

24
безопасность
щен веб-сервер, просмотрите любым графическим брау- Второе замечание касается подсчёта числа атак в еди-
зером файл http://yourserver/mrtg/snort/snort.html, либо файл ницу времени при построении графика. В случае если по
/var/www/html/mrtg/snort/snort.html локально в противном каким-то причинам придётся запускать mrtg в разные интер-
случае. В результате вы увидите картинку, подобную ни- валы времени, то, возможно, вам пригодится следующая
жеследующей: информация. Сейчас, когда запускается mrtg то, так как в
Options указано слово absolute, осуществляется деление
переданного значения от скрипта на время, равное разнице
между текущим запуском mrtg и предыдущим. Это время
приблизительно равно 300 секундам и там, и там, поэтому
получается примерно точно. Однако если по каким-то при-
чинам с момента последнего запуска mrtg прошло другое
количество времени, то как легко предположить, среднее чис-
ло атак будет подсчитано неправильно. Несколько исправить
ситуацию может использование опции gauge вместо absolute,
но не всегда. Если указана опция gauge, то значение не де-
лится на интервал времени, а принимается равным тому, что
передали. Соответственно, для правильного подсчёта и ото-
бражения в скрипте snort_stat.pl необходимо будет делить
выводимое значение на 5. Этот способ подсчёта также яв-
ляется грубым, но может помочь вам несколько уменьшить
ошибку, поменяв правила её подсчёта.

Литература, ссылки:
1. MRTG: The Multi Router Traffic Grapher http://
people.ee.ethz.ch/~oetiker/webtools/mrtg/
2. Закляков П. Разводной мост на Linux. – //Журнал «Си-
После того как, казалось бы, всё рассказано и показа- стемный администратор» №4(5), апрель 2003 г.
но, хочется сделать пару замечаний. 3. Манн С., Крелл М. Linux. Администрирование сетей
Первое касается точности построения графиков. Как TCP/IP. Пер. с англ. – М.: ООО «Бином-Пресс», 2003 г.
легко заметить, для запуска используется демон crond, ко- 4. Колисниченко Д.Н. Linux-сервер своими руками. – СПб:
торый запускается после указанного времени, когда не толь- Наука и Техника, 2002 г.
ко загрузка системы позволит это сделать, но и будет ниже 5. Закляков П. Удобнее, эффективнее, лучше: snort +
определённой. В результате следует понимать, что запуск MySQL – //Журнал «Системный администратор» №11(12),
происходит не точно каждые 5 минут. Если будет запозда- ноябрь 2003 г.
ние, то скрипт, подсчитывающий атаки, запустится позже, 6. Холзнер С. Perl: Специальный справочник – СПб: Пи-
в результате его пятиминутный интервал не перекроется с тер, 2000 г.
предыдущим и будет дырка, то есть часть атак не будет 7. Дюбуа П. Применение MySQL и Perl в Web-приложе-
подсчитано. Если же после «запоздавшего» задания сле- ниях.: Пер. с англ. – М.:Издательский дом «Вильямс»,
дующее будет вовремя, то произойдёт перекрытие и неко- 2002 г.
торые атаки будут подсчитаны дважды. Для систем с гру- 8. Как получить доступ к базе данных из cgi-скриптов?
бой оценкой это не важно, так как отклонения эти не боль- (Техническая поддержка Zenon N.S.P.: Виртуальные
шие и примерно компенсируются и не накапливаются в силу unix-серверы : Вопросы по MySQL) http://www.host.ru/
случайно флуктуирующего числа атак в единицу времени. documentation/v-www/0025.html#11
Для более точных оценок данный метод следует корректи- 9. Тейнсли Д. Linux и UNIX: программирование в shell. Ру-
ровать. Именно по причине грубости данного метода я не ководство разработчика: Пер. с англ. – К.: Издательс-
вижу смысла запускать mrtg чаще чем раз в 5 минут. кая группа BHV, 2001 г.

№5(18), май 2004 25