surveillance/ra2.py : pose un bl ipv6_ra, et mail

This commit is contained in:
Gabriel Detraz 2015-02-21 12:13:22 +01:00
parent 1a333ad482
commit 8041a39397
7 changed files with 115 additions and 0 deletions

View file

@ -0,0 +1 @@
Les nounous du Crans <disconnect@crans.org>

View file

@ -0,0 +1 @@
Envoyé à l'adhérent lorsque son impression est terminée

View file

@ -0,0 +1 @@
[Crans] Deconnexion pour router advertisement

View file

@ -0,0 +1 @@
{{To}}

View file

@ -0,0 +1 @@
{{ mailer }}

View file

@ -0,0 +1,14 @@
Bonjour {{tname}},
La machine {{mach}} dont tu es le propriétaire a été déconnectée du réseau.
La raison de cette déconnexion est technique : le comportement de la machine est anormal.
Celle-ci émet des annonces signalant aux autres machines qu'elle peut gérer leur connexion
internet. Ceci est normalement réservé au routeur du réseau. Cela en compromet donc la
stabilité, et peut impacter les autres utilisateurs.
Pour plus d'information, tu peux nous contacter via diconnect@crans.org.
--
Les membres actifs de l'association

96
surveillance/ra2.py Executable file
View file

@ -0,0 +1,96 @@
#!/bin/bash /usr/scripts/python.sh
# -*- coding: utf-8 -*-
# Réecriture complète de ra.py
# On fait tourner ramond. Dès qu'une mac non autorisée fait une ra,
# ce script s'execute et pose une blackliste sur la machine.
# Prise en compte du nouveau binding.
# Envoie de mails au propriétaire et à disconnect
# Ecrit par Gabriel Détraz <detraz@crans.org>
# Avec l'aide importante de Pierre-elliot Becue <becue@crans.org>
import os
import sys
import time
import subprocess
# On importe les scripts Crans
import lc_ldap.shortcuts
from cranslib import clogger
from gestion import mail
from utils.sendmail import actually_sendmail
# On règle le nombre de RA admissibles par jour par machine:
TOL = 3
# Chemin du fichier des logs
LOGGER = clogger.CLogger('ra2', level='info')
# On ouvre une connexion LDAP à la base admin/de test une fois pour toute.
CONN = lc_ldap.shortcuts.lc_ldap_admin()
def ra_blacklist(Mac_ra):
thetime = time.strftime('%Y-%m-%d', time.localtime())
# Logs des macs capturées, avec la date
LOGGER.info("La mac %s fait des RA" % (Mac_ra,))
# On cherche la machine correspondante
machines = CONN.search(u'(macAddress=%s)' % Mac_ra,mode="rw")
# On agit que si la machine est connu
if machines:
machine = machines[0]
# print machine
p = subprocess.Popen(['grep','-c', thetime + '.*.' + Mac_ra, LOGGER.get_file_handler_path()],stdout=subprocess.PIPE)
stdout, stderr = p.communicate()
# print stdout
if int(stdout) <= TOL:
sys.exit(1)
# Sécurité : on évite de poser une bl à un serveur
if isinstance(machine.proprio(), lc_ldap.objets.AssociationCrans):
sys.exit(1)
# Cohérence : si il y a déjà un bl, on arrète
bl_actif = machine.blacklist_actif()
#print bl_actif
for blacklist in bl_actif:
#print x['type']
if blacklist['type'] == 'ipv6_ra':
sys.exit(1)
# On pose la blackliste sur la machine incriminée
machine.blacklist('ipv6_ra', u'auto ra.py : router advertisement', debut='now', fin='-')
machine.save()
send_mail(machine)
# On envoie une notification à disconnect et à la personne :
def send_mail(machine):
adh = machine.proprio()
From = 'disconnect@crans.org'
To = adh.get_mail()
Cc = 'disconnect@crans.org'
name = adh.ldap_name
mach = unicode(machine['host'][0])
if isinstance(adh, lc_ldap.objets.adherent):
tname = unicode(adh['prenom'][0]) + " " + unicode(adh['nom'][0])
elif isinstance(adh, lc_ldap.objets.club):
tname = unicode(adh['nom'][0])
mailtxt = mail.generate('deconnex_ra', {
'To': To,
'From': From,
'tname': tname,
'mach': mach,
})
actually_sendmail(From, (To,Cc), mailtxt)
## Si testing :
if __name__ == "__main__":
# On récupère la mac dans l'env :
Mac_ra = os.getenv('SOURCE_MAC')
# Mac_ra = sys.argv[1]
# print Mac_ra
ra_blacklist(Mac_ra)