Project

General

Profile

Модуль Управления коммутационным оборудованием по протоколу RADIUS » History » Revision 3

Revision 2 (Maxim Mamontov, 09/21/2015 07:28 PM) → Revision 3/4 (Maxim Mamontov, 10/12/2015 02:51 PM)

h1. Модуль Управления коммутационным оборудованием по протоколу RADIUS 

 Модуль должен иметь возможность предоставлять функционал для реализации управления коммутационным оборудованием по протоколу RADIUS, посредством взаимодействия с коммутационным оборудованием. 
 Для этого модуль должен предоставлять возможности: 
 * взаимодействия с RADIUS-серверами, как промежуточным звеном, между ACP и коммутационным оборудованием 
 * получения от RADIUS-серверов информации, необходимой для идентификации Абонента (MAC-адрес Абонента, IP-адрес коммутационного оборудования, к которому подключен Абонент, пароль Абонента) 
 * предоставления RADIUS-серверам информации, необходимой для аутентификации, авторизации и аккаунтинга (ААА) посредством коммутационного оборудования 

 Модуль должен реализовывать возможности ААА для следующих технологий: 
 * MAC-Based Access Control / MAC Address Authentication 
 * IGMP Access Control 
 * -802.1X- 

 h2. API 

 Взаимодействие между сервером RADIUS и АСР происходит посредством _Программного интерфейса (API)_, который представляет из себя клиент-серверное взаимодействие посредством "JSON":http://en.wikipedia.org/wiki/JSON. 
 Взаимодействие между сервером RADIUS и коммутационным оборудованием происходит посредством протокола RADIUS в реализации сервера "FreeRADIUS":http://freeradius.org/ с использованием модуля rlm_stg, к этому серверу. 

 h2. MAC-Based Access Control / MAC Address Authentication 

 Реализация MAC-Based Access Control / MAC Address Authentication (MBA/MAA) происходит посредством получения RADIUS-сервером от коммутационного оборудования информации, необходимой для аутентификации Абонента, и получением от АСР, 
 информации необходимой для авторизации Абонента. 
 Суть технологии в назначении VLAN ID, 802.1p приоритета и bandwidth assignment на основе MAC адреса посредством взаимодействия коммутационного оборудования с ACP. 

 *MAC-Based Access Control* 

 В коммутаторах D-Link реализовано два режима работы MBA — _port-based_ и _host-based_. Режим _port-based_ работает в отношении порта коммутатора (аутентифицируется и авторизуется весь порт целиком), _host-based_ работает в отношении конкретного MAC адреса (аутентифицируется и авторизуется конкретный MAC адрес). 
 При _port-based_ режиме работают все возможности управления (назначение VLAN, указание 802.1p метки и bandwidth assigment для трафика). 
 При _host-based_ работает только управлением VLAN ID. Указание 802.1p не работает так приоритет задается для всего порта, а bandwidth assigment не работает, так как полисер работает на уровне порта. 

 Технология поддерживает Guest VLAN, при которой неизвестный для ACP/коммутатора MAC адрес помещается в отдельный VLAN. 

 Также на коммутаторах реализован failover. В случае если RADIUS-сервер недоступен и на коммутаторе есть информация о MAC адресе, может быть использована локальная БД коммутатора для аутентификации и авторизации абонента. 
 При использовании failover'а нужно держать локальную базу коммутатора синхронизированной с базой ACP (посредством SNMP). 

 Информация о MAC адресах может быть получена, как от ACP через RADIUS, так и из локальной БД на самом коммутаторе. 
 При аутентификации/авторизации через локальную БД коммутатора на его порту не может быть более 128 записей о MAC адресах для каждого порта коммутатора, то есть всего 128 х количество портов коммутатора. 
 При аутентификации/авторизации через RADIUS на порту коммутатора не может быть больше 512 записей о MAC адресах. В случае использование failover - не более 128, так как при превышении количества записей о MAC адресах для локальной БД следует разсинхронизация. 

 Реализация MBA поддерживает настраиваемые таймауты: 
 * Aging Time — это таймаут, в течении которого MAC адрес считается авторизированным. Диапазон значений: 1-1440 минут, шаг: 1 минута 
 * Hold Time — это таймаут, между двумя авторизациями, в случае если предыдущая была не успешной. По сути это таймаут, через который MAC адрес сможет выйти из Guest VLAN. Диапазон значений: 1-300 секунд, шаг: 1 секунда 

 Отдельно стоит отметить, что абоненты, находящиеся в одном порту коммутатора, могут находится в разных VLAN. 

 !>https://fouzes.com.ua/redmine/attachments/32/mba.png! 

 *Аутентификация.* 
 При появлении MAC-адреса Абонента на коммутационном оборудовании на RADIUS-сервер придет запрос, содержащий MAC адрес Абонента, пароль (единый для коммутатора) и IP-адрес коммутационного оборудования: 
 > Access-Request packet from host 172.18.6.253 port 8021, id=212, length=97 
 >  	 User-Name = "64315095FAF8" (MAC адрес Абонента) 
 >  	 User-Password = "default" (пароль) 
 >  	 NAS-IP-Address = 172.18.6.253 (IP-адрес коммутационного оборудования) 
 >  	 NAS-Identifier = "D-Link" 
 >  	 NAS-Port-Type = Virtual 
 >  	 Service-Type = NAS-Prompt-User 
 >  	 Calling-Station-Id = "64-31-50-95-FA-F8" 

 +MAC-адрес Абонента+ - это MAC-адрес сетевого оборудования Абонента, посредством которого ему оказывается Услуга. 
 +Пароль Абонента+ — условный момент, необходимый для реализации взаимодействия между коммутационным оборудованием и RADIUS-сервером по протоколу RADIUS. 
 Пароль будет единым для всех Абонентов, получающих Услугу через одно и тоже коммутационное оборудование. 
 Максимально возможная длина пароля — 16 символов. 
 +IP-адрес коммутационного оборудования+ — IP-адрес, с которого придет запрос на RADIUS-сервер. 

 *Авторизация.* 
 После получения запроса от коммутационного оборудования RADIUS-сервер должен предоставить полученную им информацию ACР, которая должна на основе этой информации: 
 * однозначно идентифицировать Абонента 
 * принять решение о возможности (или ее отсутствии) предоставить Абоненту Услугу на основе финансовой, административной, либо другой информации, доступной АСР 

 Далее АСР должна предоставить RADIUS-серверу информацию в какой VLAN следует поместить Абонента для предоставления Услуги (в случае если ее можно предоставить), или  
 предоставить RADIUS-серверу информацию, что Услуга не может быть оказана (в случае если Услугу нельзя предоставить) 

 RADIUS-сервер, после получения от АСР информации, должен ответить на запрос, пришедший ранее с коммутационного оборудования, вставив в ответ информацию о VLAN Абонента 
 (в случае, когда Услуга должна быть Абоненту оказана), либо отказать в аутентификации на коммутационном оборудовании Абоненту. 
 > Access-Accept of id 34 to 172.18.6.253 port 8021 
 >  	 Dlink-Ingress-Bandwidth-Assignment := 2000 
 >  	 Dlink-Egress-Bandwidth-Assignment := 3000 
 >         Dlink-VLAN-ID := "4005" 
 >  	 802-1p = 5 

 В случае успешной аутентификации и авторизации, Абонент будет аутентифирован на коммутационном оборудовании и авторизирован (помещен во VLAN _(Dlink-VLAN-ID)_, в котором ему будет оказана Услуга), а также, опционально, на порт коммутационного оборудования, куда подключен Абонент, будет назначен соответствующий приоритет _(802-1p)_ для исходящих из порта пакетов _(802.1p)_ и ограничение входящей _(Dlink-Ingress-Bandwidth-Assignment)_ и исходящей _(Dlink-Egress-Bandwidth-Assignment)_ скорости _(Bandwidth Control)_. 
 В случае не успешной аутентификации, Абонент не будет аутентифицирован на коммутационном оборудовании и, соответственно, будет не авторизован (помещен в Гостевой VLAN, в котором ему будет доступна только Парковая страница). 

 *Конфигурация.* 
 Пример настройки FreeRADIUS-сервера: 
 <pre> 
 192.168.5.3 modules # cat stg 
 stg { 
        address = unix:/var/run/stg.sock 
 } 


 192.168.5.3 raddb # cat dictionary 
 #(TODO: Edge-Core, вроде он использует словарь Cisco - проверить) 


 freeradius # cat dictionary.edge-core? 
 </pre> 
 _address = 192.168.5.160_ - IP адрес ACP 
 _port = 9090_ - порт, для взаимодействия между RADIUS сервером и ACP посредством Apache Thrift 

 * для динамических клиентов 
 <pre> 
 192.168.5.3 sites-enabled # cat clients 
 # Define a network where clients may be dynamically defined. 
 client dynamic { 
         ipaddr = 10.0.0.0 # IP Adress 
         netmask = 24 # Netmask. /32 for IPv4 is prohibited. 
         lifetime = 0 # Lifetime is "0", the dynamic client is never deleted. Restart server to delete client. 
         dynamic_clients = isp_server # Define the virtual server used to discover dynamic clients. 
 } 

 authorize { 
         isp 
         pap 
 } 

 authenticate { 
         isp 
         pap 
 } 

 post-auth { 
         isp 
 } 

 preacct { 
         isp 
 } 

 accounting { 
         isp 
 } 

 # This is the virtual server referenced above by "dynamic_clients". 
 server isp_server { 
         authorize { # The only contents of the virtual server is the "authorize" section. 
                 update control { 
                         FreeRADIUS-Client-IP-Address = "%{Packet-Src-IP-Address}" # Echo the IP address of the client. 
                         FreeRADIUS-Client-Require-MA = no # require_message_authenticator 
                         FreeRADIUS-Client-Secret = "test" # secret 
                         FreeRADIUS-Client-Shortname = "%{Packet-Src-IP-Address}" # shortname 
                         FreeRADIUS-Client-NAS-Type = "other" # nastype 
                 } 
                 #Client was defined properly. New client is ignored, if does NOT return "ok". 
                 ok 
         } 
 } 
 </pre> 
 _ipaddr = 10.0.0._0 и _netmask = 24_ - адресное пространство коммутаторов 

 Параметр 
 + 
 Пераметр FreeRADIUS-Client-Secret называется shared secret. С помощью него шифруется секретная информация при коммуникации с клиентом, в частности чстаности — User-Password. Если значение этого поля не совпадает с тем что использовано в клиенте в User-Password на приемной стороне будет мусор. мусор.+ 

 Модуль типа Типа аутентификации (PAP/CHAP/etc.) нужно подключать после модуля isp в секциях authorize и authenticate. В секции authorize он по полученному от isp Cleartext-Password установит аттрибут Auth-Type, который в секции authenticate будет использован для корректной проверки пароля. 

 * для статических клиентов 
 <pre> 
 TODO 
 </pre> 

 Пример настройки коммутационного оборудования: 

 * D-Link 
 <pre> 
 # RADIUS 
 config radius add 1 192.168.5.3 key test 

 # MAC-based_Access_Control 

 enable mac_based_access_control 
 config mac_based_access_control authorization attributes radius enable 
 create mac_based_access_control guest_vlanid <VLANID> 
 config mac_based_access_control guest_vlan ports <PORTS RANGE> 
 config mac_based_access_control ports <PORTS RANGE> state enable 
 config mac_based_access_control ports <PORTS RANGE> state disable 
 config mac_based_access_control ports <PORTS RANGE> max_users 128 
 config mac_based_access_control ports <PORTS RANGE> aging_time 1440 
 config mac_based_access_control ports <PORTS RANGE> block_time 300 
 config mac_based_access_control ports <PORTS RANGE> mode <host_based/port_based> 
 config mac_based_access_control method radius 
 config mac_based_access_control password default 
 </pre> 
 Замечание: Все VLAN'ы, в которых должны оказаться абоненты в случае успешной авторизации, должны быть заранее созданы на коммутаторе, т.к. реализация MBA у D-Link не создает VLAN'ы, а лишь назначает их на порты. 
 VLAN'ы на портах могут быть трех состояниях: _trunk_ - VLAN выдан с тегом, _access_ - VLAN выдан без тега, _forbidden_ - VLAN не может быть выдан на этот порт 

 * Edge-Core 
 <pre> 
 TODO 
 Пока что положу это тут 
 "IGMP Access у него нет, реализация MBA не подразумевает port-based режим, зато есть фишечка сo static mac-address, они авторизованы по умолчанию. 
 Ну и более богатые настройки через RADIUS, можно не только rate limit и 802.1p, но и QoS политику повесить на порт, и назначить кучу вланов, указав как именно выданы на порт." 
 </pre> 

 h2. IGMP Access Control 

 Реализация IGMP Access Control происходит посредством получения RADIUS-сервером от коммутационного оборудования информации, необходимой для аутентификации запроса подписки на IGMP-группу, и последующего аккаутинга этой подписки в случае успешной аутентификации. 

 *Аутентификация.* 
 При появлении IGMP пакета на коммутационном оборудовании на RADIUS-сервер придет запрос, содержащий MAC-адрес Абонента, пароль Абонента и IP-адрес коммутационного оборудования, номер порта коммутационного оборудования, IP-адрес IGMP-группы: 
 > Access-Request packet from host 172.16.37.131 port 4973, id=101, length=103 
 >  	 User-Name = "5404A65C4A7D" 
 >  	 User-Password = "5404A65C4A7D" 
 >  	 NAS-IP-Address = 172.16.37.131 
 >  	 NAS-Identifier = "172.16.37.131" 
 >  	 NAS-Port-Type = Virtual 
 >  	 Service-Type = Framed-User 
 >  	 Framed-Protocol = PPP 
 >  	 NAS-Port = 5 
 >  	 Framed-IP-Address = 239.0.0.21 

 +MAC адрес Абонента+ - это MAC адрес сетевого оборудования Абонента, посредством которого ему оказывается Услуга. 
 +Пароль Абонента+ — условный момент, необходимый для реализации взаимодействия между коммутационным оборудованием и RADIUS-сервером по протоколу RADIUS. 
 Пароль соответствует MAC-адресу Абонента. 
 +IP-адрес коммутационного оборудования+ — IP-адрес, с которого придет запрос на RADIUS-сервер. 
 +Порт коммутационного оборудования+ — порт, куда включен Абонент. 
 IP-адрес IGMP-группы — IP-адрес канала, который хочет просмотреть (на который хочется подписаться) Абонент. 

 На основе ответа от RADIUS-сервера Абоненту будет отказано в подписке на IGMP-группу, либо Абонент будет подписан на нее. 

 *Аккаунтинг.* 

 В случае успешной аутентификации, Абонент будет подписан на IGMP-группу, (продолжен после того, как поднимется форум Длинка :)) Что характерно форум Длинка опять лежит =))) 

 h2. Developer notes 

 h3. Things to watch out 

 API FreeRADIUS ветки 2.x.x зависит от наличия/отсутствия NDEBUG: 
 <pre> 
 struct auth_req {                                                                
 #ifndef NDEBUG                                                                   
         uint32_t                  magic; /* for debugging only */                  
 #endif                                                                           
         RADIUS_PACKET             packet;  
 </pre> 

 radiusd в „боевом“ режиме сперва инстанцирует и инициализирует все модули, потом форкается. Если модуль при инициализации создает нить — нить умирает при форке вместе с родителем. По этому все нити нужно создавать on-demand.