scripts/radius_auth.py
chove b03c53eeae on met en place la sanction bloq
- bloquage total du firewall de komaz
 - refus d'authentification radius
 - bloquage sur squid (le temps que le switch jette la machine)
     => délai de réauthentification de radius

darcs-hash:20060609134849-4ec08-97373756f9c143adc33ea5b08d228fc1f0a3ca97.gz
2006-06-09 15:48:49 +02:00

67 lines
2.1 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
import os, md5, sys, binascii
from commands import getoutput
sys.path.append('/usr/scripts/gestion')
from ldap_crans import crans_ldap, AssociationCrans
from config import ann_scol, dat
def chap_ok(password, challenge, clear_pass) :
""" Test l'authentification chap fournie
password et chalenge doivent être données
en hexa (avec ou sans le 0x devant)
retourne True si l'authentification est OK
retourne False sinon
"""
try :
challenge = binascii.a2b_hex(challenge.replace('0x',''))
password = binascii.a2b_hex(password.replace('0x',''))
if md5.new(password[0] + clear_pass + challenge).digest() == password[1:] :
return True
except :
pass
return False
if __name__ == '__main__' :
# Test chap (comme cela on est sur que c'est bien un switch qui demande)
mac=os.getenv('USER_NAME','').replace('"','')
if not chap_ok(os.getenv('CHAP_PASSWORD'), os.getenv('CHAP_CHALLENGE'), mac) :
sys.stdout.write("Echec test CHAP")
sys.exit(-1)
# Mac dans la base LDAP
m=crans_ldap(readonly=True).search('mac=%s'%mac)['machine']
if len(m)!=1 :
sys.stdout.write("Pb recherche mac (nb résultat !=1)")
sys.exit(-1)
# 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' :
sys.stdout.write("Machine du crans")
sys.exit(-1)
# blockliste bloq
if 'bloq' in m[0].blacklist_actif():
sys.stdout.write("Bloquage total des services pour cette machine")
sys.exit(-1)
# Paiment ok ?
paid=max(proprio.paiement()+[0])
if dat[1]==9 :
# En septembre les anciennes adhésion sont OK
ann_scol -= 1
if ann_scol > paid :
sys.stdout.write("Echec test LDAP")
sys.exit(-1)
# C'est bon
sys.stdout.write("Acces OK")
sys.exit(0)