scripts/surveillance/filtrage_netacct.py
Vincent Le Gallic c039058708 Enregistrement des droits d'exécution. Aucune vraie modif.
Darcs n'enregistrait pas les permissions des fichiers.
2013-01-31 05:36:25 +01:00

135 lines
4.3 KiB
Python
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#! /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