135 lines
4.3 KiB
Python
Executable file
135 lines
4.3 KiB
Python
Executable file
#! /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
|