#! /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 utilisant des protocoles P2P : ######################################### requete = "SELECT ip_crans,protocole FROM avertis_p2p WHERE date>timestamp 'now' - interval '1 day'" curseur.execute(requete) liste_p2p = [] for IP, protocole in curseur.fetchall(): hostname = socket.gethostbyaddr(IP)[0] requete = "SELECT COUNT(ip_src) from p2p where date > timestamp 'now' - interval '1 day' and ip_src='%s'"%IP curseur.execute(requete) paquets=curseur.fetchone()[0] liste_p2p.append([protocole,hostname,str(paquets)]) liste_p2p = tableau_ng( data = liste_p2p, titre = ['protocole','machine','nombre'], largeur = [12, 30, 8], alignement = ['g','c','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 utilisant des protocoles P2P* (Nb de paquets par 24 heures) /Le seuil actuel est de %(seuil)d paquets par 24 heures./ %(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':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, 'seuil':config.p2p.tag} 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 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 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)