Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Invité de passage
    Inscrit en
    mars 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 3
    Points : 0
    Points
    0

    Par défaut Analyser un fichier log

    slt tout le monde, je veux faites un script en PERL qui demande le nom d’un fichier de log du programme tcpd à traiter. Le format de ce log est une entrée par ligne, dans ce format :

    Mar 17 01:21:35 beta.CRM.Montreal.CA in.ftpd[13331]: connect from 63.196.54.11
    Mar 17 01:21:35 theta.CRM.Montreal.CA in.ftpd[27801]: connect from 63.196.54.11
    Mar 17 01:21:35 truffaut.CRM.Montreal.CA in.ftpd[18652]: connect from 63.196.54.11

    le programme doit lire le fichier de log et analyser chaque ligne pour trouver des balayages
    (“scans”) potentiels, en supposant que plus de 5 demandes provenant de la même adresse dans la même minute est un balayage potentiel. Quand votre programme trouve un balayage potentiel, il envoie immédiatement un courrier électronique à une
    adresse courriel, avec comme information l’heure et l’adresse du balayage. Pour
    envoyer le courrier électronique, on doit faire un appel à sendmail .
    le programme devra à la fin donner les statistiques suivantes :
    a) L’adresse source qu’on retrouve le plus souvent dans le fichier analysé
    b)
    1) le nombre total de connexions acceptées
    2) le nombre total de connexions refusées
    3) le nombre de demandes de connexions (acceptées et refusées) pour chacun des démons suivants : ftpd telnetd rpcbind imap pop

    merci bcp pour votre aide

  2. #2
    Expert Confirmé

    Inscrit en
    avril 2009
    Messages
    2 849
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : avril 2009
    Messages : 2 849
    Points : 3 350
    Points
    3 350

    Par défaut

    Pour détecter les scans, une méthode parmi d'autres est de remplir une table de hashage avec pour clé, la concaténation de l'adresse IP et de la date (séparé par exemple, par un /), et pour valeur, un compteur qu'on incrémente. Un scan est alors détecter pour toutes les clés de ce hash pour lesquels la valeur correspondante est supérieure à 5.

    Une idée d'implémentation :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    open ...
    my %scan;
    while(my $line = <$LOG>) {
      my ($date, $ip) = extract_date_ip($line);
      $scan{"$ip/$date"}++;
      ...
    }
    ...
    foreach my $scan (grep $scan{$_} > 5, keys %scan) {
      send_a_mail($scan);
    }
    ...
    Pour le reste, c'est du simple comptage, dont de toute manière, nous ne connaissons pas tous les éléments du log pour répondre.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Using strict and warnings is good for you.

  3. #3
    Invité de passage
    Inscrit en
    mars 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 3
    Points : 0
    Points
    0

    Par défaut perl

    Merci pour ta reponse
    le log est un fichier de log du programme tcpd à traiter. Le format de ce log est une entrée par ligne, dans ce format :
    Mois heure adresse-visée service: état from adresse-source commentaire-optionnel
    Mois est dans format Mmm
    Heure est toujours dans format HH:MM:SS (format 24 heures)
    État peut être connect ou refused connect
    Service est une suite de caractès sans espace, lettre+chiffres+caractères-spéciaux
    Par exemple voici des entrées du fichier :
    Mar 15 00:24:45 zeta.CRM.UMontreal.CA in.ftpd[28209]: connect from omega.CRM.UMontreal.CA
    Mar 15 00:26:11 poincare.CRM.UMontreal.CA rpcbind: refused connect from 64.26.80.177 to dump()
    Mar 17 01:21:35 beta.CRM.UMontreal.CA in.ftpd[13331]: connect from 63.196.54.11
    Mar 17 01:21:35 theta.CRM.UMontreal.CA in.ftpd[27801]: connect from 63.196.54.11
    Mar 17 01:21:35 truffaut.CRM.UMontreal.CA in.ftpd[18652]: connect from 63.196.54.11
    Mar 17 12:52:17 omega.CRM.UMontreal.CA in.ftpd[15959]: connect from HSE-Montreal-ppp127.qc.sympatico.ca
    Mar 17 12:19:47 omega.CRM.UMontreal.CA in.telnetd[19531]: connect from fitzpbe.math.auburn.edu

    merci beaucoup pour votre aide

  4. #4
    Expert Confirmé

    Inscrit en
    avril 2009
    Messages
    2 849
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : avril 2009
    Messages : 2 849
    Points : 3 350
    Points
    3 350

    Par défaut

    Avec mes premières indications, tu devrais pouvoir progresser dans l'écriture de ton script. As-tu un début de script à fournir ? Des questions plus précises sur ce que tu ne sais pas faire ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Using strict and warnings is good for you.

  5. #5
    Invité de passage
    Inscrit en
    mars 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : mars 2009
    Messages : 3
    Points : 0
    Points
    0

    Par défaut

    Merci de votre réponse, j ai ecrit ce script pour compter les connexions acceptées et les connexions refusées dans un fichier log , mais il ne fonctione pas. Aidez moi SVP :

    Code :
    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
    #!/usr/bin/perl
    #
    # 
    #
    use strict;
    use warnings;
     
    #print ("nom de fichier:"); 
    #my $rep=<STDIN>; 
    #chomp $rep;
    #ouvrir fichier en lecture
    open Fich,'< log.txt' or die "Le fichier n'existe pas !";
     
    while (my $ligne = <Fich>) {
     
        # découpe une ligne en champs
        my @mots=split / /, $ligne;
        my $co = 'connect';
        my $re = 'refused';
        my $j = 0;
        my $k =0;
        for (my $i=0;$i<=$#mots;$i++){
           if (grep(/^$re$/, @mots)) {
               $j++;
           }elsif (grep(/^$co$/, @mots)){
               $k++;
           }
     
        }       
          print ($j);
          print ($k);
    }
    close Fich;

  6. #6
    Expert Confirmé

    Inscrit en
    avril 2009
    Messages
    2 849
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : avril 2009
    Messages : 2 849
    Points : 3 350
    Points
    3 350

    Par défaut

    Merci de mettre les balises autour du code (icône ).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Using strict and warnings is good for you.

  7. #7
    Nouveau Membre du Club
    Inscrit en
    décembre 2011
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : décembre 2011
    Messages : 26
    Points : 39
    Points
    39

    Par défaut

    Salut,

    plutôt que de faire un split sur tous les champ de ta ligne essaye plutôt ça :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    while (my $ligne = <Fich>) {
     
    # découpe une ligne en champs
     
    my $j = 0;
    my $k =0;
     
    if ($ligne =~ m/connect/){
    $j++;
    }elsif ($ligne =~ m/refused/){
    $k++;
    }
     
     
    print ($j);
    print ($k);
    }
    dis moi ce que tu obtiens avec ça.


    /Rémi

  8. #8
    Expert Confirmé

    Inscrit en
    avril 2009
    Messages
    2 849
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : avril 2009
    Messages : 2 849
    Points : 3 350
    Points
    3 350

    Par défaut

    Attention peps16, il faut initialiser $j et $k en dehors de la boucle
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Using strict and warnings is good for you.

  9. #9
    Nouveau Membre du Club
    Inscrit en
    décembre 2011
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : décembre 2011
    Messages : 26
    Points : 39
    Points
    39

    Par défaut

    Citation Envoyé par Philou67430 Voir le message
    Attention peps16, il faut initialiser $j et $k en dehors de la boucle
    voila pourquoi ça ne marche pas...j'avais pas vu avec l'éditeur

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •