Архив метки: Python3

Добавляем модуль python для FreeRadius3

Случилось так, что стандартными средствами 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):

#! /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:

#! /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

В логах наблюдаем:

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