scripts/surveillance/filtrage_firewall.py
pessoles 83a8ac0e54 On passe sur rouge
darcs-hash:20051001125506-6d78a-ad0c95c07df76b12cd578364756962db13237894.gz
2005-10-01 14:55:06 +02:00

137 lines
4.9 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
from pyPgSQL import PgSQL
import re
from time import gmtime,strftime
sys.path.append('/usr/script/surveillance')
import strptime
# Définition de constantes :
############################
reseau = ["138.231.136.0/21", "138.231.148.0/22"]
# Ouverture de la base de données :
###################################
pgsql = PgSQL.connect(host='rouge.adm.crans.org', database='filtrage', user='crans')
pgsql.autocommit = True
###########################################
# Récupération des tables de protocoles : #
###########################################
curseur = pgsql.cursor()
requete = "SELECT nom,id_p2p from protocole_p2p"
curseur.execute(requete)
curseur.fetchall
tableau = curseur.fetchall()
protocole_p2p = {}
for cellule in tableau:
protocole_p2p[cellule[0]]=cellule[1]
curseur = pgsql.cursor()
requete = "SELECT nom,id from protocole"
curseur.execute(requete)
curseur.fetchall
tableau = curseur.fetchall()
protocole = {}
for cellule in tableau:
protocole[cellule[0]]=cellule[1]
##############################################################
# Parser ler log du firewall: /var/log/firewall/filtre.log : #
##############################################################
# Définition des motifs des comparaisons :
##########################################
motif_p2p = re.compile("^(.*) komaz .* IPP2P=([^ ]*).* SRC=([^ ]*).* DST=([^ ]*).* PROTO=([^ ]*).* SPT=([^ ]*).* DPT=([^ ]*).*")
motif_virus = re.compile("^(.*) komaz .* Virus:([^ ]*).* SRC=([^ ]*).* DST=([^ ]*).* PROTO=([^ ]*).* SPT=([^ ]*).* DPT=([^ ]*).*")
motif_flood = re.compile("^(.*) komaz .* Flood:([^ ]*).* SRC=([^ ]*).* DST=([^ ]*).* PROTO=([^ ]*).* SPT=([^ ]*).* DPT=([^ ]*).*")
# On récupère en continu les log du firewall:
#############################################
filtre = os.popen("tail -F /var/log/firewall/filtre.log 2> /dev/null")
# On matche les log du firewall avec les motifs :
#################################################
for log in filtre :
resultat_p2p = motif_p2p.match(log)
resultat_virus = motif_virus.match(log)
resultat_flood = motif_flood.match(log)
if resultat_p2p :
ip_src = resultat_p2p.group(3)
verif = iptools.AddrInNets (ip_src,reseau)
if verif :
date = resultat_p2p.group(1)
id_p2p = int(protocole_p2p[resultat_p2p.group(2)])
ip_src = resultat_p2p.group(3)
ip_dest = resultat_p2p.group(4)
proto = int(protocole[resultat_p2p.group(5)]) #C'est à dire id pour la base
port_src = int(resultat_p2p.group(6))
port_dest = int(resultat_p2p.group(7))
date=strptime.syslog2pgsql(date)
# On remplit la base :
######################
curseur = pgsql.cursor()
requete = "INSERT INTO p2p (date,ip_src,ip_dest,id_p2p,id,port_src,port_dest) VALUES ('%s','%s','%s',%d,%d,%d,%d)" % (date,ip_src,ip_dest,id_p2p,proto,port_src,port_dest)
curseur.execute(requete)
# On teste si le log contient des virus
########################################
elif resultat_virus :
ip_src = resultat_virus.group(3)
verif = iptools.AddrInNets (ip_src,reseau)
if verif :
date = resultat_virus.group(1)
ip_src = resultat_virus.group(3)
ip_dest = resultat_virus.group(4)
proto = int(protocole[resultat_virus.group(5)]) #C'est à dire id pour la base
port_src = int(resultat_virus.group(6))
port_dest = int(resultat_virus.group(7))
# On remplit la base :
######################
date=strptime.syslog2pgsql(date)
curseur = pgsql.cursor()
requete = "INSERT INTO virus (date,ip_src,ip_dest,id,port_src,port_dest) VALUES ('%s','%s','%s',%d,%d,%d)" % (date,ip_src,ip_dest,proto,port_src,port_dest)
curseur.execute(requete)
elif resultat_flood :
ip_src = resultat_flood.group(3)
verif = iptools.AddrInNets (ip_src,reseau)
if verif :
date = resultat_flood.group(1)
ip_src = resultat_flood.group(3)
ip_dest = resultat_flood.group(4)
proto = int(protocole[resultat_flood.group(5)]) #C'est à dire id pour la base
port_src = int(resultat_flood.group(6))
port_dest = int(resultat_flood.group(7))
# On remplit la base :
######################
date=strptime.syslog2pgsql(date)
curseur = pgsql.cursor()
requete = "INSERT INTO flood (date,ip_src,ip_dest,id,port_src,port_dest) VALUES ('%s','%s','%s',%d,%d,%d)" % (date,ip_src,ip_dest,proto,port_src,port_dest)
curseur.execute(requete)