Рубрика:
Веб /
Веб-технологии
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
СЕРГЕЙ ЯРЕМЧУК
Анализируем трафик с Nulog2
Рассмотрим настройку веб-интерфейса NuLog2, позволяющего администратору в удобном виде просматривать информацию о соединениях, проходящих через Netfilter и uFW.
Проект NuLog2
В GNU/Linux все сетевые пакеты проходят через Netfilter, в силу чего он и обладает самой достоверной информацией о количестве переданных и принятых данных. В 2000 году Гаральдом Велте (Harald Welte) был написан патч к ядру – ULOG (Userspace Logging), позволяющий получать эту информацию в пространстве пользовательских процессов (user space) в удобном виде. Несмотря на то что «добраться» до нужных данных теперь стало на порядок проще, администраторам приходилось самостоятельно решать проблему их съема, обработки и выдачи в нужном виде. Как результат появилось несколько проектов, решающих эти проблемы. Некоторые обеспечивали понятный интерфейс к получению данных с ULOG, например, демон ulogd [1], написанный самим Гаральдом Велте, specter [2], построенный на базе ulogd 1.02, и ulog-acctd [3]. Стоит заметить, что основные разработки представленных проектов датированы 2005 годом, правда, это не мешает их полноценно использовать и до сих пор. И только ulogd, о возможностях которого будем говорить по ходу статьи, недавно начал опять активно развиваться. Другие проекты нацелены на выдачу информации, полученной при помощи программ первой группы в удобной форме – scanulog, ulog-monitor, Webfwlog и Nulog2. Возможностям последнего и посвящена статья.
Проект NuLog2 [4] является дальнейшим развитием PHP-интерфейса к ulogd и NuFW [5]– 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 [6], который выполнен в формате LiveCD, основанном на KNOPPIX. Мы же рассмотрим установку его на рабочую систему на примере Ubuntu 8.04 LTS, хотя много из сказанного применимо и для других дистрибутивов.
Для регистрации событий необходим модуль ядра ipt_ULOG.o, который появился в ядре начиная с версии 2.4.18-pre8. Тому, кто использует более ранний релиз ядра, следует его обновить или установить патч ulog-patch с netfilter patch-o-matic. Ядро, используемое в Ubuntu 8.04 по умолчанию:
$ uname -r
В параметрах сборки 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
В репозитарии Ubuntu имеются нужные пакеты для установки ulogd. Но следует знать, что сегодня существует две ветки: стабильная 1.2x и находящаяся пока в стадии разработки ulogd-2.x. Последняя имеет несколько больше встроенных модулей, кроме этого, в ней реализована система фильтров (подробнее во врезке «Сборка ulogd2 в Ubuntu»). Для работы NuLog2 достаточно и релиза 1.23 (апрель 2005 года), который и доступен в репозитарии Ubuntu.
$ sudo apt-cache showpkg ulogd | grep -i versions
Устанавливается стандартно:
$ sudo aptitude install ulogd ulogd-mysql
По умолчанию ulogd сохраняет данные в файл текстового формата, подключив плагины, можно добавить поддержку записи в базы данных MySQL, PostgreSQL, SQLLite3, файл формата PCAP/Tcpdump или syslog. Для работы NuLog2 в выбранном варианте необходима поддержка MySQL, модули для работы с которой как раз и находятся во втором пакете.
Интерфейс NuLog2 сразу после установки
Конфигурационный файл по умолчанию находится в /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
И проверяем:
$ 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=0x00
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 предлагают свой файл, который и необходимо использовать. Работа с NuFW ранних версий описана в [5], поэтому останавливаться на этом вопросе не буду. Тем более что NuFW для NuLog2 идет как опциональный компонент. Теперь все готово к установке NuLog2.
Установка 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.
В NuLog2 реализованы функции поиска по нескольким параметрам
Скачиваем и распаковываем обычным образом. Создаем базу данных и учетную запись.
$ mysql -uroot -prootpassword
> CREATE DATABASE ulogd;
> GRANT ALL PRIVILEGES ON ulogd.* TO 'user'@'localhost' IDENTIFIED BY 'pass';
$ 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 легко видоизменить
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 содержит настройки, актуальные для веб-интерфейса (их скорее всего трогать не придется).
# 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/ и попадаем на главную страницу.
Использование NuFW расширяет возможности NuLog2
Чтобы разобраться с возможностями Nulog2, потребуется от силы 5 минут. Все достаточно просто и понятно.
Итог
Мы получили систему, которая позволяет отслеживать сетевые события. Конечно, чтобы полностью оценить возможности NuLog2, потребуется установить и настроить NuFW, что позволит не только разрешать выход в Интернет по учетным записям, а не IP-адресам, но и привязать события к конкретному пользователю или приложению.
Приложение
Аутентификация пользователя в NuLog2
В настоящий момент NuLog2 не имеет никаких средств аутентификации пользователей. Доступ к статистике можно ограничить несколькими способами: параметром address в файле wrapper.conf, который будет указывать на внутренний интерфейс, правилами iptables/NuFW, разрешающими доступ к нужному порту только с определенных адресов или пользователей. Разработчики предлагают для этих целей использовать веб-сервер, который будет отсылать HTTP-заголовок Nulog_User, включающий имя пользователя.
Для веб-сервера Apache записываем в конфигурационный файл /etc/apache2/apache2.conf следующие директивы (см. листинг).
<VirtualHost *>
ServerName nulog
ProxyPreserveHost Off
ProxyPassReverse /nulog http://localhost:8080/nulog
<Location /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
</Location>
</VirtualHost>
Далее создаем учетные записи при помощи htpasswd.
Сборка ulogd2 в Ubuntu
Тем же, кто решил установить самую последнюю версию 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
- Сайты проекта ulogd – http://www.gnumonks.org/projects, http://www.netfilter.org/projects/ulogd.
- Сайт проекта specter – http://joker.linuxstuff.pl/specter.
- Сайт проекта ulog-acctd – http://alioth.debian.org/projects/pkg-ulog-acctd.
- Сайт проекта NuLog2 – http://software.inl.fr/trac/wiki/EdenWall/NuLog.
- Яремчук С. Шлюз аутентификации пользователей NuFW. //Системный администратор, №3, 2006 г. – С. 46-50.
- LiveCD, демонстрирующий возможности NuFW – http://live.nufw.org.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|