
* Le wrapper n'envoie plus de mails * Analyzer envoie ses mails lui-même, avec en pièce jointe le contenu du logging. * Analyzer n'envoit rien si les tableaux sont vide, sauf si hargneux, et sur une demi heure * Création de mac_prise_reperage, dont le but est de lister les macs inconnues d'une chambre sur une plage de 24h (script exécuté par cron toutes les heures), et de compter le nombre de minutes pendant lesquelles elles ont été présentes. Si la somme des compteurs pour une chambre dépasse une quantité dans config, on envoie un mail. Pas de logging ici, tout est "limpide". Il faudra bien définir la variable de config sus-citée. * Modification de config, on rajoute les deux variables pour mac_prise_reperage.py
125 lines
3.8 KiB
Python
Executable file
125 lines
3.8 KiB
Python
Executable file
#!/usr/bin/env python
|
|
# -*- coding: utf8 -*-
|
|
|
|
import psycopg2
|
|
import psycopg2.extras
|
|
import sys
|
|
import smtplib
|
|
|
|
sys.path.append('/usr/scripts/gestion')
|
|
from config import mac_prise
|
|
from affich_tools import tableau
|
|
sys.path.append('/usr/scripts/lc_ldap')
|
|
import lc_ldap
|
|
|
|
ldap = lc_ldap.lc_ldap_admin()
|
|
|
|
membres_actifs = ldap.search('(|(droits=Cableur)(droits=Nounou)(droits=Apprenti)(droits=Bureau))')
|
|
chambres_ma = []
|
|
for membre_actif in membres_actifs:
|
|
try:
|
|
chambres_ma.append(str(membre_actif['chbre'][0]).lower())
|
|
except:
|
|
pass
|
|
|
|
clubs = ldap.search('cid=*')
|
|
chambres_clubs = []
|
|
for club in clubs:
|
|
try:
|
|
chambres_clubs.append(str(club['chbre'][0]).lower())
|
|
except:
|
|
pass
|
|
|
|
conn = psycopg2.connect(user='crans', database='mac_prises')
|
|
cur = conn.cursor(cursor_factory = psycopg2.extras.DictCursor)
|
|
|
|
def reperage_mac_inconnue():
|
|
"""
|
|
Fonction de repérage d'une mac qui ne devrait pas être
|
|
dans telle chambre, sur une plage de 24h, suivant un
|
|
paramètre de config pour le nombre d'occurrences.
|
|
|
|
Sans doute le truc le plus important, sera en tête du mail
|
|
"""
|
|
|
|
output = u""
|
|
probleme = {}
|
|
requete = "SELECT date, chambre, mac FROM correspondance WHERE date >= timestamp 'now' - interval '24 hours' ORDER BY chambre ASC;"
|
|
cur.execute(requete)
|
|
fetched = cur.fetchall()
|
|
liste_parsee = {}
|
|
|
|
for entry in fetched:
|
|
if liste_parsee.has_key(entry['chambre']):
|
|
if liste_parsee[entry['chambre']].has_key(entry['mac']):
|
|
liste_parsee[entry['chambre']][entry['mac']] += 1
|
|
else:
|
|
liste_parsee[entry['chambre']][entry['mac']] = 1
|
|
else:
|
|
liste_parsee[entry['chambre']] = {}
|
|
liste_parsee[entry['chambre']][entry['mac']] = 1
|
|
|
|
for chambre in liste_parsee.keys():
|
|
if chambre in chambres_ma + chambres_clubs:
|
|
continue
|
|
|
|
for mac in liste_parsee[chambre].keys():
|
|
try:
|
|
proprio_associe = ldap.search('macAddress=%s' % mac)[0].proprio()
|
|
if str(proprio_associe['chbre'][0]).lower() == chambre.lower():
|
|
garbage = liste_parsee[chambre].pop(mac)
|
|
except:
|
|
pass
|
|
number = sum(liste_parsee[chambre].values())
|
|
|
|
if number >= mac_prise.max_inconnues_par_jour:
|
|
probleme[chambre] = (liste_parsee[chambre].keys(), number)
|
|
|
|
if len(probleme) > 0:
|
|
output += mac_prise.titre_mac_inconnue+"\n"
|
|
|
|
longueur_max = max([len(", ".join(a[0])) for a in probleme.values()] + [len("macs")]) + 2
|
|
largeurs = (len('chambre') + 2, longueur_max, len('compteur') + 2, len('seuil') + 2)
|
|
|
|
data = []
|
|
clefs = probleme.keys()
|
|
clefs.sort()
|
|
for clef in clefs:
|
|
data.append([clef, ", ".join(probleme[clef][0]), probleme[clef][1], mac_prise.max_inconnues_par_jour])
|
|
|
|
output += tableau(data, ('chambre', 'macs', 'compteur', 'seuil'), largeurs, ('c', 'c', 'c', 'c'))
|
|
output += u"\n\n\n"
|
|
|
|
return output
|
|
|
|
if __name__ == '__main__':
|
|
output = u'Repérage de spoof potentiel par comptage'
|
|
coupure = len(output)
|
|
|
|
output += reperage_mac_inconnue()
|
|
|
|
if len(output) == coupure and not mac_prise.hargneux:
|
|
sys.exit(0)
|
|
|
|
message = """From: %(from)s
|
|
To: %(to)s
|
|
Subject: %(subject)s
|
|
Content-Type: text/plain, charset="UTF-8"
|
|
|
|
%(contenu)s
|
|
|
|
--
|
|
Script d'analyse mac_prise (en test)
|
|
|
|
"""
|
|
|
|
corps = message % { 'from': 'Spoofing watcher <spoof-watcher@crans.org>',
|
|
'to': 'test@lists.crans.org',
|
|
'subject': 'Analyse horaire du spoofing',
|
|
'contenu': output,
|
|
}
|
|
|
|
mail = smtplib.SMTP('localhost')
|
|
mailfrom = 'spoof-watcher@crans.org'
|
|
mailto = 'test@lists.crans.org'
|
|
mail.sendmail(mailfrom, mailto, corps.encode('utf-8'))
|