Jul 18, 2008 14:54
Всем хорош FreeRadius , но все какие-то плосковатые happy story мне попадались.
А если нужно котролировать Dialup, VPN, WiFi, 802.1x и во всех случаях разные пользователи, пароли, атрибуты, параметры....
Придется ставить множество radius серверов, резервировать, бекапировать....
Может трудности в общении с гуглем, но увы, не нашел рецептика. При этом каждый из пунктов в отдельности разжеван многократно.
Задача: независимо контролировать любой из возможных сервисов при значительном количестве пользователей. Затраты минимальны.
Берем стандартный freeradius плагин для хранения аккаунтов пользователей в MySQL.
Видим, что есть таблица хранения NAS ов, таблицы для персональных пользовательских параметров проверки/установки и точно такие-же данные в таблицах для групп. Конечно же, есть таблица-связка пользователя и группы. Гвоздь программы: возможность самостоятельного задания SQL запросов в конфигурационном файле и мапирование атрибутов Radius запросов на SQL.
На всякий случай смотрим на Radius запрос, причем самый клинический, c WiFi (тоесть с меткой про SSID: "VIP"):
User-Name = "dima"
Calling-Station-Id = "00-1B-21-C1-D2-62"
Called-Station-Id = "00-16-C7-21-3F-C3:VIP"
NAS-Port = 29
NAS-IP-Address = 10.0.7.104
NAS-Identifier = "Cisco_fa:33:1b"
Airespace-Wlan-Id = 4
Service-Type = Framed-User
Framed-MTU = 1300
NAS-Port-Type = Wireless-802.11
Tunnel-Type:0 = VLAN
Tunnel-Medium-Type:0 = IEEE-802
Tunnel-Private-Group-Id:0 = "975"
EAP-Message = 0x02020009016c656e51
Message-Authenticator = 0x5d1c50b996593ec2dec21dc5d481214e
Нас интересуют NAS-IP-Address (содержит адрес NAS, в данном случае Cisco контроллера WiFi) и Called-Station-Id ( содержащую MAC адрес access point-а и отметку о SSID : "00-16-C7-21-3F-C3:VIP" ).
Теперь внедряем понятие ServiceID в таблицы и запросы. В таблице NAS вносим поля CalledStation и ServiceID. В таблицах radcheck, radgroupcheck,radreply,radgroupreply добавляем поле ServiceID. В SQL запросах вносим связку по serviceID (на примере таблице radcheck):
SELECT...WHERE...
and nas.serviceid=radcheck.serviceid
and nas.nasname='%{NAS-IP-Address}'
and nas.calledstation=RIGHT('%{Called-Station-Id}',LENGTH(nas.calledstation))
Внимание на последнюю строку выше. Правая часть параметра "Called-Station-Id" из radius запроса сравнивается с полем СaledStation в таблице NAS. Размер правой части береться из того же поля таблицы. В случае с WiFi и SSID=VIP, если в таблице NAS внести в поле CalledStation значение ":VIP", то мы будем сравнивать его с 4-мя правыми символами параметра "Called-Station-Id" из radius запроса. При работе с WiFi для каждого SSID получим уникальный сервис со своими пользователями и группами. Если же CalledStation пустой, то "Called-Station-Id" из запроса вообще не учитывается и идентификатор сервиса будет зависеть только от "NAS-IP-Address" radius запроса.
А если указать в CalledStation в таблице NAS будет содержать и MAC адрес, то получаем сервис только для конкретного access point-а - пока не знаю как относится к этому, то ли побочный эффект, то ли фича.
Что мы имеем:
1) Имеем понятие идентификатора сервиса.
2) Для каждого идентификатора сервиса имеются пользователи и группы, независимые от других сервисов.
3) Идентификатор сервиса зависит от IP адреса NAS и опционально от параметра Called-Station-Id.
На одном Radius сервере получили полное и независимое управление аккаунтами для практически неограниченного количества сетевых сервисов. Правил только sql.conf и таблицы в MySQL. Все!
Забыл подводную граблю. При работе с WiFi и использовании PEAP необходимо для PEAP в файле eap.conf указать опцию:
copy_request_to_tunnel = yes
Дело в том, что при работе с PEAP внутри radius сервера проходит создание нового radius запроса на основе EAP сообщения в изначальном Radius запросе.
Если не указать copy_request_to_tunnel то внутренний radius запрос получится куцым, без полей "Called-Station-Id" и "NAS-IP-Address", а они критичны в нашей многоликости.
freeradius radius aaa wifi vpn dialup ci