LINUX.ORG.RU
ФорумAdmin

Freeradius проверка условия

 ,


0

2

Как записать проверку условия на присутствие пользователя в группе. Использую Samba как ldap. Проверку делаю в authorize {….} …/site-available/default

 if (memberOf == "CN=grVlan1010,OU=groups,DC=some,DC=org") { 
                update reply {
                        &Tunnel-type = 13
                        &Tunnel-medium-type = 6
                        &Tunnel-Private-Group-Id = 1
                        &Reply-Message := Custom-Attribute
                }
        }

Проверка проваливается.

Решил при помощи скрипта python. Проверить нахождение пользователя в группах. Отправить reply и оно назначит нужный vlan на port NAS

#! /usr/bin/env python2

import radiusd
import ldap
    
def post_auth(p):
	    print "*** post_auth ***"

    dict_request = {}
    # Список vlan для проверки
    list_vlans = ['2010', '2020', '2030', '2040','2050']
    # Инициализация соединения
    conn = ldap.initialize('ldap://IP')

    # This is true when using pass_all_vps_dict
    if type(p) is dict:
        print "Request:", p["request"]
        print "Reply:", p["reply"]
        print "Config:", p["config"]
        print "State:", p["session-state"]
        print "Proxy-Request:", p["proxy-request"]
        print "Proxy-Reply:", p["proxy-reply"]
    else:
        print p
	    
	    # Записать запрос в словарь
    dict_request = dict(p["request"])
    # Получить имя учетной записи без доменной части "DOMAIN\\" userName
    user_name = dict_request['User-Name'].split('\\')[1]
    # Где производить поиск пользователей
    source_dn = 'ou=departments,dc=domain,dc=com'

    try:
        conn.protocol_version = ldap.VERSION3
        conn.simple_bind_s('Administrator@domain.com', 'password')
        # Перебор из списка доступных vlans
        for vlan in list_vlans:
			    # Фильтр поиска в depatrments по двум параметрам user_name и vlan 
            search_filter = "(&(cn=%s)(memberOf=CN=grVlan%s,OU=groups,DC=domain,DC=com))" % (user_name, vlan)
				  # Проверка условия, возвращает ли запрос conn.search "true" - значит
				  # пользователь и vlan был найден.  
            if conn.search_s(source_dn, ldap.SCOPE_SUBTREE, search_filter):
                # Сформировать ответ для NAS
                tt = ("Tunnel-type", "13")
                tmt = ("Tunnel-medium-type", "6")
                tpg = ("Tunnel-Private-Group-Id", vlan)

                update_dict = {"reply": (tt,tmt,tpg,),}
                
                return radiusd.RLM_MODULE_OK, update_dict

            else:
                print("False", vlan)
        
    except ldap.INVALID_CREDENTIALS:
        print('Wrong password or username...')
        sys.exit(0)
    except ldap.SERVER_DOWN:
        print('Not connection...LDAP')
        sys.exit(0)
    except:
        print('Something else went wrong')
        sys.exit(0)
# Закрыть соединение
    conn.unbind_s()    
tooncheg
() автор топика