1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #!/usr/bin/perl -w
use Time::Local;
#Tableau de date
my %Tdate=("Jan"=>0,"Feb"=>1,"Mar"=>2,"Apr"=>3,"May"=>4,"Jun"=>5, "Jul"=>6,"Aug"=>7,"Sep"=>8,"Oct"=>9,"Nov"=>10,"Dec"=>11);
############################ DECLARATION DES VARIABLES ###########################
$compt_ligne_second=0; #déclaration variable Cmpt ligne second
$num_ligne=0;#déclaration variable num_ligne
@liste_ip_bloquee=(); #déclaration tableau vide (@)
$date_new=0; ##déclaration date new
$date_old=0; #déclaration date old
$seuil_log_alert=200; #déclaration d'un Seuil d'alerte du log à partir de 200 lignes
$seuil_log_defense=200; #déclaration d'une reaction du log à partir de 200 lignes
$resultat=""; #déclaration variable scalaire et affectation à vide
@interdit_jours=(0,6); #jours où il ne doit pas y avoir de l'activité
@interdit_heures=(21,22,23,0,1,2,3,4,5,6); # heures où il ne doit pas y avoir de l'activité
############################ DECLARATION DES FONCTIONS ############################
sub DateLogToTimestamp{ #FONCTION qui recupere la date et l'affiche
my ($Sdate)=@_; # crée une variable de type tableau
my $M=substr($Sdate,0,3);
my $D=substr($Sdate,4,2);
my $h=substr($Sdate,7,2);
my $m=substr($Sdate,10,2);
my $s=substr($Sdate,13,2);
$date_new=timelocal($s,$m,$h,$D,$Tdate{$M},2012); #formate la date sous la forme seconde/minutes/Heures/...
}
sub VerifOrderDate{ #verifie que la date new est plus recente que la date old
if($date_new<$date_old){# si date_new inférieur à date_old, on affiche : erreur
$resultat.="\n!!erreur chronologie date ligne ".$num_ligne;
}
}
sub BloquerSrcAttaque{ #Blocage d'une attaque
if($ligne=~ /SRC=(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/){ #Recherche de l'adresse IP SRC
my $ip=$1.".".$2.".".$3.".".$4; #Recuperer les blocs de adresse
if(!grep {$ip} @liste_ip_bloquee)#Verifie si l'IP a deja ete bloque
{
unshift(@liste_ip_bloquee,$ip);
$resultat.= "\nIP DROPEE:".$ip;
system "iptables -A INPUT -s ".$ip." -j DROP"; #Ajout d'une ligne au parefeu
}
}
}
#compte le nombre log par second et suivant 1 seuil, alerte d'un problème et d'un autre, bloque l'adresse IP SRC
sub VerifierMoyenneLog{
if($date_new==$date_old){
$compt_ligne_second++;#on incrémente le compteur de lignes
}else{
$compt_ligne_second=0;
}
if($compt_ligne_second>$seuil_log_alert){
$resultat.="!!genration de log important ".$compt_ligne_second." la second a: ".$num_ligne."\n";
if($compt_ligne_second>$seuil_log_defense){
BloquerSrcAttaque(); #on appelle la fonction de blocage d'attaque.
}
}
}
#alerte en cas de connexion à des heures interdites
sub VerifierPlageConnexion{
my ($s,$m,$h,$j,$M,$A,$j_se,$j_an,$h_hiver)=localtime($date_new); #Verification des jours de connexion
if(grep {$j_se} @interdit_jours){
$resultat.="\nconnexion jour interdit ligne: ".$num_ligne;
}
if(grep {$h} @interdit_heures){#Verification des heures de connexion
$resultat.="\nconnexion heure ligne: ".$num_ligne;
}
}
#########################################- Début du script principal -########################################
#ouverture du fichier de log
open(file_log,"/var/log/syslog") or die ("impossible d'ouvrir le fichier");
#parcour du fichier
while(defined($ligne=<file_log>)){
$num_ligne++;
#supprimer le retour à la ligne en fin de ligne
chomp $ligne;
DateLogToTimestamp($ligne);#recuperation de la date en timestamp
my @mots=split(/ /,$ligne);#decoupage de ligne
VerifOrderDate($ligne);#Verifie que le evenement sont bien dans l'ordre chonologique
VerifierMoyenneLog();#alerte si le nombre de log genere ne depasse pas une limite
VerifierPlageConnexion();#repère les connexion hors plage horaire/journalière
$date_old=$date_new;#à la fin de la ligne, affecte à $date_old la valeur de $date_new
}
#########################################- Affichage du résultat -#########################################
print $resultat; |
Partager