[Mac_prises] Compter les macs dans les chambres n'est pas du tout utile, finalement, par ailleurs, les configurations pour les macs étaient moisies, on vire les repérages "très suspects", et on laisse le calcul via une "heuristique". Ça simplifiera les mails, sans perdre en pertinence.

This commit is contained in:
Pierre-Elliott Bécue 2013-02-28 00:49:27 +01:00
parent 2824bb851b
commit eaff6de6ad
2 changed files with 12 additions and 74 deletions

View file

@ -356,21 +356,21 @@ class mac_prise:
# Contient trois dictionnaire. Le paramètre mac signifie "combien de chambres doivent voir la même mac pour que ça soit suspect" # Contient trois dictionnaire. Le paramètre mac signifie "combien de chambres doivent voir la même mac pour que ça soit suspect"
# Le paramètre chambre signifie "combien de macs doivent traverser une même chambre pour que ça soit suspect" # Le paramètre chambre signifie "combien de macs doivent traverser une même chambre pour que ça soit suspect"
suspect = { 'instant':{'mac': 2, 'chambre': 2}, suspect = { 'instant':{'mac': 2, 'chambre': 2},
'heuristique':{'mac': 3, 'chambre': 2}, 'heuristique':{'mac': 2, 'chambre': 2},
'journalier':{'mac': 3, 'chambre': 2}, 'journalier':{'mac': 2, 'chambre': 2},
} }
# Contient trois dictionnaire. Le paramètre mac signifie "combien de chambres doivent voir la même mac pour que ça soit suspect" # Contient trois dictionnaire. Le paramètre mac signifie "combien de chambres doivent voir la même mac pour que ça soit suspect"
# Le paramètre chambre signifie "combien de macs doivent traverser une même chambre pour que ça soit suspect" # Le paramètre chambre signifie "combien de macs doivent traverser une même chambre pour que ça soit suspect"
tres_suspect = { 'instant':{'mac': 3, 'chambre': 3}, tres_suspect = { 'instant':{'mac': 3, 'chambre': 3},
'heuristique':{'mac': 4, 'chambre': 3}, 'heuristique':{'mac': 3, 'chambre': 3},
'journalier':{'mac': 4, 'chambre': 3}, 'journalier':{'mac': 3, 'chambre': 3},
} }
# Le point central des analyses. # Le point central des analyses.
rapport_suspect = { 'instant':{'mac': 0.51, 'chambre': 0.51}, rapport_suspect = { 'instant':{'mac': 0.51, 'chambre': 0.51},
'heuristique':{'mac': 0.57, 'chambre': 0.55}, 'heuristique':{'mac': 0.4, 'chambre': 0.55},
'journalier':{'mac': 0.61, 'chambre': 0.58}, 'journalier':{'mac': 0.2, 'chambre': 0.58},
} }
titre_suspect = { 'instant':{'mac': u"Macs se baladant un peu trop entre les chambres (instantanné)", 'chambre': u"Chambres avec un peu trop de macs (instantanné)"}, titre_suspect = { 'instant':{'mac': u"Macs se baladant un peu trop entre les chambres (instantanné)", 'chambre': u"Chambres avec un peu trop de macs (instantanné)"},

View file

@ -63,66 +63,24 @@ def genere_comptage(duree, groupe, associes):
* associes, qui contient l'autre champ * associes, qui contient l'autre champ
""" """
pb_comptage_suspect = {} pb_comptage_suspect = {}
pb_comptage_tres_suspect = {}
output = "" output = ""
requete = "SELECT array_to_string(array_agg(DISTINCT date), ', ') AS dates , %(groupe)s, array_to_string(array_agg(DISTINCT %(associes)s), ', ') AS %(associes)ss, COUNT(DISTINCT %(associes)s) AS nb_%(associes)ss_distinctes, COUNT(%(associes)s) AS nb_%(associes)ss, COUNT(DISTINCT date) as nb_dates_distinctes, COUNT(DISTINCT %(groupe)s) as nb_%(groupe)ss_distinctes FROM correspondance WHERE date >= timestamp 'now' - interval '%(delay)s' GROUP BY %(groupe)s;" % { 'groupe': groupe, 'associes': associes, 'delay': mac_prise.delay[duree] } requete = "SELECT array_to_string(array_agg(DISTINCT date), ', ') AS dates , %(groupe)s, array_to_string(array_agg(DISTINCT %(associes)s), ', ') AS %(associes)ss, COUNT(DISTINCT %(associes)s) AS nb_%(associes)ss_distinctes, COUNT(%(associes)s) AS nb_%(associes)ss, COUNT(DISTINCT date) as nb_dates_distinctes, COUNT(DISTINCT %(groupe)s) as nb_%(groupe)ss_distinctes FROM correspondance WHERE date >= timestamp 'now' - interval '%(delay)s' GROUP BY %(groupe)s;" % { 'groupe': groupe, 'associes': associes, 'delay': mac_prise.delay[duree] }
cur.execute(requete) cur.execute(requete)
fetched = cur.fetchall() fetched = cur.fetchall()
for entry in fetched: for entry in fetched:
# Si c'est la chambre d'un membre actif ou d'un club, on droppe.
if groupe == 'chambre':
if entry[groupe] in chambres_ma:
Logs.append(u"Chambre dropée, car appartenant à un membre actif : %s\n\n" % entry[groupe])
continue
elif entry[groupe] in chambres_clubs:
Logs.append(u"Chambre dropée, car appartenant à un club : %s\n\n" % entry[groupe])
continue
# Sinon, on vérifie si le local est bien rempli. if groupe == "mac":
if entry['nb_'+associes+'s_distinctes'] >= mac_prise.tres_suspect[duree][groupe]: machines = ldap.search('(macAddress=%s)' % entry[groupe])
Logs.append(u"Recherche par %s, entrée très suspecte : %s -> %s \n" % (groupe, entry[groupe], entry[associes+'s'])) if len(machines) > 0:
liste_associes = entry[associes+'s'].split(', ') if isinstance(machines[0], lc_ldap.machineWifi):
pass
# On retire les machines associées à l'adhérent possédant la chambre
if groupe == 'chambre':
liste_temp = [] + liste_associes
for i in liste_temp:
try:
proprio_associe = ldap.search('macAddress=%s' % i)[0].proprio()
if str(proprio_associe['chbre'][0]).lower() == entry[groupe]:
liste_associes.remove(i)
Logs.append(u"La mac %s est associée à la chambre %s, la chambre consultée est %s." % (i, proprio_associe['chbre'][0], entry[groupe]))
except:
Logs.append(u"Exception pour %s, et %s" % (i, entry[groupe]))
if len(liste_associes) < mac_prise.tres_suspect[duree][groupe]-1:
Logs.append(u"Entrée rejetée : la plupart des %s appartiennent au propriétaire de la %s\n\n" % (associes, groupe))
continue
# Toujours un problème ? On ajoute au dico
Logs.append(u"Entrée ajoutée au tableau %s pour la recherche par %s.\n\n" % (duree, groupe))
pb_comptage_tres_suspect[entry[groupe]] = liste_associes
# Même chose avec un seuil plus faible # Même chose avec un seuil plus faible
elif entry['nb_'+associes+'s_distinctes'] >= mac_prise.suspect[duree][groupe]: if entry['nb_'+associes+'s_distinctes'] >= mac_prise.suspect[duree][groupe]:
Logs.append(u"Recherche par %s, entrée suspecte : %s -> %s \n" % (groupe, entry[groupe], entry[associes+'s'])) Logs.append(u"Recherche par %s, entrée suspecte : %s -> %s \n" % (groupe, entry[groupe], entry[associes+'s']))
liste_associes = entry[associes+'s'].split(', ') liste_associes = entry[associes+'s'].split(', ')
if groupe == 'chambre':
liste_temp = [] + liste_associes
for i in liste_temp:
Logs.append(u'%s'%(i))
try:
proprio_associe = ldap.search('macAddress=%s' % i)[0].proprio()
if str(proprio_associe['chbre'][0]).lower() == entry[groupe]:
liste_associes.remove(i)
Logs.append(u"La mac %s est associée à la chambre %s, la chambre consultée est %s." % (i, proprio_associe['chbre'][0], entry[groupe]))
except:
Logs.append(u"Exception pour %s, et %s" % (i, entry[groupe]))
if len(liste_associes) < mac_prise.suspect[duree][groupe]-1:
Logs.append(u"Entrée rejetée : la plupart des %s appartiennent au propriétaire de la %s\n\n" % (associes, groupe))
continue
# On calcule la "probabilité" qu'un truc ne soit pas clair concernant la chambre/mac # On calcule la "probabilité" qu'un truc ne soit pas clair concernant la chambre/mac
rapport = lin(entry['nb_'+associes+'s'], entry['nb_dates_distinctes'], float(entry['nb_'+associes+'s_distinctes'])) rapport = lin(entry['nb_'+associes+'s'], entry['nb_dates_distinctes'], float(entry['nb_'+associes+'s_distinctes']))
if rapport >= mac_prise.rapport_suspect[duree][groupe]: if rapport >= mac_prise.rapport_suspect[duree][groupe]:
@ -151,25 +109,8 @@ def genere_comptage(duree, groupe, associes):
output += tableau(data, titre, largeurs, alignement) output += tableau(data, titre, largeurs, alignement)
output += u"\n\n\n" output += u"\n\n\n"
if len(pb_comptage_tres_suspect) > 0:
output += mac_prise.titre_tres_suspect[duree][groupe]+"\n"
longueur_max = max([len(", ".join(a)) for a in pb_comptage_tres_suspect.values()] + [longueur[associes][1]]) + 4
largeurs = (longueur[groupe][0], longueur_max)
data = []
clefs = pb_comptage_tres_suspect.keys()
clefs.sort()
for clef in clefs:
data.append([clef, ", ".join(pb_comptage_tres_suspect[clef])])
output += tableau(data, titres[groupe], largeurs, alignements)
output += u"\n\n\n"
return output return output
if __name__ == '__main__': if __name__ == '__main__':
output = u"Détection de spoof potentiel\n\n\n" output = u"Détection de spoof potentiel\n\n\n"
coupure = len(output) coupure = len(output)
@ -179,9 +120,6 @@ if __name__ == '__main__':
output += genere_comptage('instant', 'mac', 'chambre') output += genere_comptage('instant', 'mac', 'chambre')
output += genere_comptage('heuristique', 'mac', 'chambre') output += genere_comptage('heuristique', 'mac', 'chambre')
output += genere_comptage('journalier', 'mac', 'chambre') output += genere_comptage('journalier', 'mac', 'chambre')
output += genere_comptage('instant', 'chambre', 'mac')
output += genere_comptage('heuristique', 'chambre', 'mac')
output += genere_comptage('journalier', 'chambre', 'mac')
if time.localtime().tm_min % 30 == 0 and mac_prise.hargneux: if time.localtime().tm_min % 30 == 0 and mac_prise.hargneux:
hargneux = True hargneux = True