Поддержка RADIUS
Поддержка RADIUS появилась в NeTAMS 3.3.0 (CURRENT) начиная с номера билда 2378 (8 апреля 2005г.)
Что именно поддерживается
В NeTAMS реализована поддержка авторизации доступа к ресурсам внешний сервер-доступа
и радиус-сервер, когда последний обращается за паролем и атрибутами к внутренним структурам
netams через его Telnet API. Также возможно использование RADIUS-сервера для контроля доступа
к статическим веб-страницам. Таким образом, с точки зрения организации провайдерства NeTAMS является
базой данных для радиус-сервера. Прозрачно поддерживаются любые методы проверки паролей
(PAP/CHAP/MS-CHAP/EAP), т.к. это дело FreeRADIUS а не NETAMS; любое число внешних серверов доступа.
Поддерживается отправка аккаунтинга (данных о трафике) в сторону радиус-сервера через новый тип сервиса
storage... type radius (
документация).
Что не поддерживается
Не поддерживается контроль доступа и проверка паролей для пользователей NeTAMS посредством радиус-сервера
(т.е. функциональность радиус-клиента; по всей видимости этого и не требуется). Не поддерживается сохранение
аккаунтинга внешнего сервера доступа в базе netams (через новый сервис типа data-source; в планах).
Как работает
Новые функции сосредоточены в:
- поддержке авторизации через telnet-интерфейс и/или командную строку
- модуле rlm_netams, расширяющего сервер FreeRADIUS
- поддержке авторизации доступа к HTML-страницам через mod_auth_radius+новая команда сервиса html (опционально)
В качестве сервера доступа, используемого в качестве клиента нового механизма авторизации,
проверялись pppoe+ppp (FreeBSD 5.3) и Windows 2003 RRAS. Таким образом,
NeTAMS может успешно
авторизовывать и контролировать трафик dialup- и pppoe- и прочих коммутируемых соединений, без необходимости
дублировать логины/пароли/настройки в текстовых конфигах и базах данных.
Порядок работы с сервером доступа:
- При поступлении запроса на соединение сервер доступа осуществляет проверку прав звонящего (логин/пароль)
у радиус-сервера.
- Радиус-сервер вызывает код модуля rlm_netams, который извлекает требуемые атрибуты из запроса
аутентификации, формирует сообщение, и передает его работающему демону NeTAMS посредством Telnet API.
- На основании полученного запроса демон NeTAMS разрешает или запрещает доступ. Если доступ разрешен,
в сторону rlm_netams (т.е. радиус-сервера) передаются ряд атрибутов, в частности IP-адрес клиента и набор фильтров. Если сервер передал параметр "Caller-ID" (для PPPoE это МАС-адрес звонящего), и для юнита установлен параметр "mac ...", будет проводиться дополнительный контроль и по этому признаку.
- rlm_netams копирует ответ демона, формируя RADIUS-ответ для сервера доступа.
- сервер доступа отвергает или принимает клиента, устанавливая необходимые параметры соединения.
Порядок работы при авторизации веб-доступа:
- Сервис HTML генерирует статические HTML-страницы с данными о трафике, админскую часть и пользовательскую часть.
При этом создаются также файлы .htaccess со списком "правильных" пользователей данного URI, файл паролей .htpasswd
не поддерживается - заместо него в глобальном конфигурационном файле apache присутствуют записи о RADIUS-авторизации.
- HTTP-клиент (бровзер) пытается обратиться к защищенному при помощи .htaccess ресурсу. Происходит запрос пароля (через код 401)
- Apache вызывает модуль mod_auth_radius, сообщая тому логин-пароль клиента. Запрос на авторизацию передается радиус-серверу.
- Радиус-сервер вызывает код модуля rlm_netams, который извлекает логин-пароль из запроса
аутентификации, формирует сообщение, и передает его работающему демону NeTAMS посредством Telnet API.
- На основании полученного запроса демон NeTAMS проверяет свою базу пользователей и юнитов,
разрешает или запрещает доступ. Ответ пересылается в RADIUS-сервер.
- rlm_netams копирует ответ демона, формируя RADIUS-ответ для Apache.
- Apache пускает пользователя (бровзер) на страницу, или не пускает его.
Как настроить
Настройка PPPoE/PPP
Очень рекомендуем почитать
теорию и примеры и настроить доступ безо всякого netams+radius, для начала.
Допустим что NeTAMS, FreeRADIUS, PPP, PPPoE крутятся на одной машине 192.168.0.1, внешний интерфейс fxp0.
### /etc/ppp/ppp.conf #####################################
default:
enable dns # request DNS info (for resolv.conf)
pppoe:
set log Phase Chat LCP IPCP CCP tun command
set radius /etc/ppp/radius.conf
set speed sync
set timeout 240
set ctsrts off
set accmap 000a0000
enable lqr
set cd 5
enable pap chap
set ifaddr HISADDR 192.168.0.253 # .253 is the server's end
#############################################################
### /etc/ppp/radius.conf ####################################
auth 192.168.0.1 secretkey 5 3
#############################################################
Запуск сервера PPPoE:
/usr/libexec/pppoed -p \* -l pppoe fxp0
Настройка FreeRADIUS
Для начала надо собрать FreeRADIUS из портов или исходников. Пакет не подойдет, т.к. там отсутствуют необходимые заголовочные файлы для сборки нашего собственного модуля.
cd /usr/ports/net/freeradius/
make && make install
Переходим в дистрибутив NeTAMS и копируем наш модуль
rlm_netams куда следует; потом собираем:
cd ~/netams/addon/
cp -rp rlm_netams /usr/ports/net/freeradius/work/freeradius-1.0.1/src/modules/
cd /usr/ports/net/freeradius/work/freeradius-1.0.1/src/modules/rlm_netams
gmake
gmake install
Правим конфигурацию FreeRADIUS, чтобы использовать локальный сервер доступа с правильными паролями:
### /usr/local/etc/raddb/clients.conf #######################
client 192.168.0.1 {
secret = secretkey
shortname = pppoe_server
}
#############################################################
И чтобы использовать наш rlm_netams:
### /usr/local/etc/raddb/radius.conf #######################
...
modules {
...
netams {
server = "192.168.0.1" # netams server IP
port = 20001 # netams server port
login = "freeradius" # netams access username
password = "ABCDEF" # netams access password
swap-inout = "yes" # swap IN and OUT counters for accounting
}
}
authorize {
...
netams
}
authenticate {
...
netams
}
#############################################################
Настройка NeTAMS
Очень желательно добавить специального пользователя, от имени которого будет идти подключение к NeTAMS:
### /usr/local/etc/netams.cfg ###############################
user oid 0832ED name freeradius password ABCDEF permit radius
#############################################################
Если вы хотите использовать авторизацию доступа к веб-страницам со статистикой через mod_auth_radius, измените:
### /usr/local/etc/netams.cfg ###############################
service html
...
htaccess radius
...
#############################################################
Настройка Apache (опционально)
Берем
mod_auth_radius отсюда:
http://www.freeradius.org/mod_auth_radius/
Компилируем, ставим:
apxs -i -a -c mod_auth_radius.c
Настраиваем апач:
...
<IfModule mod_auth_radius.c>
AddRadiusAuth 192.168.0.1:1812 secretkey 5:3
AddRadiusCookieValid 5
</IfModule>
...
<Location /stat>
AllowOverride All
</Location>
...
Запускаем все хозяйство. Допустим, в конфигурационном файле у нас присутствует юнит с именем
client1 и паролем
abc, у него установлен адрес
192.168.0.111, и есть политика
фильтрации с именем filter1 и OID ABCFEF.
Можно проверить работоспособность NeTAMS через утилиту
netamsctl:
~#netamsctl radius auth nas login client1 password abc nas-id TEST
1 2
Framed-IP-Address: 192.168.0.111
Filter-ID: ABCFEF filter1
Здесь в первой строке вывода число "1" означает "успешно", далее "2" говорит от том, что последуют две строки параметров.
Первая строка передает IP-адрес этого юнита, Вторая - OID и имя фильтра (может быть затем использовано
вашим скриптом if-up). В случае неправильного пароля:
~#netamsctl radius auth nas login client1 password abcef nas-id TEST
0 password incorrect for client1
В обоих случаях информация о событии попадет в лог-файл и таблицу EVENTS базы SQL.
Узнать, как происходит работа RADIUS-сервера, что кому куда передается, можно запустив этот сервер с ключом -X:
/usr/local/sbin/radiusd -X
TODO
- Сделать обработку аккаунтинга, поступающего от NAS-сервера. Видимо, для этого придется сделать новый тип data-source.
- Протестировать работу сервера доступа Cisco (никто не хочет дать тестовый доступ?)
- Сделать более жестким ограничение на тип передаваемого фильтра: сделать новый target radius-filter XXX. Сделать пример скрипта, который этот XXX обрабатывает.
- Сделать аналог rlm_netams для другого RADIUS-сервера? FreeRADIUS считается наиболее распространенным.