Ключевые слова:bsd, radius, aaa, auth, limit, (найти похожие документы)
Date: 29 Jul 2002
From: Andrew Pavlov <and@kremenchug.net>
Newsgroups: OpenNet
Subject: FAQ по установке и настройке IC-RADIUS под FreeBSD
FAQ по установке и настройке IC-RADIUS под FreeBSD.
Этот документ не претендует на полноту. Замечания и дополнения
приветствуются. Последнюю версию можно получить:
https://www.opennet.ru/base/faq/icradius.txt.htmlhttp://www.i.kremenchug.net/docs/icradius.htmhttp://www.i.kremenchug.net/docs/icradius.txt.gz
Автор: Andrew Pavlov and@kremenchug.net
Благодарности за поддержку и конструктивную критику:
Boris Kovalenko boris@tagnet.ru
Denis Ladeishchikov snide@europe.com
Kirill Lopuchov kirill@sfugntu.bashnet.ru
Дата последнего обновления: ср 31 июл 09:06:44 2002
Q. Что такое RADIUS, и как он работает?
Q. Какие RADIUS сервера существуют?
Q. Какой же RADIUS выбрать и где взять?
Q. Как установить и настроить IC-RADIUS?
Q. Я сделал все как написано, а radiusd выпадает в core.
Q. IC-RADIUS запустился, а что делать дальше, как мне заставить своих
пользователей аутентифицироваться по RADIUS?
Q. Все получилось, а как быть с пользователями?
Q. У меня масса пользователей, так неохота прописывать каждому
повторяющиеся атрибуты, что делать?
Q. Можно ли сделать так, чтобы пользователь автоматически добавлялся
в группу?
Q. Где я могу посмотреть весь набор атрибутов и их значений,
которые использует мой RADIUS?
Q. Где IC-RADIUS хранит статистику по отработанным ресурсам?
Q. Как я могу ограничить пользователя, чтобы он ходил только на
определенные адреса?
Q. Как я могу ограничивать своих пользователей по времени?
Q. А как сделать, чтобы пользователь мог логиниться только в определенное
для него время?
Q. Могу ли я ограничивать своих пользователей по трафику?
Q. Меня не устраивают пароли в открытом виде, что можно сделать?
Q. У меня несколько NAS, как я могу ограничить пользователя так, чтобы
он мог заходить только на определенный NAS и/или только на
определенный порт?
Q. Я создал пользователя и просто хочу его проверить, никуда не
дозваниваясь.
Q. Как я могу посмотреть, кто на какой NAS под каким ip залогинен в
данный момент?
Q. Как я могу посмотреть, кто, когда логинился?
Q. Есть ли какие-нибудь web-интерфейсы для администрирования и
просмотра статистики?
Q. Что если мне надо перенести мою базу на другой хост?
Q. Мне этого мало, что я еще могу почитать про IC-RADIUS?
Q. Что такое RADIUS, и как он работает?
A. RADIUS - служба удаленной аутентификации входящих звонков пользователей.
Он является протоколом для передачи информации по аутентификации,
авторизации и конфигурации между сервером доступа к сети (NAS) и
сервером аутентификации (RADIUS). Данный стандарт подробно описывается
в RFC 2138 и 2139 и доступен на ftp://ftp.ripe.net/rfc/.
Процесс условно может быть разделен на 5 стадий:
1) пользователь дозванивается до NAS;
2) NAS посылает запрос к RADIUS посредством стандартного набора пар
атрибут/значение;
3) RADIUS проверяет, существует ли пользователь, если да, то может ли
он войти в систему;
4) RADIUS посылает обратно к NAS или Accept или Reject, что определяет
разрешение доступа пользователю;
5) по завершению пользовательской сессии NAS возвращает RADIUS серверу
информацию по выработанным этим пользователем ресурсам.
Q. Какие RADIUS сервера существуют?
A. Из бесплатных, например: FreeRADIUS, XtRadius, Cistron RADIUS,
Gnu-Radius, IC-RADIUS, в общем, если у Вас FreeBSD,
cd /usr/ports; make search key=radius.
Q. Какой же RADIUS выбрать и где взять?
A. Исторически сложилось, что я использую IC-RADIUS, в нем есть
практически все, что нужно, и его почти не пришлось обрабатывать
напильником :), его и рекомендую. IC-RADIUS является вариантом
Cistron RADIUS, но для хранения своих баз использует MySQL.
Скачать IC-RADIUS можно с ftp://ftp.innercite.com/pub/icradius/.
Если у Вас FreeBSD, загляните в коллекцию портов,
cd /usr/ports/net/icradius.
Q. Как установить и настроить IC-RADIUS?
A. Предполагаем, что у Вас FreeBSD с установленной коллекцией портов, и
Вы знаете MySQL (текущая версия IC-RADIUS в портах 0.18.1).
cd /usr/ports/net/icradius
make build
После этого, если все прошло успешно
make install && make clean
cd /usr/local/etc/raddb
cp radius.conf.sample radius.conf
Это основной конфигурационный файл, открываем его на редактирование и
при необходимости изменяем следующие параметры:
# адрес хоста на котором находится MySQL
server localhost
# имя пользователя для доступа к базе
login root
# пароль для доступа к базе
password rootpass
Остальное оставляем по умолчанию. Далее нам нужно создать базу и
сделать в нее импорт словаря пар атрибутов/значений. Необходимый
комплект скриптов и дамп базы после инсталляции находится в
/usr/local/share/icradius. Предполагаем, что RADIUS и MySQL находятся
у нас на одном хосте, и MySQL уже запущен.
cd /usr/local/share/icradius/scripts
mysql -p -e "create database radius";
mysql -p radius < radius.db
Делаем импорт словаря, для этого нам нужно сначала отредактировать
скрипт dictionary.pl, т.е. указать Ваш логин/пароль к базе и, если
нужно, имя хоста.
my $dbusername = 'root';
my $dbpassword = 'rootpass';
my $dbh = DBI->connect("DBI:mysql:radius:localhost",
$dbusername,$dbpassword) || die ...;
Далее запускаем:
./dictionary.pl ../raddb/dictionary
Подправим чуть-чуть скрипт для запуска,
/usr/local/etc/rc.d/icradius.sh, изменим переменную ARGS, которая
должна принимать вид ARGS="-yz". Ключ -y указывает, что все детали
о каждом запросе необходимо записывать в /var/log/radius.log,
ключ -z по желанию, он позволяет включать пароли в radius.log даже при
успешных логинах, если пароль в базе хранится в открытом виде
(this is very insecure! (c) man radiusd :). Можно также добавить ключ
-i <ip-address>, если у Вас multi-homed хост.
Note: IC-RADIUS использует порты описанные в /etc/services
radius 1812/udp # RADIUS authentication protocol (IANA sanctioned)
radacct 1813/udp # RADIUS accounting protocol (IANA sanctioned)
если Вы хотите использовать другие порты, измените /etc/services, или
укажите при запуске ключ -p <port>, тогда для аутентификации RADIUS
будет использовать указанный порт, а для аккаунтинга указанный порт+1.
Все, запускаем!
/usr/local/etc/rc.d/icradius.sh start
ps ax | grep radiusd
Должно появиться два процесса, один занимается аутентификацией, а второй
аккаунтингом.
Q. Я сделал все как написано, а radiusd выпадает в core.
A. Причина тут, как правило, одна: radiusd не может соединиться с базой.
Т.е. или MySQL не запущен, или неправильно указаны параметры в
radius.conf, смотрите /var/log/radius.log, а вообще, при разного рода
неприятностях пробуйте запускать radiusd с ключами -x (debug mode) и
-f (stay foreground).
Q. IC-RADIUS запустился, а что делать дальше, как мне заставить своих
пользователей аутентифицироваться по RADIUS?
A. Для этого Вам нужно организовать NAS, на который будут обращаться
пользователи, и который будет в данном случае RADIUS-клиентом.
Для начала нужно создать запись о NAS в таблице nas, поля в
таблице следующие:
id - id, указывать не нужно, auto_increment
nasname - имя NAS
shortname - короткое имя NAS, которое будет отображаться в логе.
ipaddr - ip адрес NAS
type - тип NAS, нужен для скрипта /usr/local/sbin/checkrad,
который проверяет на предмет соединения пользователя
с данным NAS
ports - количество портов на NAS
secret - пароль для этого NAS
community - snmp community, нужен для checkrad
snmp - должен ли делать проверку checkrad на этом NAS (on|off)
итак
mysql -p radius
mysql> INSERT INTO nas VALUES
('', 'localhost.localdomain','localhost',
'127.0.0.1','computone','10','secret','public','on');
mysql> quit
После этого нужно перегрузить radiusd,
/usr/local/etc/rc.d/icradiusd.sh reload,
или
kill -HUP `cat /var/run/radiusd.pid`.
Теперь создадим сам NAS, рассмотрим создание dial-in на FreeBSD с
использованием user-level ppp+getty.
Для начала настроим один модем на поднятие трубы после первого звонка.
Запускаем ppp:
ppp> set dev /dev/ttyd0
ppp> set sp 57600
ppp> t
ats0=1&w
~.
ppp>quit
Далее настраиваем сам ppp.
cd /etc/ppp
touch radius.conf
В /etc/ppp/radius.conf
# service type radius server secret timeout retries
auth 127.0.0.1:1812 secret 5 3
acct 127.0.0.1:1813 secret 5 3
В /etc/ppp/ppp.conf
radius:
set radius /etc/ppp/radius.conf
dial-in:
enable chap pap chap80nt chap81 passwdauth
set ifaddr x.x.x.x y.y.y.1-y.y.y.254
accept dns
load radius
Создадим так называемый ppp-shell, который будет запускаться
на наших ppp пользователей.
touch pppshell.sh
chmod 755 pppshell.sh
и запишем в него
#!/bin/sh
exec /usr/sbin/ppp -direct dial-in
Более подробную информацию по использованию user-level ppp
можно получить в /usr/share/doc/ru/books/ppp-primer и
/usr/share/examples/ppp.
Теперь укажем в /etc/gettytab программу для ppp аутентификации
std.57600|57600-baud:\
:np:sp#57600:\
:pp=/etc/ppp/pppshell.sh:
Запускаем getty на нужный нам порт, в /etc/ttys
ttyd0 "/usr/libexec/getty std.57600" dialup on secure
делаем killall -HUP init и смотрим по ps, появился ли getty на порту.
Осталось рассмотреть такую мелочь, как проверка на предмет
Multiple logins. Для этого используется скрипт /usr/local/sbin/checkrad,
о котором уже упоминалось выше. В нем содержится набор функций для
различных типов NAS, для нашего NAS мы указали computeone,
соответственно будет использоваться функция computone_finger,
которую нужно немного подправить. Для того, чтобы выполнялась проверка
по checkrad, значение поля snmp в таблице nas должно быть обязательно on.
Приведем условие в этой функции к такому виду
If( $line[$num] =~ / $ARGV[3] |^$ARGV[3] / ) { ...
Проверка будет выполняться с помощью finger, поэтому
просто пропишем в /etc/inetd.conf
finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd
или проще
finger stream tcp nowait/3/10 nobody /usr/bin/w w
Добавим в /etc/hosts.allow
fingerd: localhost 127.0.0.1 : allow
fingerd: ALL : deny
или соответственно
w: localhost 127.0.0.1 : allow
w: ALL : deny
дабы посторонние не видели, что у нас тут делается. Делаем
killall -HUP inetd (inetd должен быть запущен с ключами -wW), и
NAS готов к работе.
Q. Все получилось, а как быть с пользователями?
A. Существуют две основные пользовательские таблицы radcheck и radreply.
В первой хранятся аутентификационные атрибуты пользователя, назовем
их check, например пароль, различные временные ограничения,
а во второй хранятся атрибуты, которые RADIUS возвращает NAS,
например ip адрес, протокол, назовем их reply. Формат таблиц
одинаков.
id - id, указывать не нужно, auto_increment
UserName - имя пользователя
Attribute - атрибут
Value - значение атрибута
Приведем пример создания обычного PPP пользователя.
mysql> INSERT INTO radcheck VALUES
('','someuser','Password','somepassword');
mysql> INSERT INTO radcheck VALUES
('','someuser','Simultaneous-Use','1');
Этот атрибут указывает количество одновременно работающих
пользователей под таким логином. При попытке зайти под этим логином
еще раз, появится соотвествующая запись в radius.log:
Error: Multiple logins [someuser] (from nas somenas/port) max. 1
mysql> INSERT INTO radreply VALUES
('','someuser','Service-Type','Framed-User');
mysql> INSERT INTO radreply VALUES
('','someuser','Framed-IP-Address','255.255.255.254');
Значение 255.255.255.254 указывает, что ip адрес должен выдаваться NAS.
mysql> INSERT INTO radreply VALUES
('','someuser','Framed-Protocol','PPP');
Указывает какой протокол должен включать NAS на данного пользователя.
mysql> INSERT INTO radreply VALUES
('','someuser','Framed-MTU','1500');
Этого вполне достаточно для создания полноценного ppp пользователя.
Перезапускать radiusd после добавления нового пользователя или его
модификаций не нужно.
Q. У меня масса пользователей, так неохота прописывать каждому
повторяющиеся атрибуты, что делать?
A. Есть соответствующие групповые таблицы, radgroupcheck и radgroupreply.
Поля у них те же самые, но вместо поля UserName используется поле
GroupName. Для включения пользователя в группу необходимо добавить
соотвествующюю запись в таблицу usergroup. Например:
mysql> INSERT INTO radgroupcheck VALUES
('','somegroup','Simultaneous-Use','1');
mysql> INSERT INTO radgroupreply VALUES
('','someuser','Service-Type','Framed-User');
mysql> INSERT INTO radgroupreply VALUES
('','someuser','Framed-IP-Address','255.255.255.254');
mysql> INSERT INTO radgroupreply VALUES
('','someuser','Framed-Protocol','PPP');
mysql> INSERT INTO radgroupreply VALUES
('','someuser','Framed-MTU','1500');
mysql> INSERT INTO usergroup VALUES
('','someuser','somegroup');
В таком случае при создании нового пользователя достаточно сделать
две записи: одну в radcheck, в которой будет указан пароль, а вторую
в usergroup, которая соответственно укажет, к какой группе относится
пользователь.
Q. Можно ли сделать так, чтобы пользователь автоматически добавлялся
в группу?
A. Для этого нужно использовать атрибуты Prefix/Suffix и таблицу hints.
mysql> INSERT INTO radgroupcheck VALUES
('','somegroup','Prefix','P');
mysql> INSERT INTO radgroupcheck VALUES
('','somegroup','Strip-User-Name','Yes');
Если значение атрибута Strip-User-Name установлено в Yes, это
означает сокращение имени пользователя после обнаружения
Prefix/Suffix, и только после этого его поиск в базе.
Т.е. пользователь должен указать Psomeuser во время дозвона к NAS,
а поиск в базе будет проводиться уже по имени someuser.
mysql> INSERT INTO hints VALUES ('','DEFAULT','somegroup');
Можно также иметь несколько DEFAULT записей, все они будут просмотрены
в порядке hints.id, пока не будет обнаружен соответствующий
Prefix/Suffix.
Q. Где я могу посмотреть весь набор атрибутов и их значений,
которые использует мой RADIUS?
A. В таблице dictionary или в файле dictionary, из которого Вы
делали импорт в таблицу.
Q. Где IC-RADIUS хранит статистику по отработанным ресурсам?
A. В таблице radacct. Посмотреть формат таблицы можно так:
mysql -p -e "desc radacct" radius
Q. Как я могу ограничить пользователя, чтобы он ходил только на
определенные адреса?
A. Существует такой reply атрибут, как Filter-Id, который передает
название фильтра в NAS.
Например, user-level ppp обрабатывает этот атрибут как дополнительную
метку в файлах /etc/ppp/ppp.linkup и /etc/ppp/ppp.linkdown.
mysql> INSERT INTO radreply VALUES
('','someuser','Filter-Id','somefilter');
Соответственно, в конфигурации ppp в файле ppp.linkup прописываем
somefilter:
set filter out 0 permit 0 0
set filter in 0 permit 0 0
Более подробную информацию по использованию фильтров в user-level ppp
можно получить в /usr/share/doc/ru/books/ppp-primer и
/usr/share/examples/ppp.
Q. Как я могу ограничивать своих пользователей по времени?
A. Существуют такие check атрибуты, как:
Total-Time-Limit
Monthly-Time-Limit
Weekly-Time-Limit
Daily-time-Limit
и reply атрибут
Session-Timeout
Атрибут Session-Timeout можно установить просто на сессию, или он
будет вычисляться в зависимости от указанных check атрибутов и
статистики по времени в radacct. Затем RADIUS сервер возвращает
этот атрибут к NAS, который, в свою очередь, будет производить
отключение пользователя по истечении времени. Если при проверке
check атрибутов окажется, что квота этого пользователя закончилась,
RADIUS вернет Reject. Значения всех этих атрибутов задаются в секундах.
Note: Если Вы используете в качестве NAS user-level ppp, то Вам нужно
взять user-level ppp и libradius из cvs, с anoncvs.freebsd.org,
потому как параметр Filter-Id и Session-Timeout в нем начали
обрабатываться недавно, благодаря моим скромным усилиям :)
Q. А как сделать, чтобы пользователь мог логиниться только в определенное
для него время?
A. Существует check атрибут Login-Time. Например, нам необходимо пускать
пользователя в любой день недели кроме субботы, воскресенья с 7:00
до 21:00 вечера, в субботу без ограничений, а в воскресенье с 23:00
до 16:55 следующего дня:
mysql> INSERT INTO radcheck VALUES
('','someuser','Login-Time','Wk0700-2100,Sa,Su2300-1655');
Если пользователь не попал в нужный диапазон времени, RADIUS
вернет Reject.
Q. Могу ли я ограничивать своих пользователей по трафику?
A. Уже можете, при условии, что Вы используете в качестве NAS
user-level ppp.
Мной написаны два патча, пока еще не включенных в user-level ppp и
IC-RADIUS, но борьба за это ведется :)
Работает это следующим образом, в IC-RADIUS добавлены новые check
атрибуты:
Total-Octets-Limit
Monthly-Octets-Limit
Weekly-Octets-Limit
Daily-Octets-Limit
и два reply атрибута
Session-Octets-Limit
Octets-Direction
Атрибут Session-Octets-Limit можно установить просто на сессию, или он
будет вычисляться исходя из установленных check атрибутов и статистики
по октетам в radacct. Затем RADIUS сервер возвращает этот атрибут к NAS,
который, в свою очередь, будет производить отключение пользователя по
истечении лимита. Если при проверке check атрибутов окажется, что квота
этого пользователя закончилась, то RADIUS вернет Reject. Значения всех
check атрибутов и Sessin-Octets-Limit задаются в октетах (байтах).
Атрибут Octets-Direction имеет следующие значения
Sum - ограничение по суммарному трафику
Input - по входящему трафику
Output - по исходящему трафику
MaxOveral - по максимальному значению SUM(IN)>SUM(OUT)
MaxSession - по максимальному значению, но не за все
время работы, а по сессионно, SUM(GREATEST(IN,OUT))
Если Octets-Direction не указан, то по умолчанию RADIUS будет
возвращать значение Sum.
На IC-RADIUS патч свободно станет на версию 0.18.1 из FreeBSD портов:
cd /usr/port/net/icradius
make patch
cp /xxx/icradius-octets.patch /usr/ports/net/icradius/work
cd work/
patch < icradius-octets.patch
cd ..
make build
make install && make clean
Note: Если у Вас уже работает IC-RADIUS, то после перекомпиляции,
не забудьте добавить в таблицу dictionary новые атрибуты.
На user-level ppp патч может не стать, потому как я брал ppp из cvs,
но нужные изменения можно внести вручную, там немножко :)
Патчи можно скачать:
http://www.i.kremenchug.net/patches/icradius-octets.patch.gzhttp://www.i.kremenchug.net/patches/ppp-octets.patch.gz
Note: для FreeBSD 4.x-RELEASE можно использовать патч, который добавляет
обработку атрибутов:
Filter-Id
Session-Timeout
Session-Octets-Limit
Octets-Direction
и исправляет такую ошибку, как назначение RADIUS сервером пользователю
ip адреса 255.255.255.254.
Скачать можно:
http://www.i.kremenchug.net/patches/ppp-4x.patch.gz
Установка:
cd /usr/src/usr.sbin
cp /xxx/ppp-4x.patch .
patch < ppp-4x.patch
cd ppp
make
make install
Note: также уже существует реализация возможности отключения
пользователя по трафику и в pppd, доступно в cvs на ppp.samba.org.
Реализовано Alexandr D. Kanevskiy kad@blackcatlinux.com
Q. Меня не устраивают пароли в открытом виде, что можно сделать?
A. Пароли можно хранить в зашифрованном виде. Шифрование производится
системной функцией crypt(). На пользователя/группу должен быть
установлен атрибут Auth-Type со значением Crypt-Local.
Q. У меня несколько NAS, как я могу ограничить пользователя так, чтобы
он мог заходить только на определенный NAS и/или только на
определенный порт?
A. Добавьте в конфигурацию пользователя/группы check атрибут
NAS-IP-Address для ограничения по порту check атрибут NAS-Port-Id.
Q. Я создал пользователя и просто хочу его проверить, никуда не
дозваниваясь.
A. В таком случае можно воспользоваться скриптом
/usr/local/share/icradius/script/testrad. Для его использования
необходимо установить perl-модуль Authen::Radius
cd /usr/ports/security/p5-Authen-Radius
make build
make install && make clean
Также поставьте симлинк
ln -s /usr/local/share/icradius/raddb /etc/raddb, именно там скрипт
будет искать словарь атрибутов/значений.
Q. Как я могу посмотреть, кто на какой NAS под каким ip залогинен в
данный момент?
A. /usr/local/share/icradius/scripts/radwho.
Скрипт просматривает таблицу radacct на предмет незакрытых сессий,
т.е. поле AcctStopTime = 0. Не забудьте изменить в скрипте значения
переменных $db_user, $db_pass, $db_host, $db_db, если нужно. Значение
переменной $fingerd измените с 1 на 0.
Note: Бывают моменты, когда сессия завершилась, а стоп запись не
закрылась, получается так называемая "подвисшая сессия". При правильно
настроенной проверке по checkrad такие сессии будут удаляться
автоматически, и в radius.log будет появляться запись вида:
Error: Deleting stale session [someuser] (child pid xxxx)
(from nas somenas/port)
Q. Как я могу посмотреть, кто, когда логинился?
A. /usr/local/share/icradius/scripts/radlast, не забудьте изменить
соответствующие переменные.
Q. Есть ли какие-нибудь web-интерфейсы для администрирования и
просмотра статистики?
A. Есть, административный интерфейс
/usr/local/share/icradius/scripts/radius.cgi
и пользовательский интерфейс
/usr/local/share/icradius/scripts/usage.cgi
Q. Что если мне надо перенести мою базу на другой хост?
A. Сливаем дамп на одном хосте
mysqldump -p radius > dump.sql
потом заливаем его на другом
mysql -p -e "create database radius"
mysql -p radius < dump.sql
и соотвественно правим /usr/local/etc/raddb/radius.conf
Q. Мне этого мало, что я еще могу почитать про IC-RADIUS?
A. Ну, собственно, с чего и должны были начать, man radiusd,
оригинальной документации и FAQ, поставлямых в комплекте
с IC-RADIUS :). Также можете подписаться на icradius-user maillist
http://lists.ic-isp.com/mailman/listinfo/icradius-user.