surveillance/ra2.py : pose un bl ipv6_ra, et mail
This commit is contained in:
parent
1a333ad482
commit
8041a39397
7 changed files with 115 additions and 0 deletions
96
surveillance/ra2.py
Executable file
96
surveillance/ra2.py
Executable 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)
|
Loading…
Add table
Add a link
Reference in a new issue