Как известно, большинство *nix-приложений развивается по принципу KISS (Keep It Simple Stupid), когда разработчики занимаются только самыми необходимыми, на их взгляд, функциями. Остальные возможности отданы на откуп третьим сторонам. В итоге проекты обрастают субпроектами, предлагающими все необходимое, и в их многообразии подчас разобраться совсем не просто.
СУБД MySQL
Долгое время MySQL поддерживала так называемые пользовательские функции (User-Defined Function, UDF), которые по своему применению напоминают плагины, хотя их применение ограничено обработкой данных. Существовали, конечно, и плагины, но их применение требовало пересборки серверной части. Возможность простого добавления расширения при помощи специального plug-in API появилась в MySQL, начиная с версии 5.1. Это позволило на лету подключать и отключать плагины при помощи команд INSTALL PLUGIN и UNINSTALL PLUGIN, и главное, теперь не требуется перекомпиляция сервера. Плагины размещаются в каталоге, указанном в переменной plugin_dir, в конфиге my.cnf. Просмотреть список доступных плагинов можно так:
mysql> show variables like 'plugin_dir';
mysql> show plugins;
В ответ получим название нужного каталога и список плагинов.
Устанавливаем новый плагин в указанный каталог и активируем:
mysql> INSTALL PLUGIN daemon_memcached SONAME 'libmemcached.so';
mysql> UNINSTALL PLUGIN daemon_memcached;
Возможности плагинов, по сравнению с UDF, гораздо шире и затрагивают практически все сферы применения СУБД. C каждым новым релизом возможности plug-in API расширялись, и в последней версии MySQL 5.7 (development milestone release) поддерживается уже 8 типов плагинов:
- Storage engines — для реализации хранения специфических типов данных, которые будут доступны через SQL;
- Daemons — запуск фоновых процессов;
- Full-text parsers — может быть использован для индексирования текстовых данных и специализированной обработки выражений FULLTEXT запросов;
- INFORMATION_SCHEMA tables — для организации «виртуальной базы данных» в таблице information_schema (обеспечивает доступ к метаданным БД) при помощи специальной функции information_schema (появилась в MySQL 5.1);
- Semisynchronous replication — по умолчанию в MySQL используется асинхронная репликация, эти плагины позволяют использовать полусинхронную репликацию (поддержка появилась в 5.5), когда коммит на мастере происходит еще до того, как транзакция отправляется на реплику. Следует помнить, что в сетях с большой задержкой производительность при использовании semisynchronous падает;
- Auditing — плагины для регистрации событий аудита;
- Authentication — плагины, расширяющие возможность аутентификации;
- Password-Validation — интерфейс для создания плагинов, позволяющих проверять пароли на прочность.
Еще два нюанса, о которых нужно знать: плагины бывают для серверной и клиентской части, необходимо отслеживать совместимость с текущей версией MySQL. Причем плагины для MySQL нередко работают и в клонах — Drizzle, MariaDB и Percona Server.
Сегодня можно найти десятки готовых решений в каждой категории, первые три особенно популярны.
Необходимость в обработке больших объемов данных привела к тому, что все более популярной становится концепция NoSQL (Not Only SQL — не только SQL). Большинство NoSQL решений разработаны с нуля, но параллельно доступны разработки для популярных СУБД, расширяющие их возможности. Для MySQL наиболее популярны: Memcached (goo.gl/D59kY, разработка Oracle, поддержка появилась в MySQL 5.2.6) и HandlerSocket (github.com/DeNA/HandlerSocket-Plugin-for-MySQL), хотя это не весь список. Например, HandlerSocket позволяет обращаться к MySQL, так же как к NoSQL, избегая накладных расходов, связанных с SQL. Чтобы ускорить обработку, HandlerSocket не закрывает таблицы по окончанию операций, а оставляет их открытыми для повторного использования. В итоге производительность возрастает примерно в 5-6 раз, по сравнению с обработкой обычного SQL запроса.
Яркими примерами плагинов из второй категории являются проекты, которые даже не нуждаются в особом представлении: Sphinx (sphinxsearch.com) и поисковый движок mnoGoSearch (mnogosearch.org), используемые на многих веб-сайтах. В рамках проекта Sphinx (кстати, автор проживает в России) реализована поддержка полнотекстового поиска для любых типов хранилищ MySQL (в том числе MyISAM, InnoDB, NDB, архив и т.д.), его характеризует масштабируемость, высокая скорость индексации и поиска, распределенная возможность поиска.
Для поиска по шаблону MySQL поддерживает расширенную версию предложенной Генри Спенсером (Henry Spencer) реализации регулярных выражений (оператор REGEXP, подробнее bit.ly/10KQcIe), которая, по признанию самих же разработчиков, не корректно работает с мультибайтными кодировками. Для некоторых задач лучше подходят PCRE-совместимые выражения (Perl Compatible Regular Expressions), реализованные в lib_mysqludf_preg (mysqludf.org/lib_mysqludf_preg).
Отслеживание состояние сервиса — важная часть администрирования СУБД, знать все параметры поможет распространяемый по лицензии GNU GPL плагин мониторинга от Percona (bit.ly/17zktCa), который совместим с Cacti, Nagios и некоторыми другими специализированными решениями. Кстати, Percona выпускает незаменимый в работе каждого DBA инструмент — Percona Toolkit for MySQL (ранее Maatkit), представляющий собой набор из более чем 30 Perl-скриптов, упрощающих многие операции при работе с MySQL: репликация, резервирование и восстановление информации, мониторинг, анализ запросов, исследование эффективности настроек сервера баз данных, контроль привилегий и многое другое.
Сегодня доступ к серверу баз данных может требовать большое количество пользователей. Встроенный (native) механизм аутентификации через плагин mysql_native_password, проверяющий username/password в таблице mysql.user, не всегда удобен (есть, кстати, и плагин mysql_old_password, совместимый с паролями MySQL до 4.1.1). Особенно если уже имеется готовая база учетных записей. Но все это легко организовать при помощи плагинов, в которых реализованы любые политики аутентификации пользователей, не привязанные к схеме MySQL и предоставляющие большее количество возможностей и механизмов. Например, для коммерческой версии MySQL Oracle предлагает два плагина:
- PAM Authentication Plugin (authentication_pam) — использует механизмы аутентификации PAM Unix и LDAP в различных приложениях и контекстах, с гибко настраиваемыми правилами. В качестве параметров доступны все методы PAM — логин, пароль, имя хоста и т.п.
- Windows Native Authentication Plugin — использование механизмов аутентификации Windows, после регистрации пользователь может без дополнительного ввода учетных данных подключиться к СУБД.
Исходный код этих модулей достался Oracle по наследству, поэтому многие считают неправильным, что в настоящее время его нет в свободном доступе. Но есть простой выход: аналогичные плагины предлагают форки MariaDB, Drizzle (bit.ly/10KQAXh) и Percona Server, но в отличие от MySQL, они выпущены под GNU GPL. Учитывая родство, собрать любой из них для работы с MySQL труда не составит. Причем Percona предлагает и свой вариант PAM модуля для MySQL (bit.ly/18zbpNd), поддерживающий, кроме указанных выше, также аутентификацию при помощи RSA SecureID. Вариант от Drizzle интересен тем, что у него PAM и LDAP реализованы в виде отдельных модулей, что очень хорошо, так как LDAP запрос идет напрямую к серверу, а не через PAM (пароль в этом случае передается в открытом виде). Кроме того, предложены варианты аутентификации при помощи текстового файла и HTTP, также есть плагин, разрешающий все соединения без аутентификации.
Система мониторинга Nagios
Постоянное наблюдение за всеми слагаемыми компьютерной сети позволяет выявить проблемные участки и устранить их до того, как произойдет сбой, или они смогут повлиять на работу сети, а оповещение поможет быстро устранить неисправность. Вот здесь и выручают системы мониторинга. Одним из самых популярных среди OpenSource решений является Nagios (nagios.org), отслеживающий использование ресурсов серверов (загруженность CPU, расходование RAM и дискового пространства и т.д.) и выполняющий мониторинг работы сетевых сервисов (HTTP, SMTP, POP3, IMAP, SSH и многих других). Информацию можно получить при помощи веб-интерфейса. Базовые возможности можно расширить за счет большого числа плагинов, аддонов, патчей и утилит, которые практически полностью покрывают все потребности.
Официальными считаются около 50 плагинов проекта Nagios Plugins (nagiosplugins.org), и именно они обычно ставятся по умолчанию при использовании пакетного менеджера дистрибутива (но не всегда в пакете они все), обеспечивая возможности мониторинга базовых параметров и основных сервисов — CPU, ОЗУ, диск, DNS, MySQL, SSH и др. За время существования проекта сообществом было создано более 2000 дополнений в 40 категориях, большая часть из которых доступна на ресурсах Nagios Exchange (exchange.nagios.org) и MonitoringExchange (monitoringexchange.org). Некоторые плагины для Nagios будут работать и в клонах — Icinga или Shinken.
Например, Check_MK (mathias-kettner.de) позволяет автоматически и с минимальными нагрузками на хост собирать информацию о сервисах удаленного узла, заменяя некоторые стандартные плагины (NRPE, NSClient, check_snmp и другие). Для получения данных с удаленных систем используется всего один сервис (вместо нескольких) и единственное сетевое соединение (по умолчанию 6556/TCP через xinetd). Это дает возможность при помощи одного сервера мониторить большее количество клиентов. Поставляется Check_MK с набором готовых правил проверки, веб-интерфейсом (можно использовать вместо или вместе со штатным Nagios) и модулем для быстрого доступа к ядру Nagios. Поддерживается автоматическая конфигурация проверок узлов. Для разных ОС разработаны агенты, возможен и «безагентный» мониторинг на основе SNMP. Проект предлагает пакеты для установки в разных системах и дистрибутивах. В Ubuntu он уже доступен в репозитарии, все компоненты можно найти командой «apt-cache search check-mk».
Очень полезная коллекция из более чем 50 плагинов (разбиты на 17 категорий) предложена проектом Monitoring Plugins (bit.ly/fxhle3). Установив ее из исходников, получим возможность проверять статус bonding интерфейсов, состояние памяти и memcached, задания CUPS, работу Apache, DNS, MySQL, libVirt, политик SELinux, SSL сертификатов и многое другое. Набор содержит настройки для отправки уведомлений по SMS, mail и в stdout (для отладки).
C распространением мобильных устройств нередко возникает задача их мониторинга. Для этой цели в дополнениях к Nagios можно найти нужные плагины, и выбор здесь большой — aNag, uNagi, TiNag. Самый популярный, наверное, aNag (bit.ly/1aEJTu5), позволяющий проверять состояние Andriod устройств, поддерживает подключение к нескольким серверам Nagios или Icinga. Реализовано автоматическое обновление состояния, фильтрация сообщений, различные уведомления и многое другое.
Некоторые полезные дополнения не представлены в указанных репозиториях. Например, Percona также предлагает набор из 12 плагинов для расширенного мониторинга MySQL и клонов, сделанных к тому же весьма профессионально. С их помощью можно проверять задержки репликации, привилегии, отслеживать взаимоблокировки (deadlocks), процессы MySQL (достижение критического уровня), контрольные суммы таблиц, заполненность LVM тома и многое другое. Плагины будут работать в любой *nix-системе, для более простой установки в дистрибутивах Linux разработчики предлагают репозитарий.
Также не лишним будет вспомнить различные инструменты, которые восполняют недостающие в штатном интерфейсе функции. Например, аддон NagVis (nagvis.org) визуализирует состояние узлов и сервисов, предоставляя наглядную карту (ее вид выбираем самостоятельно), и при помощи гаджетов выводит различные диаграммы. Все установки производятся через веб-интерфейс, параметры устройств берутся из Nagios/MySQL. Для удобства графики NagVis можно интегрировать в интерфейс Nagios. В NagVis Exchange (exchange.nagvis.org) доступны дополнительные шаблоны, карты, значки и прочие элементы, расширяющие его возможности.
Среди множества веб-интерфейсов к Nagios особо выделяется Centreon (centreon.com) — удобный, красивый, функциональный. Предусмотрена отправка уведомлений на почту или SMS. Все настройки производятся непосредственно через веб. Служебные данные Centreon хранит в MySQL, данные мониторинга — в RRD.
По умолчанию Nagios заносит информацию в файлы, специальный модуль NDO2Utils позволяет экспортировать собранные ранее и новые данные в MySQL, откуда их уже могут брать сторонние приложения, вроде NagVis и Centreon.
Создание конфигурационных файлов можно поручить NConf (nconf.sf.net) или NagiosQL (nagiosql.org), которые позволяют сделать все необходимое через веб-интерфейс. Например, NagiosQL ориентирован на предприятия любого размера, совместим с Nagios 2.x/3.x и клонами, поддерживает несколько наборов конфигураций, мощные функции импорта, возможно применение сценариев, шаблонов и переменных, информация сохраняется в MySQL.
Как вариант, утилита ScanToNag (vanheusden.com/java/ScanToNag), сканируя после запуска сеть в поисках хостов и сервисов, автоматически создает необходимые настройки.
$ java -jar ScanToNag.jar --range 192.168.1.0/24 --emit-templates --timeout 50 --contacts unix-admins --hosts-file hosts.conf --services-file services.conf
Система обнаружения атак Snort
Наиболее популярной OpenSource сетевой системой обнаружения атак является Snort, способная производить в реальном времени анализ и блокировку подозрительных IP-пакетов. Snort обнаруживает атаки, комбинируя два метода: сигнатурный и анализ протоколов. За время развития проекта к ней было разработано множество дополнений, патчей, модулей и интерфейсов, расширяющих базовые возможности. Большая часть из предложенных патчей постепенно перекочевала в основную ветку и развивается под эгидой Sourcefire.
Snort стартовал в 2000 году исключительно как IDS, не предоставляя механизмов блокировки пакетов. Поэтому, наверное, самым популярным среди плагинов является SnortSam (snortsam.net), позволяющий блокировать IP-адрес злоумышленника путем перенастройки правил пакетного фильтра. Поддерживаются IP Filter (ipf), ipfw2, Packet Filter (pf), Linux IPtables/Ebtables, некоторые роутеры Cisco и Juniper и т.д. Одна установка может перестраивать правила сразу нескольких файрволов. Поддерживается белый список, установка времени блокировки, гибкие правила, обнаружение DDOS и многое другое. Сам SnortSam состоит из двух компонентов: патча к Snort и управляющей программы. Для защиты соединения между Snort и агентом SnortSam используется шифрование TwoFish.
Альтернативой SnortSam можно считать скрипт fwsnort (cipherdyne.org/fwsnort), преобразующий правила Snort в эквивалентные для iptables (через ‘—hex-string’). Кроме этого, реализован патч для собственно Snort — snort_inline, позволяющий активировать функциональность IPS. Но в настоящее время проект, по сути, закрыт (последнее обновление датировано 2010 годом, для версии Snort 2.8.2), разработчики snort_inline переключились на IDS/IPS Surikata (suricata-ids.org). В целях совместимости функционал snort_inline реализован с помощью механизма DAQ в виде модуля IPQ (см. врезку).
Традиционно для обновления правил используется Oinkmaster, но он не обрабатывает динамические правила (Shared Object Rules, so_rules), а потому их подключение приходится производить самостоятельно.
# snort -c /etc/snort/snort.conf --dump-dynamic-rules=/etc/snort/so_rules
Finished dumping dynamic rules.
Процесс обновления правил также можно полностью автоматизировать при помощи Perl-скрипта PulledPork (code.google.com/p/pulledpork).
Система, построенная на Snort, способна собирать и обрабатывать информацию с нескольких датчиков. Проблема может возникнуть, когда при превышении порога Snort будет вынужден остановить анализ трафика, пока собранные данные не будут сохранены. Эту проблему решают при помощи плагинов, разделяющих функции анализа и сохранения. Наиболее известен Barnyard (уже прекратил развитие, barnyard.sf.net) и его форк Barnyard2 (github.com/firnsy/barnyard2), получающие на вход «унифицированный» формат (unified2) и сохраняющие данные в указанном виде (поддерживается dump, CSV, syslog, отправка в ACID и Sguil). Примерно по такому же принципу работает FLoP (Fast Logging Project for Snort, geschke-online.de/FLoP) и mudpit (mudpit.sf.net). FLoP специально разработан и оптимизирован для распределенной инфраструктуры, собирает информацию на удаленных датчиках и отправляет на централизованный сервер для анализа (поддерживается MySQL и PostgreSQL). В отличие от Barnyard2, в котором для каждого SELECT/INSERT используется TCP/IP, что при большой нагрузке вызывает задержки, в FLoP эту функцию выполняет сокет Unix. При достижении определенного порога опасности на email админа будет отправлено предупреждение.
Новый механизм захвата пакетов в Snort 2.9
В Snort 2.9 вместо прямого обращения к libpcap использован механизм DAQ (Data Acquisition Library), впервые анонсированный в 2010 году и добавляющий новый уровень абстракции, позволяющий проще реализовать захват на разных платформах, без внесения изменений в исходный код. В итоге отпала необходимость в некоторых патчах. Сам DAQ предоставляет несколько модулей, имеющих свои функции: PCAP (захват), AFPACKET (IPS, блокировка трафика между двумя интерфейсами в Linux), NFQ (использования QUEUE для передачи пакета в userspace для анализа, Linux), IPFW (то же, что и NFQ, только работает в FreeBSD и OpenBSD), IPQ (snort_inline) и DUMP. Модули могут собраны как статически, так и динамически (—disable-static-daq). Для просмотра списка доступных модулей вводим команду:
# snort --daq-list
По умолчанию для захвата используется модуль PCAP, которому можно передать специфические параметры:# snort --daq pcap --daq-mode passive -i eth0Но при необходимости модуль по умолчанию можно изменить при сборке параметром:
./configure "CPPFLAGS=-DDEFAULT_DAQ="
Разработчики Snort занимаются только движком, оставляя анализ данных третьим сторонам. В результате появилось очень много скриптов и GUI, позволяющих визуально оценить информацию — BASE, Snez, OSSIM, Sguil, Snorby и др.
Заключение
Современные проекты предлагают простую возможность для расширения, поэтому не всегда чтобы решить какую-то проблему, следует бросаться в лоб и писать недостающий функционал. Как правило, все необходимое уже есть, нужно только постараться это найти.