utilisation de radius pour configurer les switchs en live

Maintenant radius dit aux switchs quel vlan mettre en non taggé. Ça
permet de switcher facilement sur le bon vlan suivant le type de
compte et ça évite la désynchronisation de la configuration des
switchs.

darcs-hash:20080904041337-af139-665172ad09d19f439c6aa8ee6c529752c0e80d95.gz
This commit is contained in:
Jeremie Dimino 2008-09-04 06:13:37 +02:00
parent e209f42707
commit 4fd3644f97
4 changed files with 90 additions and 79 deletions

View file

@ -7,7 +7,7 @@ from syslog import *
sys.path.append('/usr/scripts/gestion')
from ldap_crans import crans_ldap, AssociationCrans
from config import ann_scol, dat
from config import ann_scol, dat, vlans
def chap_ok(password, challenge, clear_pass) :
""" Test l'authentification chap fournie
@ -28,27 +28,38 @@ def chap_ok(password, challenge, clear_pass) :
return False
def do_auth(mac):
"""Effectue l'authentification. Renvoie (success, msg,
vlan). success est 0 si l'authentification est réussie, msg est
pour les logs et vlan est le vlan non taggé à utiliser pour la
prise."""
global ann_scol
if not chap_ok(os.getenv('CHAP_PASSWORD'), os.getenv('CHAP_CHALLENGE'), mac):
return (-1, "Échec test CHAP")
return (-1, "Échec test CHAP", "")
# Mac dans la base LDAP
m = crans_ldap(readonly=True).search('mac=%s' % mac)['machine']
if len(m) != 1:
return (-1, "Pb recherche mac (nb résultat %d!=1)" % len(m))
if len(m) == 0:
return (0, "Mac inconnue", "accueil")
elif len(m) > 1:
return (-1, "Pb recherche mac (nb résultat %d!=1)" % len(m), "")
# N'appartient pas au Crans et n'a pas de prise attribuée
# donc sur uplink ou switch non filtré
# But : éviter le spoof d'une mac d'une machine clef
proprio = m[0].proprietaire()
if proprio.__class__ == AssociationCrans and m[0].prise() == u'N/A':
return (-1, "Machine du crans")
return (-1, "Machine du crans", "")
# blockliste bloq
if 'bloq' in m[0].blacklist_actif():
return (-1, "Bloquage total des services pour cette machine")
return (-1, "Bloquage total des services pour cette machine", "")
# L'adherent ne paie pas, on le met sur le vlan radin
if not proprio.adherentPayant():
return (0, "Ne paie pas", "radin")
# Paiment ok ?
paid = max(proprio.paiement() + [0])
if dat[1] in (8, 9):
@ -58,17 +69,17 @@ def do_auth(mac):
# On laisse 3 jours ou les gens ont une page sur squid
ann_scol -= 1
if ann_scol > paid:
return (-1, "Échec test LDAP")
return (0, "N'a pas payé", "accueil")
# C'est bon
return (0, "Accès OK")
return (0, "Accès adhérent OK", "adherent")
if __name__ == '__main__' :
# Test chap (comme cela on est sur que c'est bien un switch qui demande)
mac = os.getenv('USER_NAME', '').replace('"', '')
# On vérifie si la mac est autorisée
(r, msg) = do_auth(mac)
(r, msg, vlan) = do_auth(mac)
# On logue la prise sur laquelle a lieu la tentative
openlog("radius_auth.py")
@ -76,6 +87,12 @@ if __name__ == '__main__' :
prise = (len(switch) == 6 and (switch[3] + switch[5]) or (switch + "-"))
prise += "%02d" % int(os.getenv("NAS_PORT", 0))
syslog("%s -> %s [%s]" % (prise, mac, msg))
print msg
if vlan:
# Cela indique au switch comment configurer le vlan par défaut
# pour cette prise
print ", ".join(["Tunnel-Type = VLAN",
"Tunnel-Medium-Type = IEEE-802",
"Tunnel-Private-Group-Id = \"%d\"" % vlans[vlan]])
sys.exit(r)