В GNU/Linux все сетевые пакеты проходят через Netfilter в силу чего
он и обладает самой достоверной информацией о количестве переданных и
принятых данных. В 2000 году Гаральдом Велте (Harald Welte) был написан
патч к ядру - ULOG (Userspace Logging) позволяющий получать эту
информацию в пространстве пользовательских процессов (user space) в
удобном виде. Не смотря на то, что “добраться” теперь до нужных данных
стало на порядок проще, администраторам приходилось самостоятельно
решать проблему их съема, обработки и выдачи в нужном виде. Как
результат появилось нескольких проектов, решающих эти проблемы. Одни
обеспечивали понятный интерфейс к получению данных с ULOG. Это демон ulogd написанный самим Harald Welte, specter построенный на базе ulogd 1.02 и ulog-acctd.
Стоит заметить, что основные разработки представленных проектов
датированы 2005 годом, правда это не мешает их полноценно использовать
и до сих пор» вероятно. И только ulogd, о возможностях которого будем
говорить по ходу статьи, недавно начал опять активно развиваться.
Другие проекты нацелены на выдачу информации полученной при помощи
программ первой группы в удобной форме - scanulog, ulog-monitor,
Webfwlog и Nulog2. Возможностями последнего и посвящена статья.
Проект NuLog2 является
дальнейшим развитием PHP интерфейса к ulogd и NuFW – NuLog (в Интернет
встречаются и другие его названия NuLog1 или ulogd-php). Разработка
последнего приостановлена в июле 2007 года, но уже через месяц начата
работа над его второй версией - NuLog2, которая позиционируется уже как
анализатор журналов Netfilter и NuFW.
В отличие от предшественника написанного на PHP, код NuLog2 полностью
переписан на Python с использованием среды разработки Twisted. Но не
смотря на все отличия NuLog2 использует ту же модель данных, поэтому
очень просто можно перейти с NuLog на NuLog2 без потери информации.
Кроме среды разработки изменена и лицензия с GPL v2 на GPL v3.
В настоящее время интерфейс обеспечивает: просмотр информации о
разрешенных, заблокированных пакетах по IP-адресам и пользователям
(только NuFW), TCP и UDP портам, а также приложениям задействованным в
процессе соединения (только NuFW). Поддерживаются обе версии протокола
IPv4 и IPv6, возможен детальный просмотр каждого пакета, вывод истории
запросов. Все данные сведены в таблицы и графики, предлагающие просмотр
в удобном виде. Возможен экспорт данных в CVS файл. Реализованы функции
поиска, интерфейс написанный с использованием технологии AJAX полностью
настраиваемый. В настоящее время NuLog2 не локализован, но все
параметры понятны и без перевода, так как соответствуют устоявшимся
терминам. Предвидя вопросы скажу, что к большому сожалению такой
востребованной функции как учет трафика в NuLog2 нет.
Установка и настройка ulogd
Познакомиться с возможностями Nulog2 (а также NuFW и интерфейса для его настройки Nuface) можно в дистрибутиве NuFW.live ,
который выполнен в формате LiveCD основанном на KNOPPIX. Мы же
рассмотрим установку его на рабочую систему на примере Ubuntu 8.04 LTS,
хотя много из сказанного применимо и для других дистрибутивов.
Для регистрации событий необходим модуль ядра ipt_ULOG.o, который
появился в ядре начиная с версии 2.4.18-pre8. Кто использует более
ранний релиз ядра, следует его обновить или установить патч ulog-patch
с netfilter patch-o-matic. Ядро используемое в Ubuntu 8.04 по умолчанию:
Забегая чуть вперед, скажу, что после загрузки демона ulogd в списке “lsmod” должен появиться нужный модуль:
$ lsmod | grep –i ulog ipt_ULOG 10116 2
В репозитарии Ubuntu нужные пакеты для установки ulogd имеются. Но
следует знать, что сегодня существует две ветки: стабильная 1.2x и
находящаяся пока в стадии разработки ulogd-2.x. Последний имеет
несколько больше встроенных модулей, кроме этого в нем реализована
система фильтров (подробнее). Для работы NuLog2 достаточно и релиза 1.23 (апрель 2005), который и доступен в репозитарии Ubuntu.
По умолчанию ulogd сохраняет данные в файл текстового формата,
подключив плагины можно добавить поддержку записи в базы данных MySQL,
PostgreSQL, SQLLite3, файл формата PCAP/Tcpdump или syslog. Для работы
NuLog2 необходима поддержка MySQL, модули для работы с которой как раз
и находятся во втором пакете.
Конфигурационный файл по умолчанию находится в /etc/ulogd.conf, если он расположен в другом месте, на него можно указать при помощи параметра “-c”. В отличие от ulogd2 в котором на порядок больше настроек, файл ulogd.conf гораздо проще, значение основной части понятны:
[global]
# файл журнала и уровень журналирования logfile=”/var/log/ulog/ulogd.log”
# debug(1), info(3), notice(5), error(7) or fatal(8)
# вначале лучше поставить 1, а затем после полного прогона переключить на 5 loglevel=1
# Плагины вывода
# текстовый формат plugin=”/usr/lib/ulogd/ulogd_LOGEMU.so”
# для вывода в MySQL, пока отключаем
#plugin=”/usr/lib/ulogd/ulogd_MYSQL.so”
# Параметры вывода для разных плагинов
# текстовый [LOGEMU]
file=”/var/log/ulog/syslogemu.log”
# подключение к MySQL [MYSQL]
table=”ulog”
pass=”pass”
user=”user”
db=”ulogd”
host=”localhost”
Далее нужно в правилах iptables указать, чтобы он использовал ULOG
вместо LOG. В общем случае идея очень проста, нужно в правилах заменить
строки вида:
iptables -A FORWARD $FILTER -j LOG
На iptables -A FORWARD $FILTER -j ULOG
Но в Ubuntu начиная с версии 8.04, для управления правилами
Netfilter используется - UFW (Uncomplicated firewall). Поэтому весь
процесс здесь выглядит несколько иначе, чем в других дистрибутивах.
Все настройки UFW находятся в каталоге /etc/ufw,
синтаксис команд несколько напоминает iptables, но чуть проще и
понятнее. По умолчанию UFW отключен, и перед запуском демона необходимо
в файле /etc/ufw/ufw.conf разрешить его запуск заменив строку
# set to yes to start on boot ENABLED=no
На ENABLED=yes
Правила регистрации находятся в файле /etc/ufw/after.rules и по умолчанию выглядят так:
Чтобы переключить их на ULOG достаточно заменить LOG на ULOG (параметры с limit можно убрать): -A ufw-after-input -m limit –limit 3/min –limit-burst 10 -j ULOG –ulog-prefix “[UFW BLOCK INPUT]: ”
-A ufw-after-forward -m limit –limit 3/min –limit-burst 10 -j ULOG –ulog-prefix “[UFW BLOCK FORWARD]: “
Если все нормально, можно снимать комментарий со строк, отвечающих за работу с MySQL. В пакете ulogd-mysql имеется файл /usr/share/doc/ulogd-mysql/mysql.table
предназначенный для создания таблиц в MySQL. Но разработчики NuLog
предлагают свой файл, который и необходимо использовать. Теперь все
готово к установке NuLog2.
Установка NuLog2
Для установки и работы NuLog2 потребуется ряд пакетов. В Ubuntu установить их можно командой:
Разработчики в документации приводят вместо apt-get - aptitude, но в первом случае будет скачано всего 45 Мб архивов, вместо 154 Мб при использовании aptitude.
Актуальной версией на момент написания этих строк являлась 2.1.3,
датирована декабрем 2008 года, которую и будем устанавливать. Архивы с
исходными текстами доступны по адресу http://software.inl.fr/releases/Nulog2/. Скачиваем и распаковываем обычным образом. Создаем базу данных и учетную запись.
[AD]
$ mysql -uroot -prootpassword > CREATE DATABASE ulogd;
> GRANT ALL PRIVILEGES ON ulogd.* TO ‘user’@'localhost’ IDENTIFIED BY ‘pass’;
В подкаталоге scripts архива находятся файлы для создания таблиц. Для IPv4 сети выбираем файл ipv4.sql:
$ mysql -uuser -ppass ulogd < ./scripts/ipv4.sql
Для улучшения производительности можно использовать триггеры,
которые будут задействованы при вставке данных в некоторые таблицы
(usersstats, offenders, tcp_ports, udp_ports):
$ mysql -uroot -ppass ulogd < ./scripts/triggers.py
В ранних версиях MySQL (< 5.0.32) перед запуском скрипта следует удалить строку:
DROP TRIGGER IF EXISTS update_cache;
Иначе получим ошибку.
Перезапускаем ulogd, чтобы он начал собирать данные в базу: $ sudo /etc/init.d/ulogd restart
Чтобы установить Nulog2 достаточно выполнить скрипт setup.py, находящийся в дистрибутиве: $ sudo ./setup.py install
И затем для сборки документации $ make
Теперь можно приступать к настройкам. Конфигурационные файлы Nulog2 находятся в каталоге /etc/nulog, внутри имеется несколько файлов, три из которых основные: default.wrapper.conf, default.core.conf’ и default.nulog.conf. Чтобы их активировать, нужно убрать префикс default из имени - wrapper.conf, core.conf’ и nulog.conf.
NuLog2 для визуаплизации и вывода данных использует собственный веб-сервер, настройки которого указываются в wrapper.conf.
Далее для создания рабочего окружения запускаем скрипт install_defconf.sh.
$ ./script/install_defconf.sh
Скрипт задаст несколько вопросов по размещению рабочего каталога и
конфигурационных файлов NuLog и NuFW. В большинстве случаев можно
использовать настройки, предлагаемые по умолчанию.
Параметры подключения к MySQL описываются в файле core.conf:
[Sessions]
# разрешение на анонимное подключение anonymous=yes [Misc]
# формат даты datetime=%%y-%%m-%%d %%H:%%M:%%S
# Интеграция с панелью дистрибутива Edenwall (http://www.edenwall.com), можно просмотреть в NuFW.Live edenwall_integration=0
Разработчики приготовили стартовый скрипт для более удобного запуска
NuLog2. Копируем его в нужное место и создаем необходимые ссылки для
автоматической загрузки.
Набираем в веб-браузере http://localhost:8080/nulog/ и попадаем на главную страницу.
Интерфейс NuLog2 сразу после установки
Чтобы разобраться с возможностями Nulog2 потребуется от силы 5 минут. Все достаточно просто и понятно.
В NuLog2 реализованы функции поиска по нескольким параметрам
В итоге мы получили систему, которая позволяет отслеживать сетевые
события. Конечно чтобы полностью оценить возможности NuLog2 потребуется
установить и настройить NuFW, что позволит не только разрешать выход в
Интернет по учетным записям, а не IP-адресам, но и привязать события к
конкретному пользователю или приложению.
Интерфейс NuLog2 легко видоизменить
Аутентификация пользователя в NuLog2
В настоящий момент NuLog2 не имеет никаких
средств аутентификации пользователей. Доступ к статистике можно
ограничить несколькими способами: параметром address в файле
wrapper.conf, который будет указывать на внутренний интерфейс,
правилами iptables/NuFW разрешающими доступ к нужному порту только с
определенных адресов или пользователей. Разработчики предлагают для
этих целей использовать веб-сервер, который будет отсылать HTTP
заголовок “Nulog_User” включающий имя пользователя.
Для Apache можно записываем в конфигурационный файл /etc/apache2/apache2.conf следующие директивы.
ServerName nulog
ProxyPreserveHost Off
ProxyPassReverse /nulog http://localhost:8080/nulog
Allow from all
AuthType Basic
AuthName nulog
AuthUserFile /etc/apache2/users
AuthBasicProvider file
Require valid-user
RewriteEngine on
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule /nulog(.*) http://localhost:8080/nulog$1 [P,E=RU:%1]
RewriteRule /nulog(.*) http://localhost:8080/nulog$1 [P]
RequestHeader set Nulog_User %{RU}e
RequestHeader unset Authorization
Далее создаем учетные записи при помощи htpasswd.
Тем же, кто решил установить самую
последнюю версию ulogd, приведу краткую инструкцию по компиляции.
Возможности во второй версии несколько шире. Так уже реализовано три
типа плагинов: источник, фильтр и вывод. Плагины комбинируются в стэк
(stack), которые собственно и указывают, что нужно делать демону. То
есть теперь чтобы захватить и вывести данные в файл необходимо явно
задавать: stack=log1:NFLOG,op1: LOGEMU
Иначе получим ошибку вроде: Mon Dec 29 21:53:14 2008 <8> ulogd.c:1102 not even a single working plugin stack
Означающую, что ulogd попросту не знает, что ему делать.
В стек может входить только по одному плагину источника и вывода.
Количество фильтров неограничено. Конфигурация может содержать
несколько стеков, поэтому отбор нужной информации можно настроить
действительно тонко.
Кроме этого в ulogd2 используются несколько измененная схема SQL, в
которой данные разделены на несколько таблиц (вместо одной в ulogd),
что дает возможность легко добавить дополнительную информацию создав
новую таблицу. В отличие от ulogd1 вторая версия построена таким
образом, что изменение схемы SQL никак не повлияет на его работу. Кроме
ULOG поддерживается и NFLOG.
Для сборки кроме самого архива с исходными кодами потребуются самые последние версии библиотек – libnfnetlink, libnetfilter_log (захват пакетов) и libnetfilter_conntrack (захват потока conntrack), которые можно скачать по ссылкам на странице http://www.netfilter.org/projects.
Некоторые из этих библиотек есть в репозитарии, но их версия
существенно отстает от требуемой. В случае возникновения проблем
конфигурационный скрипт самостоятельно укажет, что ему не хватает. checking for LIBNETFILTER_CONNTRACK… no
configure: error: Cannot find libnetfilter_conntrack >= 0.0.95
Компилляция библиотек стандартна: $ ./configure
$ make
$ sudo make install
Для удобства можно собрать deb-пакет, воспользовавшись инструкцией The Ubuntu Packaging Guide (https://help.ubuntu.com/6.10/ubuntu/packagingguide/C/).
Если в процессе конфигурирования ulogd будут получены сообещния вроде: configure: WARNING: mysql.h not found
checking for mysql_close in -lmysqlclient… no
configure: WARNING: libmysqlclient.so not found
Это означает, что нет заголовочных файлов для активации поддержки
MySQL. Так как для работы NuLog2 такой модуль необходим,
доустанавливаем пакет в котором находятся нужные файлы. $ sudo aptitude install libmysqlclient15-dev
На момент написания этих строк была актуальной версия ulogd-2.0.0beta2,
при использовани которой могут появляться разного рода ошибки. Поэтому
лучше использовать более “свежую” svn/git версию. В этом случае для
сборки кроме собственно “build-essential” и “ subversion” в Ubuntu потребуются установить еще ряд пакетов: $ sudo apt-get install autoconf automake1.9 libtool
Далее как обычно. $ svn co https://svn.netfilter.org/netfilter/branches/ulog/ulogd2
$ cd ulogd2
~/ulogd2$ ./autogen.sh; ./configure; make; sudo make install
Так как по умолчанию установка производится в /usr/local, следует указать путь к /usr/local/lib/ulogd в файле /etc/ld.so.conf, чтобы динамические библиотеки были видны.
Кроме этого необходимо вручную перенести конфигурационные файлы и создать ссылки для запуска: $ sudo cp -v ulogd.conf /usr/local/etc/ulogd.conf
$ sudo cp -v ulogd.logrotate /etc/logrotate.d/ulogd
$ sudo cp -v ulogd.init /etc/init.d/ulogd
$ sudo ln –s /etc/init.d/ulogd /etc/rcS.d/S99ulogd
После настроек советую в первый раз запустить демон в консоли, чтобы просмотреть возможные ошибки. $ sudo /usr/local/sbin/ulogd