Случилось так, что стандартными средствами FreeRadius авторизации ну никак не «разрулить» те условия, которые необходимы. Решение: включим/поставим модуль python для FreeRadius и будем использовать его для авторизации и выдачи абонентам сетевых настроек.
Далее пути указаны для Ubuntu.
1) Сделаем симлинк (читай включим модуль) для модуля pyhton в папке
|
ln -s /etc/freeradius/3.0/mods-available/python /etc/freeradius/3.0/mods-enabled |
2) В файле настроек пропишем путь для файла написанного на языке python, который будет отвечать за авторизацию, и имя собственно модуля, например work:
|
python_path="/etc/freeradius/3.0/mods-config/python" module = work |
Так-же нужно расскоментировать те функции, которые будут вызываться модулем. Например:
|
mod_authorize = ${.module} func_authorize = authorize mod_authenticate = ${.module} func_authenticate = authenticate |
3) Создадим модуль work. Можно на основе example. В моём случае он адаптирован под python3 (в «базе» он поставляется пот python 2.7):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
#! /usr/bin/env python3 import radiusd def instantiate(p): print ("*** instantiate ***") print (p) # return 0 for success or -1 for failure def authenticate(p): print ("*** Autefication!!***") print (p) def authorize(p): print ("*** authorize ***") radiusd.radlog(radiusd.L_INFO, '*** radlog call in authorize ***') print (p) print (radiusd.config) return radiusd.RLM_MODULE_OK def preacct(p): print ("*** preacct ***") print (p) return radiusd.RLM_MODULE_OK def accounting(p): print ("*** accounting ***") radiusd.radlog(radiusd.L_INFO, '*** radlog call in accounting (0) ***') print (p) return radiusd.RLM_MODULE_OK def pre_proxy(p): print ("*** pre_proxy ***") print (p) return radiusd.RLM_MODULE_OK def post_proxy(p): print ("*** post_proxy ***") print (p) return radiusd.RLM_MODULE_OK def post_auth(p): print ("*** post_auth ***") print (p) return radiusd.RLM_MODULE_OK def recv_coa(p): print ("*** recv_coa ***") print (p) return radiusd.RLM_MODULE_OK def send_coa(p): print ("*** send_coa ***") print (p) return radiusd.RLM_MODULE_OK def detach(): print ("*** goodbye from example.py ***") return radiusd.RLM_MODULE_OK |
И чуть изменим файл radiusd.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
#! /usr/bin/env python3 # from modules.h RLM_MODULE_REJECT = 0 RLM_MODULE_FAIL = 1 RLM_MODULE_OK = 2 RLM_MODULE_HANDLED = 3 RLM_MODULE_INVALID = 4 RLM_MODULE_USERLOCK = 5 RLM_MODULE_NOTFOUND = 6 RLM_MODULE_NOOP = 7 RLM_MODULE_UPDATED = 8 RLM_MODULE_NUMCODES = 9 # from log.h L_AUTH = 2 L_INFO = 3 L_ERR = 4 L_WARN = 5 L_PROXY = 6 L_ACCT = 7 L_DBG = 16 L_DBG_WARN = 17 L_DBG_ERR = 18 L_DBG_WARN_REQ = 19 L_DBG_ERR_REQ = 20 # log function def radlog(level, msg): import sys sys.stdout.write(msg + '\n') level = level |
В файле default включим модули в секциях authorize и authenticate:
|
authorize { python .... } authenticate { Auth-Type PAP { pap python } ... } |
Запускаем:
|
radtest steve testing localhost 1812 testing123 |
В логах наблюдаем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
Ready to process requests (0) Received Access-Request Id 62 from 127.0.0.1:53324 to 127.0.0.1:1812 length 75 (0) User-Name = "steve" (0) User-Password = "testing" (0) NAS-IP-Address = 126.0.0.1 (0) NAS-Port = 1812 (0) Message-Authenticator = 0xacf43d1ab9f8719bc9e92f0f7ebd4395 (0) # Executing section authorize from file /etc/freeradius/3.0/sites-enabled/default (0) authorize { *** authorize *** *** radlog call in authorize *** (('User-Name', 'steve'), ('User-Password', 'testing'), ('NAS-IP-Address', '126.0.0.1'), ('NAS-Port', '1812'), ('Message-Authenticator', '0xacf43d1ab9f8719bc9e92f0f7ebd4395')) {} (0) [python] = ok (0) policy filter_username { (0) if (&User-Name) { (0) if (&User-Name) -> TRUE |