
sont au moment du mail sanctionn. La limite droite est celle au moment du mail, si elle change entre le moment d'une santion et d'un mail il peut y avoir une incohrence (??) On tient compte dans la requte sql de l'ip mais aussi du protocole utilise, une machine utilisant plusieurs protocoles sera assure donc d'apparatre avec les deux flux distincts dans le rcapitulatif (il n'y a pas de sanctions croises pour le moment) darcs-hash:20060311000319-72cb0-6594868619e8497a46de722f029b6ef23c1e6dd3.gz
282 lines
9.9 KiB
Python
Executable file
282 lines
9.9 KiB
Python
Executable file
#! /usr/bin/env python
|
|
# -*- encoding: iso-8859-15 -*-
|
|
|
|
"""
|
|
Script d'envoi des statistiques des déconnections et du traffic de la journée à disconnect@
|
|
|
|
Copyright (C) Xavier Pessoles - Étienne Chové
|
|
Licence : GPLv2
|
|
"""
|
|
|
|
###########################
|
|
# Import des commmandes : #
|
|
###########################
|
|
|
|
import commands
|
|
import sys
|
|
from pyPgSQL import PgSQL
|
|
sys.path.append('/usr/scripts/gestion')
|
|
sys.path.append('/usr/scripts/surveillance')
|
|
import config
|
|
import smtplib
|
|
import socket
|
|
import time, random, md5
|
|
from analyse import stats
|
|
from affich_tools import tableau_ng
|
|
from ldap_crans import crans
|
|
|
|
###############################
|
|
# Ouverture des connections : #
|
|
###############################
|
|
|
|
pgsql = PgSQL.connect(host='/var/run/postgresql', database='filtrage', user='crans')
|
|
curseur = pgsql.cursor()
|
|
mail = smtplib.SMTP('localhost')
|
|
|
|
|
|
###########################
|
|
# Statistiques d'upload : #
|
|
###########################
|
|
# Y a-t-il eu des récidivistes
|
|
|
|
|
|
# Liste des uploads :
|
|
#####################
|
|
requete = "SELECT ip_crans,sum(upload) as somme,sum(download) FROM upload WHERE ip_crans IN (SELECT ip_crans FROM avertis_upload where hard='1' or soft='1') and date > timestamp 'now' - interval '1 day' GROUP BY ip_crans ORDER BY somme DESC"
|
|
curseur.execute(requete)
|
|
liste_upload = tableau_ng( data = [ [l[1], l[2], socket.gethostbyaddr(str(l[0]))[0]] for l in curseur.fetchall() ],
|
|
titre = ['upload','download','machine'],
|
|
largeur = [10, 10, 30],
|
|
format = ['o','o','s'],
|
|
alignement = ['d','d','c']).encode('iso-8859-15')
|
|
|
|
|
|
# Traffic exempté :
|
|
###################
|
|
requete = "SELECT ip_crans,sum(upload) AS somme , sum(download) FROM upload WHERE ip_crans IN ( SELECT ip_crans from exemptes) and date > timestamp 'now' - interval '1 day' GROUP BY ip_crans ORDER BY somme DESC"
|
|
curseur.execute(requete)
|
|
liste_exemptes = tableau_ng( data = [ [l[1],l[2],socket.gethostbyaddr(str(l[0]))[0] ] for l in curseur.fetchall() ],
|
|
titre = ['upload','download','machine'],
|
|
largeur = [10, 10, 30],
|
|
format = ['o','o','s'],
|
|
alignement = ['d','d','c']).encode('iso-8859-15')
|
|
|
|
|
|
# Upload des serveurs :
|
|
#######################
|
|
liste_serveurs = []
|
|
for i in (10,1,3,4,7,8,9,11):
|
|
IP='138.231.136.%d' % i
|
|
hostname = socket.gethostbyaddr("%s"%IP)[0]
|
|
requete = "SELECT sum(upload),sum(download) FROM upload WHERE ip_crans='%s' AND date > timestamp 'now' - interval '1 day' "%IP
|
|
curseur.execute(requete)
|
|
traffic=curseur.fetchone()
|
|
if traffic == [None, None] :
|
|
continue
|
|
liste_serveurs.append([traffic[0],traffic[1],hostname])
|
|
|
|
liste_serveurs = tableau_ng( data = liste_serveurs,
|
|
titre = ['upload','download','serveur'],
|
|
largeur = [10, 10, 30],
|
|
format = ['o','o','s'],
|
|
alignement = ['d','d','c']).encode('iso-8859-15')
|
|
|
|
|
|
# statistiques des gros uploads depuis les serveurs
|
|
###################################################
|
|
gros_uploads_des_serveurs = stats (ip_crans=[x.ip() for x in crans().machines() if x.nom() not in [u'sila.crans.org']],show=['ip_crans','ip_ext'],upload_mini=50,show_limit=100).encode('iso-8859-15')
|
|
|
|
############################
|
|
# Statistiques virus/p2p : #
|
|
############################
|
|
|
|
# Machines actuellement déconnectées :
|
|
######################################
|
|
requete = "SELECT DISTINCT ip_crans FROM avertis_virus"
|
|
curseur.execute(requete)
|
|
infections = [ x[0] for x in curseur.fetchall() ]
|
|
liste_virus=[]
|
|
for IP in infections:
|
|
try:
|
|
hostname = socket.gethostbyaddr("%s"%IP)[0]
|
|
except socket.herror:
|
|
continue
|
|
liste_virus.append(["%s"%(str(hostname))])
|
|
|
|
liste_virus = tableau_ng(liste_virus, titre=['machine'], largeur=[30]).encode('iso-8859-15')
|
|
|
|
# Machines ayant fait des attaques virus dans la journée :
|
|
##########################################################
|
|
requete = "SELECT * FROM (SELECT ip_src,count(ip_src) as compteur FROM virus WHERE date > timestamp 'now' - interval '1 day' group by ip_src order by compteur desc) AS tous WHERE tous.compteur>'%s' limit 30" % config.virus.virus
|
|
curseur.execute(requete)
|
|
liste_virus2 = []
|
|
for IP, compteur in curseur.fetchall():
|
|
hostname = socket.gethostbyaddr(IP)[0]
|
|
liste_virus2.append([hostname,compteur])
|
|
liste_virus2 = tableau_ng( data = liste_virus2,
|
|
titre = ['machine','nombre'],
|
|
largeur = [30, 12],
|
|
alignement = ['c','d'] ).encode('iso-8859-15')
|
|
|
|
|
|
# Machines ayant fait de attaques flood dans la journée :
|
|
#########################################################
|
|
requete = "SELECT * FROM (SELECT ip_src,count(ip_src) as compteur FROM flood WHERE date > timestamp 'now' - interval '1 day' group by ip_src order by compteur desc) AS tous WHERE tous.compteur>'%s' limit 30" % config.virus.flood
|
|
curseur.execute(requete)
|
|
liste_virus3 = []
|
|
for IP, compteur in curseur.fetchall():
|
|
hostname = socket.gethostbyaddr(IP)[0]
|
|
liste_virus3.append([hostname,compteur])
|
|
liste_virus3 = tableau_ng( data = liste_virus3,
|
|
titre = ['machine','nombre'],
|
|
largeur = [30, 12],
|
|
alignement = ['c','d'] ).encode('iso-8859-15')
|
|
|
|
|
|
# Machines ayant utilisé des protocoles P2P dans la journée :
|
|
#############################################################
|
|
requete = "SELECT ip_src, nom, compteur, date FROM \
|
|
(SELECT ip_src,nom,count(ip_src) as compteur \
|
|
FROM p2p INNER JOIN protocole_p2p ON p2p.id_p2p=protocole_p2p.id_p2p \
|
|
WHERE p2p.date > timestamp 'now' - interval '1 day' \
|
|
GROUP BY ip_src,nom ORDER BY compteur desc) \
|
|
AS tous \
|
|
LEFT JOIN avertis_p2p ON ip_src=ip_crans \
|
|
WHERE tous.compteur>5 \
|
|
LIMIT 30"
|
|
curseur.execute(requete)
|
|
liste_p2p = []
|
|
for IP, protocole, compteur, blackliste in curseur.fetchall():
|
|
hostname = socket.gethostbyaddr(IP)[0]
|
|
if blackliste :
|
|
liste_p2p.append(['*%s*'%hostname, '*%s*'%protocole, '*%d*'%compteur, '*%d*'%config.p2p.limite[protocole]])
|
|
else:
|
|
liste_p2p.append([hostname, protocole, compteur, config.p2p.limite[protocole]])
|
|
liste_p2p = tableau_ng( data = liste_p2p,
|
|
titre = ['machine','protocole','nombre','limite'],
|
|
largeur = [32, 14, 10, 8],
|
|
alignement = ['c','c','d','d'] ).encode('iso-8859-15')
|
|
|
|
|
|
|
|
#############
|
|
# Message : #
|
|
#############
|
|
|
|
expediteur = "disconnect@crans.org"
|
|
destinataire = "disconnect@crans.org"
|
|
message="""From: %(From)s
|
|
To: %(To)s
|
|
Subject: Statistiques des dernières 24h
|
|
Message-Id: <%(uuid)s1@crans.org>
|
|
|
|
*Machines actuellement déconnectées pour virus*
|
|
|
|
%(liste_virus)s
|
|
|
|
*Machines ayant commis des attaques virales dans la journée*
|
|
|
|
%(liste_virus2)s
|
|
|
|
*Machines ayant commis des attaques virales de type flood dans la journée*
|
|
|
|
%(liste_virus3)s
|
|
|
|
*Machines ayant utilisé des protocoles P2P durant la journée*
|
|
|
|
%(liste_p2p)s
|
|
|
|
*Statistiques de traffic des adhérents* (tout le traffic)
|
|
|
|
%(liste_upload)s
|
|
|
|
*Statistiques de traffic des adhérents exemptés* (juste le traffic exempté)
|
|
|
|
%(liste_exemptes)s
|
|
|
|
*Statistiques de traffic des serveurs*
|
|
|
|
%(liste_serveurs)s
|
|
|
|
*Gros uploads des serveurs* (sila est exempté totalement)
|
|
|
|
%(gros_uploads_des_serveurs)s
|
|
--
|
|
statistiques.py
|
|
"""
|
|
|
|
uuid = md5.md5(str(long(time.time() * 1000)) +
|
|
str(long(random.random()*100000000000000000L))).hexdigest()
|
|
corps = message %{'From':expediteur,
|
|
'To':destinataire,
|
|
'uuid':uuid,
|
|
'liste_upload':liste_upload,
|
|
'liste_p2p_bl':liste_p2p_bl,
|
|
'liste_p2p':liste_p2p,
|
|
'liste_virus':liste_virus,
|
|
'liste_virus2':liste_virus2,
|
|
'liste_virus3':liste_virus3,
|
|
'liste_exemptes':liste_exemptes,
|
|
'liste_serveurs':liste_serveurs,
|
|
'gros_uploads_des_serveurs':gros_uploads_des_serveurs}
|
|
|
|
mail.sendmail('disconnect@crans.org','disconnect@crans.org',corps)
|
|
|
|
###
|
|
# On remplace le CA par un script
|
|
###
|
|
|
|
# Pas propre.
|
|
|
|
for l in gros_uploads_des_serveurs.split('\n')[2:]:
|
|
l2 = l.split('|')
|
|
|
|
if float(l2[4].strip()[:-2]) > 200:
|
|
# question de Florian
|
|
message = """From: Florian Dumas <fdumas@crans.org>
|
|
To: disconnect@crans.org
|
|
Subject: Re: Statistiques des dernières 24h
|
|
Message-Id: <%(uuid)s2@crans.org>
|
|
References: <%(uuid)s1@crans.org>
|
|
In-Reply-To: <%(uuid)s1@crans.org>
|
|
|
|
Disconnect nous disait :
|
|
> |machine crans| machine ext | download | upload |
|
|
> |-------------+------------------------------------------+----------+----------|
|
|
> %(corps)s
|
|
|
|
C'est normal ?
|
|
--
|
|
Florian
|
|
""" % { 'corps': l, 'uuid': uuid }
|
|
#mail.sendmail('disconnect@crans.org','disconnect@crans.org',message)
|
|
|
|
# réponse de Vincent
|
|
ip_crans = socket.gethostbyname(l2[1].strip()+'.crans.org')
|
|
ip_ext = socket.gethostbyname(l2[2].strip())
|
|
raison = stats (ip_crans=[ip_crans], ip_ext=[ip_ext], show=['ip_ext','port_crans','port_ext'], upload_mini=10, show_limit=10).encode('iso8859-15')
|
|
|
|
message = """From: Vincent Bernat <bernat@crans.org>
|
|
To: disconnect@crans.org
|
|
Subject: Re: Re: Statistiques des dernières 24h
|
|
Message-Id: <%(uuid)s3@crans.org>
|
|
References: <%(uuid)s1@crans.org> <%(uuid)s2@crans.org>
|
|
In-Reply-To: <%(uuid)s2@crans.org>
|
|
|
|
Florian Dumas nous disait:
|
|
> Disconnect nous disait :
|
|
> > |machine crans| machine ext | download | upload |
|
|
> > |-------------+------------------------------------------+----------+----------|
|
|
> > %(corps)s
|
|
>
|
|
> C'est normal ?
|
|
|
|
A toi de voir...
|
|
|
|
%(raison)s
|
|
|
|
--
|
|
Vince
|
|
""" % {'corps': l, 'raison': raison, 'uuid': uuid}
|
|
|
|
#mail.sendmail('disconnect@crans.org','disconnect@crans.org',message)
|