Сергей Яремчук
Шлюз аутентификации пользователей NuFW
Фильтрация IP-пакетов является простым, эффективным и поэтому основным средством защиты сетей. Но в то же время такому подходу явно не хватает детализации, а удаленность от прикладного уровня требует согласования с другими инструментальными средствами безопасности.
Чтобы удовлетворять всем требованиям безопасности, сегодняшние системы должны работать на уровне пользователей. Но классическая схема основывается на предположении: один пользователь один компьютер один IP-адрес. То есть системный администратор для решения проблемы управления пользователями фактически должен работать на IP-уровне. В простейшем случае это решается статическим закреплением IP-адреса, что может быть эффективно только в небольших сетях.
В то же время сегодня довольно обычна ситуация, когда несколько пользователей используют одну и ту же многопользовательскую систему, и в таком случае установленные правила будут действовать для всех работающих в одной системе одинаково.
Один из вариантов решения проблемы описан в [8]. Проект NuFW (Now User Filtering Works) предлагает несколько иной подход к решению – «authenticating gateway». NuFW позволяет проводить аутентификацию пользователя для каждого соединения, пытающегося получить доступ к межсетевому экрану и некоторым другим сервисам сети. Фактически после аутентификации всегда можно однозначно сказать, что в данный момент времени 192.168.0.2 = Вася Пупкин. Такой подход позволяет не только ограничивать доступ, тонко реализуя политику безопасности, но и регистрировать деятельность, выполнять подсчет трафика, выставлять различное значение QoS (Quality of Service), осуществлять маршрутизацию, динамически изменять списки контроля доступа, опираясь на данные пользователя, а не на IP.
Также правила фильтрования могут в этом случае использовать и данные о приложениях, операционной системе, используемых клиентом (рис. 1).
Рисунок 1. NuFW позволяет делать фильтрацию по IP-адресам, пользователям, приложениям и операционной системе
Хотелось бы отметить, что проект относительно молодой. Сама идея возникла в 2001 году при попытке добавить поддержку LDAP к прокси, обеспечивающему безопасный доступ к telnet/ftp-сервисам. Исходный проект имел название Net Security Master (сейчас GateKeeper). Рабочая альфа-версия NuFW была представлена общественности в июле 2003 г., а первый релиз через два года – в марте 2005 г. Поэтому проекту могут быть присущи болезни молодости, и иногда возникают проблемы с безопасностью, например сообщение о возможности DOS-атаки [4].
Принцип работы
В основе работы NuFW лежит взаимодействие с Netfilter – механизмом фильтрации сетевых пакетов, появившимся в ядре Linux в версии 2.4. Поэтому в настоящее время такой шлюз аутентификации может работать только на Linux, хотя разработчики планируют разработку NuFW и для других операционных систем, в первую очередь BSD.
Для обеспечения услуг доступа используются два демона, которые могут быть запущены на разных компьютерах. Сервер аутентификации – nuauth и работающий на шлюзе – nufw.
Последний обеспечивает связь с Netfilter через цель «-j QUEUE», и таким образом осуществляется фильтрация трафика (рис. 2).
Рисунок 2. Принцип работы NuFW
Стоит отметить, что в ядре 2.6.14 появилась новая, более мощная опция NFQUEUE, что позволяет совместно с NuFW использовать, например, и IDS Snort в режиме inline (системы остановки атак). На остальных компьютерах должны быть установлены клиентские программы, при помощи которых будет осуществляться аутентификация. Такие программы доступны для Linux, FreeBSD, MacOS X и Windows. Когда клиент пытается отправить пакет через межсетевой экран или шлюз, демон nufw связывается с демоном nuauth, который подтверждает либо отрицает полномочия пользователя. При этом фактически внимание уделяется первой фазе установления соединения, т.е. SYNпакетам.
Начиная с версии 1.1.0 обмен между клиентами и nuauth ведется в UTF-8 (если при конфигурировании использовалась опция «--with-utf8»).
Система аутентификации пользователя выполнена в виде модуля. Демон nuauth для аутентификации пользователей и групп может использовать сервер LDAP, PAM/NSS, базу в формате DBM, обычный текстовый файл или список системных пользователей. NuFW различает протоколы, поэтому можно установить, какие из групп будут иметь доступ к только электронной почте, а какие могут пользоваться http, ftp и другими сервисами.
Единственное ограничение NuFW заключается в том, что пока фильтруется только TCP, но в будущем планируется работа с UDP и ICMP.
Если пользователь принадлежит к группам с противоречивыми настройками, nuauth может быть настроен на разный вариант разрешения ситуации.
Для регистрации действий пользователей применяется syslog, или базы данных MySQL и PostgreSQL. В случае использования базы данных такая система способна сохранить более подробную информацию.
Все соединения по умолчанию закрываются при помощи SSL, что решает проблему спуфинга адресов и раскрытия пароля. Хотя в более ранних версиях протокола на участке клиент – nuauth использовалась только открытая передача данных (на рис. 2 показано оранжевым цветом). Кроме пароля для доступа пользователи могут использовать и TLS (Transport Layer Security) сертификаты.
Но это еще не все. В настоящее время разработаны модули для веб-сервера Apache и Squid, позволяющие им работать совместно с системой NuFW. Пользователь в этом случае будет аутентифицирован только один раз. Такой метод прозрачной аутентификации назван SSO (Single Sign On). Работает система следующим образом: пользователь получает доступ к межсетевому экрану обычным образом и попадает на сервер. Модуль SSO, работающий на сервере, зная параметры связи, запрашивает в базе данных соответствующий вход для каждой связи. Если пользователь аутентифицирован, то доступ к сервису разрешается.
NuFW – полностью открытый проект, все компоненты, за исключением клиента под Windows, распространяются под лицензией GNU GPL v2, протокол полностью документирован [5].
Установка NuFW
Для установки NuFW вам потребуются последние версии: glib2.0, gpg-error, gcrypt, gnutls, cyrus-sasl, gdbm, libident, libpam.
Дистрибутив NuFW на сайте проекта доступен только в исходных текстах, хотя в архивах [6] и им подобных можно найти пакеты для Debian и некоторых rpm-дистрибутивов (для ALTLinux в Сизифе пакетов на момент написания статьи не было). Если планируется контроль над полосой пропускания и QoS, необходима перекомпиляция ядра с патчами ip_queue_vwmark и CONNMARK, которые входят в комплект patchomatic [7].
# KERNEL_DIR=/usr/src/linux IPTABLES_DIR=/home/sergej/src/iptables./runme ip_queue_vwmark
# KERNEL_DIR=/usr/src/linux IPTABLES_DIR=/home/sergej/src/iptables./runme CONNMARK
После чего нужно пересобрать ядро, модули и утилиты iptables.
На момент написания статьи последней версией пакета NuFW была 1.0.20. Кроме того, доступен нестабильный релиз 1.1.3, в котором клиентская утилита nutcpc начала работать в среде ОС FreeBSD и Mac OS X. При конфигурировании доступен ряд опций. Вот некоторые из них:
- --with-user-mark – поддержка маркировки пользователя в NuFW;
- --with-mysql-log, --with-pgsql-log – регистрация поддержки пользователя в соответствующей базе данных;
- --with-system-auth, --with-ldap, with-gdbm, --with-ident – поддержка соответствующих методов аутентификации пользователей (для текстового режима опций указывать не надо).
Выбираем необходимые опции и конфигурируем.
$ ./configure --with-ldap --with-system-auth --with-mysql-log --sysconfdir=/etc/nufw/ --prefix=/usr --with-debug
Дальше обычная компиляция.
$ make
# make install
К сожалению, во время установки не создаются необходимые каталоги и не копируются файлы, поэтому вам придется сделать это самим.
# mkdir /etc/nufw/
Настраиваем nuauth
Теперь конфигурационный файл для демона nuauth – /etc/nufw/nuauth.conf. Приведу только основные параметры. Копируем его на место и конфигурируем.
# cp conf/nuauth.conf /etc/nufw/
# vi /etc/nufw/nuauth.conf
# Файл /etc/nufw/nuauth.conf
# Адрес, на котором демон nuauth будет принимать клиентов, в нашем случае со всех доступных адресов
nuauth_client_listen_addr="0.0.0.0"
# IP-адрес, на котором nuauth слушает пакеты nufw
nuauth_nufw_listen_addr="127.0.0.1"
# Порт для запросов nufw
nuauth_gw_packet_port=4129
# Порт для пакетов аутентификации пользователей
nuauth_user_packet_port=4130
# Адрес и порт nufw маршрутизатора, на котором он будет ожидать ответ в незащищенном UDP, – это локальный адрес.
# В TLS-режиме это может быть список адресов
# nufw_gw_addr="192.168.75.1 192.168.75.254"
nufw_gw_addr="127.0.0.1"
nufw_gw_port=4128
# Что делать в том случае, когда пользователь является членом групп с противоречивыми установками
# (0 - нет, 1 - разрешить)
nuauth_prio_to_nok=1
# Аутентификация может работать в двух режимах.
# POLL: клиент отправляет пакет в каждом случае, когда требуется аутентификация в этом режиме,
# трафик меньше, поэтому он может использоваться для удаленных либо сильно загруженных сетей
# PUSH: демон nuauth посылает предупреждение клиенту о необходимости аутентификации (лучшее время отклика)
nuauth_push_to_client=1
# Ограничения регистрации пользователей
# 0 : без ограничений (по умолчанию)
# 1 : один вход для пользователя
# 2 : один вход для IP
# nuauth_connect_policy=1
# Для клиентов, не поддерживающих протокол NuFW, или если его применение затруднено, например, использованием NAT
# или межсетевых экранов, разделяющих сети, применяется аварийная (hello) аутентификация, базирующаяся только
# на IP и поддерживающая только одного пользователя. Такой способ работает для всех типов потоков IP
nuauth_hello_authentication=0
nuauth_do_ip_authentication=0
# Модуль аутентификации пользователей (libldap, dbm, plaintext, system)
nuauth_user_check_module=»libdbm»
# Модуль списков контроля доступом (libldap, libplaintext)
nuauth_acl_check_module=»libplaintext»
nuauth_acl_cache=1
# Модуль IP-аутентификации (libipauthident, rpc)
nuauth_ip_authentication_module="libipauthident"
# Ниже перечислены файлы для хранения сертификатов и ключей.
# Cекретный ключ сервера (по умолчанию CONFIGDIR/nuauth.pem)
nuauth_tls_key="/etc/nufw/nuauth.pem"
# Сертификаты сервера
nuauth_tls_cert="/etc/nufw/nuauth-cert.pem"
nuauth_tls_cacert="/etc/nufw/NuFW-cacert.pem"
# Использование клиентом сертификата вместо пароля
nuauth_tls_request_cert=0
# Регистрация событий: «mysql», «pgsql», «syslog»
nuauth_user_logs_module="syslog"
# Регистрация деятельности пользователей: syslog, mysql, script. В последнем случае при подключении пользователей
# будет запущен скрипт, лежащий в CONFDIR/user-up.sh и при разъединении CONFDIR/user-down.sh
nuauth_user_session_logs_module="syslog mysql"
# Списки пользователей и ACL при использовании для аутентификации текстовых файлов
plaintext_userfile="/etc/nufw/users.nufw"
plaintext_aclfile="/etc/nufw/acls.nufw"
# Преобразование имени пользователя в верхний регистр
# system_convert_username_to_uppercase=0
Также в файле можно указать время, через которое будет производиться повторная аутентификация пользователя, время ожидания подтверждения от клиента и количество повторных запросов в случае неудачи. А также время хранения списков доступа в кэше, максимальное количество клиентов и серверов nufw, параметры доступа к серверам LDAP, MySQL и PostgreSQL и уровень регистрации событий, и другие параметры.
Последние настройки и запуск
В составе дистрибутива в подкаталоге certs имеются готовые сертификаты, предназначенные для тестирования, там же лежат и сертификаты разработчиков. Копируем их в /etc/nufw/. Для nufw:
# cp conf/certs/nufw-* /etc/nufw/
И для nuauth:
#cp conf/cert/nuauth*.pem /etc/nufw/
#cp conf/cert/NuFW*.pem /etc/nufw/
В рабочей системе создадим свои сертификаты.
# openssl req –new –x509 –nodes –days 365 –out /etc/nufw/nuauth-cert.pem –keyout /etc/nufw/nuauth.pem
# openssl req –new –x509 –nodes –days 365 –out /etc/nufw/nufw-cert.pem –keyout /etc/nufw/nufw-key.pem
Файл users.nufw содержит списки пользователей. Записи в нем состоят из строк вида:
Username: passwd:uid:gid[,gid,gid]
Обратите внимание, в файл заносится пароль в чистом виде, а не хэш. Это не совсем хорошо с точки зрения безопасности, но при установке соответствующих прав в данном случае в принципе приемлемо. Например:
sergej:passwd1:1:102
admin:admin_passwd:2:100,102,103
Для отключения пользователя достаточно добавить какой-либо знак к паролю (обычно «*» или «!»). Списки контроля доступа в этом случае хранятся в файле acls.nufw, в котором вы найдете их подробное описание. Например, для доступа к ssh для пользователей Linux, входящих в группы 100 и 102 с любого адреса, пишем такое правило.
[ssh]
decision=1
gid=100, 102
proto=6
SrcIP=0.0.0.0/0
SrcPort=1024-65535
DstIP=0.0.0.0/0
DstPort=22
App=/usr/bin/ssh
OS=Linux
Для доступа к сервисам без ограничений группе 100.
[full]
decision=1
gid=100
proto=6
SrcIP=0.0.0.0/0
SrcPort=1024-65535
DstIP=0.0.0.0/0
Большая часть параметров очевидна, «proto=6» означает TCP, «decision» позволяет указать варианты правил, если правила пересекаются. В качестве параметров IP могут быть указаны как отдельные адреса сети, так и список, разделенный запятой. В правила можно добавить разрешенные время и день работы.
Для формирования файла DBM используется утилита nufw_dbm, но в случае большого числа пользователей все же удобней применять LDAP, для которого правила формируются при помощи скрипта nuaclgen. При этом информация о соединении LDAP должна быть записана в файл nuaclgen.conf.
Правило для ssh в этом случае задается так.
#nuaclgen.pl –A cn=ssh,ou=Acls,dc=inl,dc=fr –p 6 –dport 22 –AppName "/usr/bin/ssh" –j ACCEPT –g 100
Кроме того, на сайте [3] можно найти Nuface, представляющий веб-интерфейс для создания правил для Netfilter, в том числе и без поддержки NuFW при помощи скрипта nupyf.py, который можно запускать и вручную. Демонстрационная версия Nuface доступна по адресу [9].
Далее проверяем загрузку модуля ядра.
# /sbin/lsmod | grep ip_queue
ip_queue 10520 0
При необходимости загружаем его при помощи команды:
# /sbin/modprobe ip_queue
Добавляем правило в iptables (в документации и на сайте [2] приведено большое количество конфигураций).
# /sbin/iptables –A OUTPUT –s 192.168.0.0/24 –p tcp –dport 22 –m state –state NEW –syn –j QUEUE
# /sbin/iptables –A OUTPUT –m state –state ESTABLISHED,RELATED –j ACCEPT
Запускаем nuauth:
# /usr/sbin/nuauth –vvvvvvvvv
При необходимости загружаем его при помощи команды:
# /sbin/modprobe ip_queue
Добавляем правило в iptables (в документации и на сайте [2] приведено большое количество конфигураций).
# /sbin/iptables –A OUTPUT –s 192.168.0.0/24 –p tcp –dport 22 –m state –state NEW –syn –j QUEUE
# /sbin/iptables –A OUTPUT –m state –state ESTABLISHED,RELATED –j ACCEPT
Запускаем nuauth:
# /usr/sbin/nuauth –vvvvvvvvv
** Message: debug_level is 9
** Message: Starting nuauth
** Message: Auth (user) module: plaintext
** Message: ACL module: libplaintext
** Message: User logs module: syslog
** Message: creating acl cache thread
** Message: Creating search_and_fill thread
** Message: Creating 3 acl checkers
** Message: Creating 3 user checkers
** Message: Creating 2 user loggers
** Message: Creating tls authentication server thread
** Message: Creating tls nufw server thread
** Message: Threads system started
|
И nufw:
#/usr/sbin/nufw –D –vvvv –d 127.0.0.1 –p 4129
В комплект дистрибутива входят консольный клиент, работающий под управлением Linux, FreeBSD и Mac OS X. Параметр -S, необходимый для SSL-соединения, при тестировании можно пока не применять. Если в качестве адреса назначения использовать localhost, в соединении будет отказано, поэтому указывайте только внешний интерфейс.
$nutcpc –S –U 102 –H 192.168.0.1
Вводим имя пользователя и пароль. В случае неудачи вам будут выведены сообщения, достаточные для локализации проблемы. Сообщения также можно будет просмотреть в /var/log/messages. Для работы в среде Windows имеется графический клиент NuWINс, который доступен в двух вариантах: один для работы в домене, работающий прозрачно для пользователя и запускающийся в качестве сервиса, второй – в классическом варианте. Демонстрационную версию последнего, разрешающую только 30 минут сессии, можно скачать с сайта [3]. На том же сайте доступен графический клиент для Linux-систем nuapplet, представляющий собой апплет для Gnome 2.x.
Работа с базами данных
Превым делом необходимо создать пользователя, обладающего привилегиями UPDATE, INSERT к conntrack_ulog, и занести эти параметры в файл nuauth.conf. Для создания самих таблиц используйте готовые сценарии nulog.mysql.dump и nulog.pgsql.dump, которые вы найдете в подкаталоге conf дистрибутива. Кроме того, в подкаталоге script лежит скрипт clean_conntrack.pl, при помощи которого таблицы очищаются от «мертвых» соединений. Его необходимо периодически запускать при помощи cron, иначе таблица быстро будет переполняться и задерживать ответ клиентам. Время нужно подбирать индивидуально для каждой сети (обычно 5-10 минут достаточно). Для работы этого скрипта необходимо создать пользователя, обладающего привилегиями SELECT и DELETE для таблицы «conntrack_ulog» и INSERT для «ulog». И внести эти данные во внутрь скрипта (по умолчанию используется root, что излишне). Кроме того, в этом же подкаталоге лежат два скрипта – ulog_rotate_daily.sh и ulog_rotate_weekly.sh, при помощи которых можно очищать базы журналов от переполнения. Для детального просмотра результатов удобно использовать веб-приложение nulog, демонстрационная версия которого доступна по адресу [10]. Кроме того, в настоящее время ведется работа над приложением корреляции и выдачи предупреждений Nualert и генератором отчетов Nureport.
Ссылки:
- Официальный сайт проекта – http://www.nufw.org.
- Сайт поддержки NuFW – http://regit.free.fr/nufw.
- Сайт INL develops – http://www.inl.fr.
- http://www.security.nnov.ru/Kdocument456.html.
- Протокол и алгоритм работы – EFICAAS (Extending Firewalling Infrastructure Capabilities and Aggregating Authentication Systems) – http://www.nufw.org/eficaas.
- Архивы программного обеспечения – http://packages.debian.org/unstable/source/nufw; http://rpm.pbone.net.
- Сайт проекта Netfilter – ftp://ftp.netfilter.org/pub/patch-o-matic.
- Ачилов Р. Настройка Squid для использования авторизации из домена Windows 2000. – Журнал «Системный администратор», №10, 2004 г. – 30-35 с. (http://www.samag.ru/cgi-bin/go.pl?q=articles;n=10.2004;a=05).
- Демонстрационная версия Nuface – https://nuface.inl.fr.
- Демонстрационная версия nulog – http://www.inl.fr/download/ulog-demo.