#! /usr/bin/env python # -*- encoding: iso-8859-15 -*- ########################### # Import des commmandes : # ########################### import commands import os #import pg # Import des commandes de postgres import sys sys.path.append('/usr/scripts/gestion') import iptools import psycopg2 from time import strftime, localtime sys.path.append('/usr/scripts/surveillance') import strptime, config # définition des tables ####################### from socket import gethostname hostname = gethostname().split(".")[0] # Définition de constantes : ############################ reseau = config.NETs['all'] # Ouverture de la base de données : ################################### pgsql = PgSQL.connect(host='pgsql.adm.crans.org', database='filtrage', user='crans') # Il faudra remplacer la ligne ci-dessous par pgsql.set_session(autocommit=True) sous wheezy pgsql.set_isolation_level(0) # Récupération de la table de protocoles : ########################################## requete = "SELECT id from protocole" curseur = pgsql.cursor() curseur.execute(requete) curseur.fetchall tableau = curseur.fetchall() protocole = [] for cellule in tableau: protocole.append(cellule[0]) # Fonction de commit : ###################### def commit(act, prec={'donnees':0}): # act = communication actuelle # prec = communication précédente si elle existe # Vérification de l'IP : verif = iptools.AddrInNets(act["ip_src"],reseau) if verif: crans = "src" ext = "dest" upload = int(act["donnees"]) download = int(prec["donnees"]) port_src=int(act['port_src']) port_dest=int(act['port_dest']) else : crans = "dest" ext = "src" upload = int(prec["donnees"]) download = int(act["donnees"]) port_src=int(act['port_dest']) port_dest=int(act['port_src']) proto = int(act["proto"]) ip_crans = act["ip_%s" % crans] ip_ext = act["ip_%s" % ext] port_crans = int(act["port_%s" % crans]) port_ext = int(act["port_%s" % ext]) if proto not in protocole: proto = -1 # Traitement dans la base SQL date = strptime.syslog2pgsql(strftime("%b %d %H:%M:%S",localtime(int(act["date"])))) curseur = pgsql.cursor() requete = "INSERT INTO upload (ip_crans,ip_ext,port_crans,port_ext,download,upload,date,id) VALUES ('%s','%s',%d,%d,%d,%d,'%s',%d)" % (ip_crans, ip_ext, port_crans, port_ext, download, upload, date, proto) curseur.execute(requete) ################################################################## # Parser les logs de net-acct : /var/log/net-acct/net-acct.log : # ################################################################## # On récupère en continu les log de net-account netacct = os.popen("sh -c 'tail -F /var/log/net-acct/net-acct.log 2> /dev/null'") # Sélectionner le couple de ligne qui va bien (port_src_i=port_dest_i+1 et ip_src_i=ip_dest_i+1 # Création d'un dictionnaire pour matcher les conversations precedent = {"ip_src":"0","ip_dest":"0","port_src":"0","port_dest":"0","date":"0"} # Marqueur pour ne pas enregistrer deux fois la même conversation precedent_commite = True for log in netacct : # Découpage du log date,proto,ip_src,port_src,ip_dest,port_dest,donnees = log.split("\t")[0:-2] # Si on change de date, on analyse le dump et on commite if precedent["date"] != date: print 'dump (%s=>%s)'%(precedent["date"],date) #os.system('/usr/scripts/surveillance/filtrage_dump.py') print 'done' # Création d'un dictionnaire pour matcher les conversations actuel = {} actuel["date"] = date actuel["proto"] = proto actuel["ip_src"]=ip_src actuel["port_src"]=port_src actuel["ip_dest"]=ip_dest actuel["port_dest"]=port_dest actuel["donnees"]=donnees actuel["date"]=date # On regarde si c'est le retour de la connexion du dessus print actuel if (actuel["ip_src"]==precedent["ip_dest"] and actuel["ip_dest"]==precedent["ip_src"] and actuel["port_src"]==precedent["port_dest"] and actuel["port_dest"]==precedent["port_src"]): commit(actuel, precedent) precedent_commite = True elif not precedent_commite: # On commite le précédent avant de l'écraser commit(precedent) else: precedent_commite = False precedent=actuel