Модуль Управления коммутационным оборудованием по протоколу RADIUS » History » Version 4
Maxim Mamontov, 10/15/2015 08:52 AM
Комментарий по добавлению словарей аттрибутов во FReeRADIUS.
| 1 | 1 | Vladimir Pavljuchenkov | h1. Модуль Управления коммутационным оборудованием по протоколу RADIUS |
|---|---|---|---|
| 2 | |||
| 3 | Модуль должен иметь возможность предоставлять функционал для реализации управления коммутационным оборудованием по протоколу RADIUS, посредством взаимодействия с коммутационным оборудованием. |
||
| 4 | Для этого модуль должен предоставлять возможности: |
||
| 5 | * взаимодействия с RADIUS-серверами, как промежуточным звеном, между ACP и коммутационным оборудованием |
||
| 6 | * получения от RADIUS-серверов информации, необходимой для идентификации Абонента (MAC-адрес Абонента, IP-адрес коммутационного оборудования, к которому подключен Абонент, пароль Абонента) |
||
| 7 | * предоставления RADIUS-серверам информации, необходимой для аутентификации, авторизации и аккаунтинга (ААА) посредством коммутационного оборудования |
||
| 8 | |||
| 9 | Модуль должен реализовывать возможности ААА для следующих технологий: |
||
| 10 | * MAC-Based Access Control / MAC Address Authentication |
||
| 11 | * IGMP Access Control |
||
| 12 | * -802.1X- |
||
| 13 | |||
| 14 | h2. API |
||
| 15 | |||
| 16 | Взаимодействие между сервером RADIUS и АСР происходит посредством _Программного интерфейса (API)_, который представляет из себя клиент-серверное взаимодействие посредством "JSON":http://en.wikipedia.org/wiki/JSON. |
||
| 17 | Взаимодействие между сервером RADIUS и коммутационным оборудованием происходит посредством протокола RADIUS в реализации сервера "FreeRADIUS":http://freeradius.org/ с использованием модуля rlm_stg, к этому серверу. |
||
| 18 | |||
| 19 | h2. MAC-Based Access Control / MAC Address Authentication |
||
| 20 | |||
| 21 | Реализация MAC-Based Access Control / MAC Address Authentication (MBA/MAA) происходит посредством получения RADIUS-сервером от коммутационного оборудования информации, необходимой для аутентификации Абонента, и получением от АСР, |
||
| 22 | информации необходимой для авторизации Абонента. |
||
| 23 | Суть технологии в назначении VLAN ID, 802.1p приоритета и bandwidth assignment на основе MAC адреса посредством взаимодействия коммутационного оборудования с ACP. |
||
| 24 | |||
| 25 | *MAC-Based Access Control* |
||
| 26 | |||
| 27 | В коммутаторах D-Link реализовано два режима работы MBA — _port-based_ и _host-based_. Режим _port-based_ работает в отношении порта коммутатора (аутентифицируется и авторизуется весь порт целиком), _host-based_ работает в отношении конкретного MAC адреса (аутентифицируется и авторизуется конкретный MAC адрес). |
||
| 28 | При _port-based_ режиме работают все возможности управления (назначение VLAN, указание 802.1p метки и bandwidth assigment для трафика). |
||
| 29 | При _host-based_ работает только управлением VLAN ID. Указание 802.1p не работает так приоритет задается для всего порта, а bandwidth assigment не работает, так как полисер работает на уровне порта. |
||
| 30 | |||
| 31 | Технология поддерживает Guest VLAN, при которой неизвестный для ACP/коммутатора MAC адрес помещается в отдельный VLAN. |
||
| 32 | |||
| 33 | Также на коммутаторах реализован failover. В случае если RADIUS-сервер недоступен и на коммутаторе есть информация о MAC адресе, может быть использована локальная БД коммутатора для аутентификации и авторизации абонента. |
||
| 34 | При использовании failover'а нужно держать локальную базу коммутатора синхронизированной с базой ACP (посредством SNMP). |
||
| 35 | |||
| 36 | Информация о MAC адресах может быть получена, как от ACP через RADIUS, так и из локальной БД на самом коммутаторе. |
||
| 37 | При аутентификации/авторизации через локальную БД коммутатора на его порту не может быть более 128 записей о MAC адресах для каждого порта коммутатора, то есть всего 128 х количество портов коммутатора. |
||
| 38 | При аутентификации/авторизации через RADIUS на порту коммутатора не может быть больше 512 записей о MAC адресах. В случае использование failover - не более 128, так как при превышении количества записей о MAC адресах для локальной БД следует разсинхронизация. |
||
| 39 | |||
| 40 | Реализация MBA поддерживает настраиваемые таймауты: |
||
| 41 | * Aging Time — это таймаут, в течении которого MAC адрес считается авторизированным. Диапазон значений: 1-1440 минут, шаг: 1 минута |
||
| 42 | * Hold Time — это таймаут, между двумя авторизациями, в случае если предыдущая была не успешной. По сути это таймаут, через который MAC адрес сможет выйти из Guest VLAN. Диапазон значений: 1-300 секунд, шаг: 1 секунда |
||
| 43 | |||
| 44 | Отдельно стоит отметить, что абоненты, находящиеся в одном порту коммутатора, могут находится в разных VLAN. |
||
| 45 | |||
| 46 | !>https://fouzes.com.ua/redmine/attachments/32/mba.png! |
||
| 47 | |||
| 48 | *Аутентификация.* |
||
| 49 | При появлении MAC-адреса Абонента на коммутационном оборудовании на RADIUS-сервер придет запрос, содержащий MAC адрес Абонента, пароль (единый для коммутатора) и IP-адрес коммутационного оборудования: |
||
| 50 | > Access-Request packet from host 172.18.6.253 port 8021, id=212, length=97 |
||
| 51 | > User-Name = "64315095FAF8" (MAC адрес Абонента) |
||
| 52 | > User-Password = "default" (пароль) |
||
| 53 | > NAS-IP-Address = 172.18.6.253 (IP-адрес коммутационного оборудования) |
||
| 54 | > NAS-Identifier = "D-Link" |
||
| 55 | > NAS-Port-Type = Virtual |
||
| 56 | > Service-Type = NAS-Prompt-User |
||
| 57 | > Calling-Station-Id = "64-31-50-95-FA-F8" |
||
| 58 | |||
| 59 | +MAC-адрес Абонента+ - это MAC-адрес сетевого оборудования Абонента, посредством которого ему оказывается Услуга. |
||
| 60 | +Пароль Абонента+ — условный момент, необходимый для реализации взаимодействия между коммутационным оборудованием и RADIUS-сервером по протоколу RADIUS. |
||
| 61 | Пароль будет единым для всех Абонентов, получающих Услугу через одно и тоже коммутационное оборудование. |
||
| 62 | Максимально возможная длина пароля — 16 символов. |
||
| 63 | +IP-адрес коммутационного оборудования+ — IP-адрес, с которого придет запрос на RADIUS-сервер. |
||
| 64 | |||
| 65 | *Авторизация.* |
||
| 66 | После получения запроса от коммутационного оборудования RADIUS-сервер должен предоставить полученную им информацию ACР, которая должна на основе этой информации: |
||
| 67 | * однозначно идентифицировать Абонента |
||
| 68 | * принять решение о возможности (или ее отсутствии) предоставить Абоненту Услугу на основе финансовой, административной, либо другой информации, доступной АСР |
||
| 69 | |||
| 70 | Далее АСР должна предоставить RADIUS-серверу информацию в какой VLAN следует поместить Абонента для предоставления Услуги (в случае если ее можно предоставить), или |
||
| 71 | предоставить RADIUS-серверу информацию, что Услуга не может быть оказана (в случае если Услугу нельзя предоставить) |
||
| 72 | |||
| 73 | RADIUS-сервер, после получения от АСР информации, должен ответить на запрос, пришедший ранее с коммутационного оборудования, вставив в ответ информацию о VLAN Абонента |
||
| 74 | (в случае, когда Услуга должна быть Абоненту оказана), либо отказать в аутентификации на коммутационном оборудовании Абоненту. |
||
| 75 | > Access-Accept of id 34 to 172.18.6.253 port 8021 |
||
| 76 | > Dlink-Ingress-Bandwidth-Assignment := 2000 |
||
| 77 | > Dlink-Egress-Bandwidth-Assignment := 3000 |
||
| 78 | > Dlink-VLAN-ID := "4005" |
||
| 79 | > 802-1p = 5 |
||
| 80 | |||
| 81 | В случае успешной аутентификации и авторизации, Абонент будет аутентифирован на коммутационном оборудовании и авторизирован (помещен во VLAN _(Dlink-VLAN-ID)_, в котором ему будет оказана Услуга), а также, опционально, на порт коммутационного оборудования, куда подключен Абонент, будет назначен соответствующий приоритет _(802-1p)_ для исходящих из порта пакетов _(802.1p)_ и ограничение входящей _(Dlink-Ingress-Bandwidth-Assignment)_ и исходящей _(Dlink-Egress-Bandwidth-Assignment)_ скорости _(Bandwidth Control)_. |
||
| 82 | В случае не успешной аутентификации, Абонент не будет аутентифицирован на коммутационном оборудовании и, соответственно, будет не авторизован (помещен в Гостевой VLAN, в котором ему будет доступна только Парковая страница). |
||
| 83 | |||
| 84 | *Конфигурация.* |
||
| 85 | Пример настройки FreeRADIUS-сервера: |
||
| 86 | <pre> |
||
| 87 | 192.168.5.3 modules # cat stg |
||
| 88 | stg { |
||
| 89 | address = unix:/var/run/stg.sock |
||
| 90 | } |
||
| 91 | |||
| 92 | |||
| 93 | 192.168.5.3 raddb # cat dictionary |
||
| 94 | #(TODO: Edge-Core, вроде он использует словарь Cisco - проверить) |
||
| 95 | |||
| 96 | |||
| 97 | freeradius # cat dictionary.edge-core? |
||
| 98 | </pre> |
||
| 99 | 4 | Maxim Mamontov | |
| 100 | FreeRADIUS автоматически не загружает все доступные словари, они должны быть явно подключены с помощью директивы $INCLUDE. Например: |
||
| 101 | |||
| 102 | <pre> |
||
| 103 | root@temp-laptop:~# grep dlink /usr/share/freeradius/dictionary |
||
| 104 | $INCLUDE dictionary.dlink |
||
| 105 | </pre> |
||
| 106 | |||
| 107 | 1 | Vladimir Pavljuchenkov | _address = 192.168.5.160_ - IP адрес ACP |
| 108 | _port = 9090_ - порт, для взаимодействия между RADIUS сервером и ACP посредством Apache Thrift |
||
| 109 | |||
| 110 | * для динамических клиентов |
||
| 111 | <pre> |
||
| 112 | 192.168.5.3 sites-enabled # cat clients |
||
| 113 | # Define a network where clients may be dynamically defined. |
||
| 114 | client dynamic { |
||
| 115 | ipaddr = 10.0.0.0 # IP Adress |
||
| 116 | netmask = 24 # Netmask. /32 for IPv4 is prohibited. |
||
| 117 | lifetime = 0 # Lifetime is "0", the dynamic client is never deleted. Restart server to delete client. |
||
| 118 | dynamic_clients = isp_server # Define the virtual server used to discover dynamic clients. |
||
| 119 | } |
||
| 120 | |||
| 121 | authorize { |
||
| 122 | isp |
||
| 123 | pap |
||
| 124 | } |
||
| 125 | |||
| 126 | authenticate { |
||
| 127 | isp |
||
| 128 | pap |
||
| 129 | } |
||
| 130 | |||
| 131 | post-auth { |
||
| 132 | isp |
||
| 133 | } |
||
| 134 | |||
| 135 | preacct { |
||
| 136 | isp |
||
| 137 | } |
||
| 138 | |||
| 139 | accounting { |
||
| 140 | isp |
||
| 141 | } |
||
| 142 | |||
| 143 | # This is the virtual server referenced above by "dynamic_clients". |
||
| 144 | server isp_server { |
||
| 145 | authorize { # The only contents of the virtual server is the "authorize" section. |
||
| 146 | update control { |
||
| 147 | FreeRADIUS-Client-IP-Address = "%{Packet-Src-IP-Address}" # Echo the IP address of the client. |
||
| 148 | FreeRADIUS-Client-Require-MA = no # require_message_authenticator |
||
| 149 | FreeRADIUS-Client-Secret = "test" # secret |
||
| 150 | FreeRADIUS-Client-Shortname = "%{Packet-Src-IP-Address}" # shortname |
||
| 151 | FreeRADIUS-Client-NAS-Type = "other" # nastype |
||
| 152 | } |
||
| 153 | #Client was defined properly. New client is ignored, if does NOT return "ok". |
||
| 154 | ok |
||
| 155 | } |
||
| 156 | } |
||
| 157 | </pre> |
||
| 158 | _ipaddr = 10.0.0._0 и _netmask = 24_ - адресное пространство коммутаторов |
||
| 159 | |||
| 160 | 3 | Maxim Mamontov | Параметр FreeRADIUS-Client-Secret называется shared secret. С помощью него шифруется секретная информация при коммуникации с клиентом, в частности — User-Password. Если значение этого поля не совпадает с тем что использовано в клиенте в User-Password на приемной стороне будет мусор. |
| 161 | |||
| 162 | Модуль типа аутентификации (PAP/CHAP/etc.) нужно подключать после модуля isp в секциях authorize и authenticate. В секции authorize он по полученному от isp Cleartext-Password установит аттрибут Auth-Type, который в секции authenticate будет использован для корректной проверки пароля. |
||
| 163 | 1 | Vladimir Pavljuchenkov | |
| 164 | * для статических клиентов |
||
| 165 | <pre> |
||
| 166 | TODO |
||
| 167 | </pre> |
||
| 168 | |||
| 169 | Пример настройки коммутационного оборудования: |
||
| 170 | |||
| 171 | * D-Link |
||
| 172 | <pre> |
||
| 173 | # RADIUS |
||
| 174 | config radius add 1 192.168.5.3 key test |
||
| 175 | |||
| 176 | # MAC-based_Access_Control |
||
| 177 | |||
| 178 | enable mac_based_access_control |
||
| 179 | config mac_based_access_control authorization attributes radius enable |
||
| 180 | create mac_based_access_control guest_vlanid <VLANID> |
||
| 181 | config mac_based_access_control guest_vlan ports <PORTS RANGE> |
||
| 182 | config mac_based_access_control ports <PORTS RANGE> state enable |
||
| 183 | config mac_based_access_control ports <PORTS RANGE> state disable |
||
| 184 | config mac_based_access_control ports <PORTS RANGE> max_users 128 |
||
| 185 | config mac_based_access_control ports <PORTS RANGE> aging_time 1440 |
||
| 186 | config mac_based_access_control ports <PORTS RANGE> block_time 300 |
||
| 187 | config mac_based_access_control ports <PORTS RANGE> mode <host_based/port_based> |
||
| 188 | config mac_based_access_control method radius |
||
| 189 | config mac_based_access_control password default |
||
| 190 | </pre> |
||
| 191 | Замечание: Все VLAN'ы, в которых должны оказаться абоненты в случае успешной авторизации, должны быть заранее созданы на коммутаторе, т.к. реализация MBA у D-Link не создает VLAN'ы, а лишь назначает их на порты. |
||
| 192 | VLAN'ы на портах могут быть трех состояниях: _trunk_ - VLAN выдан с тегом, _access_ - VLAN выдан без тега, _forbidden_ - VLAN не может быть выдан на этот порт |
||
| 193 | |||
| 194 | * Edge-Core |
||
| 195 | <pre> |
||
| 196 | TODO |
||
| 197 | Пока что положу это тут |
||
| 198 | "IGMP Access у него нет, реализация MBA не подразумевает port-based режим, зато есть фишечка сo static mac-address, они авторизованы по умолчанию. |
||
| 199 | Ну и более богатые настройки через RADIUS, можно не только rate limit и 802.1p, но и QoS политику повесить на порт, и назначить кучу вланов, указав как именно выданы на порт." |
||
| 200 | </pre> |
||
| 201 | |||
| 202 | h2. IGMP Access Control |
||
| 203 | |||
| 204 | Реализация IGMP Access Control происходит посредством получения RADIUS-сервером от коммутационного оборудования информации, необходимой для аутентификации запроса подписки на IGMP-группу, и последующего аккаутинга этой подписки в случае успешной аутентификации. |
||
| 205 | |||
| 206 | *Аутентификация.* |
||
| 207 | При появлении IGMP пакета на коммутационном оборудовании на RADIUS-сервер придет запрос, содержащий MAC-адрес Абонента, пароль Абонента и IP-адрес коммутационного оборудования, номер порта коммутационного оборудования, IP-адрес IGMP-группы: |
||
| 208 | > Access-Request packet from host 172.16.37.131 port 4973, id=101, length=103 |
||
| 209 | > User-Name = "5404A65C4A7D" |
||
| 210 | > User-Password = "5404A65C4A7D" |
||
| 211 | > NAS-IP-Address = 172.16.37.131 |
||
| 212 | > NAS-Identifier = "172.16.37.131" |
||
| 213 | > NAS-Port-Type = Virtual |
||
| 214 | > Service-Type = Framed-User |
||
| 215 | > Framed-Protocol = PPP |
||
| 216 | > NAS-Port = 5 |
||
| 217 | > Framed-IP-Address = 239.0.0.21 |
||
| 218 | |||
| 219 | +MAC адрес Абонента+ - это MAC адрес сетевого оборудования Абонента, посредством которого ему оказывается Услуга. |
||
| 220 | +Пароль Абонента+ — условный момент, необходимый для реализации взаимодействия между коммутационным оборудованием и RADIUS-сервером по протоколу RADIUS. |
||
| 221 | Пароль соответствует MAC-адресу Абонента. |
||
| 222 | +IP-адрес коммутационного оборудования+ — IP-адрес, с которого придет запрос на RADIUS-сервер. |
||
| 223 | +Порт коммутационного оборудования+ — порт, куда включен Абонент. |
||
| 224 | IP-адрес IGMP-группы — IP-адрес канала, который хочет просмотреть (на который хочется подписаться) Абонент. |
||
| 225 | |||
| 226 | На основе ответа от RADIUS-сервера Абоненту будет отказано в подписке на IGMP-группу, либо Абонент будет подписан на нее. |
||
| 227 | |||
| 228 | *Аккаунтинг.* |
||
| 229 | |||
| 230 | В случае успешной аутентификации, Абонент будет подписан на IGMP-группу, (продолжен после того, как поднимется форум Длинка :)) Что характерно форум Длинка опять лежит =))) |
||
| 231 | |||
| 232 | h2. Developer notes |
||
| 233 | |||
| 234 | h3. Things to watch out |
||
| 235 | |||
| 236 | API FreeRADIUS ветки 2.x.x зависит от наличия/отсутствия NDEBUG: |
||
| 237 | <pre> |
||
| 238 | struct auth_req { |
||
| 239 | #ifndef NDEBUG |
||
| 240 | uint32_t magic; /* for debugging only */ |
||
| 241 | #endif |
||
| 242 | RADIUS_PACKET packet; |
||
| 243 | </pre> |
||
| 244 | 2 | Maxim Mamontov | |
| 245 | radiusd в „боевом“ режиме сперва инстанцирует и инициализирует все модули, потом форкается. Если модуль при инициализации создает нить — нить умирает при форке вместе с родителем. По этому все нити нужно создавать on-demand. |