Статья написана для журнала
В статье рассмотрим настройку веб-интерфейса NuLog2 позволяющего администратору в удобном виде просматривать информацию о соединениях проходящие через Netfilter и NuFW.
В GNU/Linux все сетевые пакеты проходят через Netfilter в силу чего он и обладает самой достоверной информацией о количестве переданных и принятых данных. В 2000 году Гаральдом Велте (Harald Welte) был написан патч к ядру – ULOG (Userspace Logging) позволяющий получать эту информацию в пространстве пользовательских процессов (user space) в удобном виде. Не смотря на то, что “добраться” теперь до нужных данных стало на порядок проще, администраторам приходилось самостоятельно решать проблему их съема, обработки и выдачи в нужном виде. Как результат появилось нескольких проектов, решающих эти проблемы. Одни обеспечивали понятный интерфейс к получению данных с ULOG. Это демон написанный самим Harald Welte, построенный на базе ulogd 1.02 и . Стоит заметить, что основные разработки представленных проектов датированы 2005 годом, правда это не мешает их полноценно использовать и до сих пор» вероятно. И только ulogd, о возможностях которого будем говорить по ходу статьи, недавно начал опять активно развиваться. Другие проекты нацелены на выдачу информации полученной при помощи программ первой группы в удобной форме – scanulog, ulog-monitor, Webfwlog и 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 нет.
Познакомиться с возможностями Nulog2 (а также NuFW и интерфейса для его настройки Nuface) можно в дистрибутиве , который выполнен в формате LiveCD основанном на KNOPPIX. Мы же рассмотрим установку его на рабочую систему на примере Ubuntu 8.04 LTS, хотя много из сказанного применимо и для других дистрибутивов.
Для регистрации событий необходим модуль ядра ipt_ULOG.o, который появился в ядре начиная с версии 2.4.18-pre8. Кто использует более ранний релиз ядра, следует его обновить или установить патч ulog-patch с netfilter patch-o-matic. Ядро используемое в Ubuntu 8.04 по умолчанию:
$ uname -r
2.6.24-16-generic
В параметрах сборки ULOG активирован:
$ grep -i ulog /usr/src/linux/.config
CONFIG_BRIDGE_EBT_ULOG=m
CONFIG_IP_NF_TARGET_ULOG=m
Забегая чуть вперед, скажу, что после загрузки демона ulogd в списке “lsmod” должен появиться нужный модуль:
$ lsmod | grep –i ulog
ipt_ULOG 10116 2
В репозитарии Ubuntu нужные пакеты для установки ulogd имеются. Но следует знать, что сегодня существует две ветки: стабильная 1.2x и находящаяся пока в стадии разработки ulogd-2.x. Последний имеет несколько больше встроенных модулей, кроме этого в нем реализована система фильтров (подробнее). Для работы NuLog2 достаточно и релиза 1.23 (апрель 2005), который и доступен в репозитарии Ubuntu.
$ sudo apt-cache showpkg ulogd | grep -i versions
Versions: 1.23
Устанавливается стандартно:
$ sudo aptitude install ulogd ulogd-mysql
По умолчанию 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 и по умолчанию выглядят так:
$ cat /etc/ufw/after.rules
…
# catchall for logging
-A ufw-after-input -m limit –limit 3/min –limit-burst 10 -j LOG –log-prefix «[UFW BLOCK INPUT]: »
-A ufw-after-forward -m limit –limit 3/min –limit-burst 10 -j LOG –log-prefix «[UFW BLOCK FORWARD]: «
Чтобы переключить их на 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]: «
Теперь включаем регистрацию:
$ sudo ufw logging on
Logging enabled
И проверяем:
$ sudo iptables -L -n | grep ULOG
Logging enabled
ULOG all — 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 10 ULOG copy_range 0 nlgroup 1 prefix `[UFW BLOCK FORWARD]: ‘ queue_threshold 1
ULOG all — 0.0.0.0/0 0.0.0.0/0 limit: avg 3/min burst 10 ULOG copy_range 0 nlgroup 1 prefix `[UFW BLOCK INPUT]: ‘ queue_threshold 1
Перезапускаем демон ulogd:
$ sudo /etc/init.d/ulogd restart
Паралелльно проверяем записи в файле журнала:
$ tail -f /var/log/ulog/syslogemu.log
Dec 23 21:56:06 router FORWARD IN=eth0 OUT=eth1 MAC=00:e0:4d:07:c2:03:00:1d:60:9a:b8:8e:08:00 SRC=192.168.1.195 DST=192.168.0.1 LEN=48 TOS=00 PREC=0×00 TTL=127 ID=26261 DF PROTO=TCP SPT=1135 DPT=8080 SEQ=508149838 ACK=0 WINDOW=65535 SYN URGP=0
Если все нормально, можно снимать комментарий со строк, отвечающих за работу с MySQL. В пакете ulogd-mysql имеется файл /usr/share/doc/ulogd-mysql/mysql.table предназначенный для создания таблиц в MySQL. Но разработчики NuLog предлагают свой файл, который и необходимо использовать. Теперь все готово к установке NuLog2.
Для установки и работы NuLog2 потребуется ряд пакетов. В Ubuntu установить их можно командой:
$ sudo apt-get install python2.4 python-twisted python-nevow python-matplotlib gettext python-soappy python-mysqldb python-cairo python-ipy python-numpy python-docutils
Разработчики в документации приводят вместо apt-get – aptitude, но в первом случае будет скачано всего 45 Мб архивов, вместо 154 Мб при использовании aptitude.
Актуальной версией на момент написания этих строк являлась 2.1.3, датирована декабрем 2008 года, которую и будем устанавливать. Архивы с исходными текстами доступны по адресу http://software.inl.fr/releases/Nulog2/. Скачиваем и распаковываем обычным образом. Создаем базу данных и учетную запись.
$ 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.
[server]
port=8080
vardir = /var/lib/nucentral/
address = 0.0.0.0
# список модулей
[modules]
nulog-core=yes
nulog-web=yes
auth=yes
Далее для создания рабочего окружения запускаем скрипт install_defconf.sh.
$ ./script/install_defconf.sh
Скрипт задаст несколько вопросов по размещению рабочего каталога и конфигурационных файлов NuLog и NuFW. В большинстве случаев можно использовать настройки, предлагаемые по умолчанию.
Параметры подключения к MySQL описываются в файле core.conf:
# Database configuration
[DB]
host=localhost
db=ulog
user=user
password=pass
# Тип БД mysql/pgsql
dbtype=mysql
# Тип sql scheme ulog/triggers
type=triggers
ip=4
table=ulog
Файл nulog.conf содержит настройки актуальные для веб-интерфейса (их скорее всего трогать не придется).
[Links]
# URL для доступа к основной странице
url=/nulog/
# Заголовок веб-страницы
maintitle=Log ULOG
# Использование Nuface2 ACLs
# nuface_acl=https://localhost/nuface/%%s.php?acl=%%s
[Sessions]
# разрешение на анонимное подключение
anonymous=yes
[Misc]
# формат даты
datetime=%%y-%%m-%%d %%H:%%M:%%S
# Интеграция с панелью дистрибутива Edenwall (http://www.edenwall.com), можно просмотреть в NuFW.Live
edenwall_integration=0
Разработчики приготовили стартовый скрипт для более удобного запуска NuLog2. Копируем его в нужное место и создаем необходимые ссылки для автоматической загрузки.
$ sudo cp –v ./debian/init.d /etc/init.d/nulog
$ sudo ln –s /etc/init.d/nulog /etc/rcS.d/nulog
И запускаем:
$ sudo /etc/init.d/nulog restart
Или чтобы получить больше отладочной информации:
$ sudo twistd -noy /usr/sbin/nulog.tac
Набираем в веб-браузере http://localhost:8080/nulog/ и попадаем на главную страницу.

Интерфейс NuLog2 сразу после установки
Чтобы разобраться с возможностями Nulog2 потребуется от силы 5 минут. Все достаточно просто и понятно.

В NuLog2 реализованы функции поиска по нескольким параметрам
В итоге мы получили систему, которая позволяет отслеживать сетевые события. Конечно чтобы полностью оценить возможности NuLog2 потребуется установить и настройить NuFW, что позволит не только разрешать выход в Интернет по учетным записям, а не IP-адресам, но и привязать события к конкретному пользователю или приложению.

Интерфейс 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.

Использование NuFW расширяет возможности NuLog2
Тем же, кто решил установить самую последнюю версию 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