filtrage_firewall.py 5.33 KB
Newer Older
pessoles's avatar
pessoles committed
1
#! /usr/bin/env python
2
# -*- encoding: utf-8 -*-
pessoles's avatar
pessoles committed
3 4 5 6 7 8 9 10 11 12 13 14


###########################
# Import des commmandes : #
###########################

import commands
import os
# import pg # Import des commandes de postgres
import sys
sys.path.append('/usr/scripts/gestion')
import iptools
15
import psycopg2
pessoles's avatar
pessoles committed
16
import re
17
sys.path.append('/usr/script/surveillance')
pessoles's avatar
pessoles committed
18 19
import strptime

20
# Définition de constantes :
pessoles's avatar
pessoles committed
21 22 23
############################
reseau = ["138.231.136.0/21", "138.231.148.0/22"]

24
# Ouverture de la base de données :
pessoles's avatar
pessoles committed
25
###################################
26
pgsql = psycopg2.connect(host='pgsql.adm.crans.org', database='filtrage', user='crans')
27
pgsql.set_session(autocommit=True)
pessoles's avatar
pessoles committed
28
curseur = pgsql.cursor()
pessoles's avatar
pessoles committed
29 30 31


###########################################
32
# Récupération des tables de protocoles : #
pessoles's avatar
pessoles committed
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
###########################################

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]

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 : #
##############################################################

57
# Définition des motifs des comparaisons :
pessoles's avatar
pessoles committed
58 59 60 61 62 63 64 65
##########################################
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=([^ ]*).*") 


66
# On récupère en continu les log du firewall:
pessoles's avatar
pessoles committed
67 68 69 70 71 72
#############################################
filtre = os.popen("tail -F /var/log/firewall/filtre.log 2> /dev/null")


# On matche les log du firewall avec les motifs :
#################################################
Pierre-Elliott Bécue's avatar
Pierre-Elliott Bécue committed
73
for log in filtre:
pessoles's avatar
pessoles committed
74 75 76
    resultat_p2p = motif_p2p.match(log)
    resultat_virus = motif_virus.match(log)
    resultat_flood = motif_flood.match(log)
77
    
78
    if resultat_p2p :
79
        try:
80
            ip_src = resultat_p2p.group(3)
81 82 83 84 85 86 87 88 89
            verif = iptools.AddrInNets (ip_src,reseau)
        except ValueError:
            continue #IP malformee
        if verif :
            try:
                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)
90
                proto = int(protocole[resultat_p2p.group(5)]) #C'est à dire id pour la base
91 92 93 94 95
                port_src = int(resultat_p2p.group(6))
                port_dest = int(resultat_p2p.group(7))
                date=strptime.syslog2pgsql(date)
            except ValueError, KeyError:
                continue #mal parse
96 97 98 99 100 101 102 103

            # On remplit la base :
            ######################
            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
        ########################################
104
    elif resultat_virus :
105
        try:
106
            ip_src = resultat_virus.group(3)
107 108 109 110 111 112 113 114
            verif = iptools.AddrInNets (ip_src,reseau)
        except ValueError:
            continue
        if verif :
            try:
                date =  resultat_virus.group(1)
                ip_src = resultat_virus.group(3)
                ip_dest = resultat_virus.group(4)
115
                proto = int(protocole[resultat_virus.group(5)]) #C'est à dire id pour la base
116 117 118 119 120 121 122
                port_src = int(resultat_virus.group(6))
                port_dest = int(resultat_virus.group(7))
                # On remplit la base :
                ######################
                date=strptime.syslog2pgsql(date)
            except ValueError, KeyError:
                continue
123 124 125
            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)
            
126
    elif resultat_flood :
127
        try:
128
            ip_src = resultat_flood.group(3)
129 130 131 132 133 134 135 136
            verif = iptools.AddrInNets (ip_src,reseau)
        except ValueError:
            continue
        if verif :
            try:
                date =  resultat_flood.group(1)
                ip_src = resultat_flood.group(3)
                ip_dest = resultat_flood.group(4)
137
                proto = int(protocole[resultat_flood.group(5)]) #C'est à dire id pour la base
138 139 140 141 142 143 144 145
                port_src = int(resultat_flood.group(6))
                port_dest = int(resultat_flood.group(7))
                
                # On remplit la base :
                ######################
                date=strptime.syslog2pgsql(date)
            except ValueError, KeyError:
                continue
146 147
            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)