Pull to refresh

Мониторинг mod_security и MySQL с помощью Splunk

Reading time 5 min
Views 11K
Доброе время суток, хаброжители.
Хочу поделиться реализацией мониторинга виртуального сервера, который я поддерживаю.
Операционная система: CentOS 6.3 x64, однако описываемая ситуация подойдет и для других платформ, как *Win так и *nix.
Постановка задачи.
На сервере установлены сервисы: apache2, MySQL, postfix и реализована защита apache на базе mod_security.
Хозяина сервера не устраивает подключение по ssh консолью и чтение логов в текстовом редакторе, кроме того не было наглядности нагрузок на сервер, количества запросов, сложности запросов к серверу. Я предложил Zabbix сервер, но клиент сказал категорический «нет». Ну что-ж, на то он и клиент, чтобы быть всегда правым.
Необходимо максимально быстро отыскивать сложившуюся ситуацию, связанную с безопасностью сервера, и исходя из события принимать меры к устранению проблемы.

Сразу приведу скриншот того, что получилось:




Итак, погуглив и задав вопрос и получив ответ, я попробовал по возрастанию сложности все интерфейсы, указанные на официальном сайте mod_security. Обнаружилось, что все они перестали поддерживаться где-то в 2008 году, что меня не устроило.
Splunk я оставил напоследок, так как во-первых он платный, а во-вторых у меня недоверие к универсальным продуктам для подобных задач.
Коротко о решении:
1). Есть платная и бесплатная версии;
2). Тестовый период 60 дней, и если логов, проходящих через систему меньше 500 Мб, то можно спокойно заключать бесплатное лицензионное соглашение;
3) порадовала куча модулей, из которых я сразу заинтересовался еще и модулем для MySQL.
4) возможность установки как на сам сервер, так и на любой другой хост сети, с подключением к различным нодам для сбора информации. То есть консолидация результатов работы нескольких нод в едином центре (например на домашнем сервере).

Опасения, которые возникли:
1). Слишком универсальный продукт;
2). Сложность установки на «живой» сервер;
3). Безопасность самого Splunk.
4). Вечно довольные лица на главной странице сайта и минимум технической информации.

Итак, было решено ставить. Пришлось зарегистрировать аккаунт на сайте, после этого качнул соответствующий пакет для ubuntu (сначала тестировал на домашней машине http+MySQL+miniDLNA+файлопомойка+qBitTorrent). Долго не буду описывать, все заработало. Было решено ставить в продакшн.

Поэтапно качаем:
1. Сам Splunk *.rpm.
Ставим rpm -i *.rpm,
Стартуем сервис splunk start
Читаем вывод. По-умолчанию порт 8000.
2. Модуль для mod_security по ссылке с оф. сайта. Написано, что совершенно бесплатный модуль.
3. Кроме того у модуля были указаны зависимости от пакетов: Visit amMap, Download Maxmind
, Download SideView Utils, Google Maps. Нам не жалко, скачал.
4. Установка самого mod_security тоже достаточно проста: App-> Manage apps -> Install app from a file.
Установка доп. модулей хуже, нужно их распаковывать в каталог Splunk, в папку модулей. У меня все появилось и заработало сразу после рестарта splunk
5. Бонусом качнул MySQL Monitor — модуль, который тоже ставится через Manage Apps. Однако запуск у него через другое место, отдельно от Splunk.

Добавляем запуск Splunk при загрузке:
echo "$SPLUNK/bin/splunk start" >> /etc/rc.local


Самое интересное началось при настройке, так как внятно нигде ничего не сказано, минимальные руководства по инсталляции модулей даны на страницах.
Необходимое отступление. Splunk позиционирован как поисковик по некоей базе данных (которая хранится на жестком диске сервера, где он установлен). В него можно подключать информацию из файлов (Data Inputs), по TCP, UDP, Scripts (видимо передача данных из скриптов). В свою очередь существует понятия Indexes, в котором содержатся… индексы, ссылающиеся на Data Inputs.
Вернемся к настройке модуля сбора информации mod_security. Оказалось, чтобы он начал работать, необходимо в разделе Manager -> Data Inputs ввести сбор логов из файла (у меня лежит /var/log/httpd/modsec_audit.log), указываю так:



Итак, создан Data Input с именем mod_secur
Идем в Manager -> Indexes и создаем индекс mod_secur, который требует указать размещение базы данных самого Splunk в файловой системе. Поставил:
Home path: $SPLUNK_DB/mod_sec_db/db
Cold path: $SPLUNK_DB/mod_sec_db/dbcold
Thawed path: $SPLUNK_DB/mod_sec_db/dbthawe


Когда вход данных и индекс созданы, идем в настройки модуля, которые оказались не в настройках модуля раздела Modules. а в Manager -> Advanced Search -> Search Macros.

В верхней левой части окна убеждаемся, что данные относятся к модулю Mod_security (а то я там долго тыкался в кучу переменных другого модуля, подыскивая свои переменные).
Меняем modsec_index с «main» на наш индекс «mod_secur», modsec_src не трогаем.
После этих манипуляций система начинает читать логи, и где-то в течение минуты для трехдневного файла собирает информацию. В процессах top я Splunk вообще не увидел, ресурсов отъедает минимум, что порадовало.
Ниже приведу пару скриншотов, а далее расскажу про MySQL монитор.
Раз скриншот

Два скриншот


От себя добавлю, что создатели монитора для mod_security совершенно не позаботились о важной информации — выводе включенных и отключенных правил, по которым он работает.

Установка монитора MySQL мне больше вынесла мозги, хотя бы в связи с тем, что дизайн рвет глаза до самых глубин души.


При открытии монитора мы всегда попадаем на readme, где перенастроить это я не нашел.
Состоит модуль из демона сбора статистики MySQl, который так же необходимо стартануть.
Но сначала правим конфигурационный файл модуля "$SPLUNK_HOME/etc/apps/mysqlmonitor/bin/daemon/config.ini):
> cp config.ini.sample config.ini
> cat config.ini
[mysql]
host=localhost
port=3306
username=xxx
password=xxx

[splunk]
host=localhost
port=9936

[statusvars]
interval=10

[slavestatus]
interval=10

[tablestats]
interval=3600

[processlist]
interval=10

и файл подключенных серверов $SPLUNK_HOME/etc/apps/mysqlmonitor/hosts.yaml
> cp hosts.yaml.sample hosts.yaml
> cat hosts.yaml

Databases:
  db01:
    host: localhost
    username: xxx
    password: xxx


И можно стартовать демона.
$SPLUNK_HOME/etc/apps/mysqlmonitor/bin/daemon start 
echo "$SPLUNK_HOME/etc/apps/mysqlmonitor/bin/daemon start " >> /etc/rc.local

Зависит от установленных в системе
•Python 2.6 or 2.7
•Python MySQL drivers

Работает сбор информации через TCP сокет 9936, который и предстоит создать в самом Splunk: Manager -> Data Inputs -> TCP. Создаем сокет 9936.


Manager -> Indexes -> создаем новый mysql, полнейшая аналогия с mod_security.
В Manager -> Advanced search -> Search macros не идем — там ничего и менять то не надо. Все взлетело, привожу скриншоты (да, кстати, автоматом не отработает, нужно нажать кнопку search).

UPD 29.04.2013: Родил такой скрипт, так как демон иногда падает и запихал его в крон (cron)*.
cat mysql_mon.sh

#!/bin/bash
if ! [ -f / $SPLUNK_HOME/etc/apps/mysqlmonitor/bin/daemon/splunkmysql.pid ]; then
    echo "MySQL monitor PID-file is Dead. Restarting"
    $SPLUNK_HOME/etc/apps/mysqlmonitor/bin/daemon/splunkmysqlmonitor.py stop
    $SPLUNK_HOME/etc/apps/mysqlmonitor/bin/daemon/splunkmysqlmonitor.py start
else
    read pid < $SPLUNK_HOME/etc/apps/mysqlmonitor/bin/daemon/splunkmysql.pid
    if ! `/bin/kill -0 "$pid"`; then
        echo "MySQL monitor process is Dead. Restarting"
        $SPLUNK_HOME/etc/apps/mysqlmonitor/bin/daemon/splunkmysqlmonitor.py stop
        $SPLUNK_HOME/etc/apps/mysqlmonitor/bin/daemon/splunkmysqlmonitor.py start
    fi
fi
echo "Mysql monitor now Working"

restart не работает, если проблема с PID-файлом, поэтому stop+start.
$SPLUNK_HOME меняем на полный путь к программе.

Раз.


Два. Тут оказалось приятным возможность на третьем графике «медленные запросы» нажать на любую часть графика и увидеть сам запрос.


Три.


Всем спасибо за внимание!
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+3
Comments 4
Comments Comments 4

Articles