From b22cda435b117e3ef1d2ac8654f1189cbc9c0447 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Sun, 19 Nov 2017 20:09:57 +0000 Subject: [PATCH 1/2] =?UTF-8?q?Doc=20+=20si=20nas-innconnu,=20on=20traite?= =?UTF-8?q?=20quand=20m=C3=AAme=20la=20requ=C3=A8te?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- freeradius_utils/auth.py | 42 +++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/freeradius_utils/auth.py b/freeradius_utils/auth.py index 88bee71e..cf82e149 100644 --- a/freeradius_utils/auth.py +++ b/freeradius_utils/auth.py @@ -139,20 +139,17 @@ def instantiate(*_): @radius_event def authorize(data): + """On test si on connait le calling nas: + - si le nas est inconnue, on suppose que c'est une requète 802.1X, on la traite + - si le nas est connu, on applique 802.1X si le mode est activé + - si le nas est connu et si il s'agit d'un nas auth par mac, on repond accept en authorize + """ # Pour les requetes proxifiees, on split nas = data.get('NAS-IP-Address', data.get('NAS-Identifier', None)) nas_instance = find_nas_from_request(nas) # Toutes les reuquètes non proxifiées - if nas != '127.0.0.1': - if not nas_instance: - logger.info(u"Nas inconnu") - return radiusd.RLM_MODULE_REJECT + if nas_instance: nas_type = Nas.objects.filter(nas_type=nas_instance.type).first() - if not nas_type: - logger.info(u"Type de nas non enregistré dans la bdd!".encode('utf-8')) - return radiusd.RLM_MODULE_REJECT - else: - nas_type = None if not nas_type or nas_type.port_access_mode == '802.1X': user = data.get('User-Name', '').decode('utf-8', errors='replace') user = user.split('@', 1)[0] @@ -184,8 +181,8 @@ def post_auth(data): nas = data.get('NAS-IP-Address', data.get('NAS-Identifier', None)) nas_instance = find_nas_from_request(nas) # Toutes les reuquètes non proxifiées - if nas == '127.0.0.1': - logger.info(u"Requète proxifiée".encode('utf-8')) + if not nas_instance: + logger.info(u"Requète proxifiée, nas inconnu".encode('utf-8')) return radiusd.RLM_MODULE_OK nas_type = Nas.objects.filter(nas_type=nas_instance.type).first() if not nas_type: @@ -267,14 +264,37 @@ def check_user_machine_and_register(nas_type, username, mac_address): def decide_vlan_and_register_switch(nas, nas_type, port_number, mac_address): + """Fonction de placement vlan pour un switch en radius filaire auth par mac. + Plusieurs modes : + - nas inconnu, port inconnu : on place sur le vlan par defaut VLAN_OK + - pas de radius sur le port : VLAN_OK + - bloq : VLAN_NOK + - force : placement sur le vlan indiqué dans la bdd + - mode strict : + - pas de chambre associée : VLAN_NOK + - pas d'utilisateur dans la chambre : VLAN_NOK + - cotisation non à jour : VLAN_NOK + - sinon passe à common (ci-dessous) + - mode common : + - interface connue (macaddress): + - utilisateur proprio non cotisant ou banni : VLAN_NOK + - user à jour : VLAN_OK + - interface inconnue : + - register mac désactivé : VLAN_NOK + - register mac activé : + - dans la chambre associé au port, pas d'user ou non à jour : VLAN_NOK + - user à jour, autocapture de la mac et VLAN_OK + """ # Get port from switch and port number extra_log = "" + # Si le NAS est inconnu, on place sur le vlan defaut if not nas: return ('?', u'Nas inconnu', VLAN_OK) sw_name = str(nas) port = Port.objects.filter(switch=Switch.objects.filter(switch_interface=nas), port=port_number) + #Si le port est inconnu, on place sur le vlan defaut if not port: return (sw_name, u'Port inconnu', VLAN_OK) From c2d7403157377de6956b5c34bf7ea61be769fd10 Mon Sep 17 00:00:00 2001 From: Gabriel Detraz Date: Sun, 19 Nov 2017 20:17:17 +0000 Subject: [PATCH 2/2] Fix variable nas_type --- freeradius_utils/auth.py | 1 + 1 file changed, 1 insertion(+) diff --git a/freeradius_utils/auth.py b/freeradius_utils/auth.py index cf82e149..8e783862 100644 --- a/freeradius_utils/auth.py +++ b/freeradius_utils/auth.py @@ -148,6 +148,7 @@ def authorize(data): nas = data.get('NAS-IP-Address', data.get('NAS-Identifier', None)) nas_instance = find_nas_from_request(nas) # Toutes les reuquètes non proxifiées + nas_type = None if nas_instance: nas_type = Nas.objects.filter(nas_type=nas_instance.type).first() if not nas_type or nas_type.port_access_mode == '802.1X':