Scripts Logwatch

Scripts Logwatch - Perl - Programmation

Marsh Posté le 15-05-2006 à 11:55:16    

bonjour,  
 
J'éssaie de configurer l'outil logwatch afin de recevoir un mail journalier relativement sinthetique.
Je récupere des logs des logs windows (dans le repoertoire /var/log de mon serveur Linux) grace à Syslog installé sur un serveur NT.
 
Voici le début du script d'un services logwatch :
 
$adminlog = 0;
while (defined ($ThisLine = <STDIN> ))  
  {
if ( $ThisLine =~ m/ security.*success.*Utilisateur : administrateur/ )
 {
 $adminlog++;
 }
  }
exit(0);
 
# Petit script qui me permet de déterminer en parsant mon fichier Log, le nombre de connexion en Administrateur qui ont était effectué)
 
 
Maintenant je voudrais apporter une amélioration pour pouvoir obtenir l'IP ainsi que le nombre de connexion de chaque IP.
Dans les Logs l'ip apparait de cette forme : "adresse reseau source : 192.xxx.xxx.xxx"
 
Moi ce que je voudrais  c"est qu'a chaque fois qu'il rencontre la chaine de caractere "adresse reseau source :" il me retourne "192.XXX.XXX.XXX"
 
 
J'ai éssayé de me chercher (expression reguliere) mais je ne voit pas trop comment faire !  
 
Merci

Reply

Marsh Posté le 15-05-2006 à 11:55:16   

Reply

Marsh Posté le 15-05-2006 à 12:10:12    

C'est pas super dur ;)
t'as regex elle doit matcher:

  • 192 suivi d'un point : "192\."
  • entre un et trois chiffres suivi d'un point "\d{1,3}\."
  • entre un et trois chiffres suivi d'un point "\d{1,3}\."
  • entre un et trois chiffres "\d{1,3}\"

Du coup ça donne

/adresse reseau source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/


Et pour le comptage, je ferais une petite hash avec comme clé l'ip trouvée:

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use Data::Dumper;
  4. my %ips;
  5. open(F, '<tonfichier.txt');
  6. while(<F> ){
  7.   /adresse reseau source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
  8.   $ips{$1}++;
  9. }
  10. close(F);
  11. print Dumper %ips;


 
edit:
En fait il serait plus logique de considérer ta regex comme ça:

  • 192  
  • et point et entre un et trois chiffres suivi d'un point "\.\d{1,3}"
  • et point et entre un et trois chiffres suivi d'un point "\.\d{1,3}"
  • et point et entre un et trois chiffres suivi d'un point "\.\d{1,3}"

ce qui fait que tu pourrais la raccourcir mais bon


Message édité par anapajari le 15-05-2006 à 12:19:29
Reply

Marsh Posté le 15-05-2006 à 12:21:02    

Merci pour la réactivité ! ça fait plaisir  
 
Je vais tester ta solution
 
Merci bcp

Reply

Marsh Posté le 15-05-2006 à 14:35:42    

jpense que je dois mal mi prendre mais ça marche pas :/

Reply

Marsh Posté le 15-05-2006 à 14:42:22    

while (defined ($ThisLine=<STDIN> )) {
 
use strict;
use Data::Dumper;
 
my %ips;
open (F, 'messages.txt');
while (<F> ) { /adresse r esau source : (192.168.d{1,3}.d{1,3})/; {
$ips {$1}++;
             }
close (F);
print Dumper %ips;
             }
exit(0);

Reply

Marsh Posté le 15-05-2006 à 15:02:24    

le bout de code que je t'ai donné c'etait "tout le code" à mettre dans un script perl... [:mlc]
et tu feras attention à bien recopier la regex, il manque les \

Reply

Marsh Posté le 15-05-2006 à 15:14:12    

Voici mon Script complet :
 
#!/usr/bin/perl
 
use strict;
use Data::Dumper;
 
my %ips;
open (F, 'messages.txt');
while (<F> ) {  
     /source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
$ips {$1}++;
             }
close (F);
print Dumper %ips;

Reply

Marsh Posté le 15-05-2006 à 15:27:07    

et y'a encore un pb?

Reply

Marsh Posté le 15-05-2006 à 15:30:18    

oui car lorsque j'éxecute Logwatch je ne reçois rien pr mon Scripts "winlog"

Reply

Marsh Posté le 15-05-2006 à 15:32:28    

déjà ça compile :o
Tu es sur que la pattern qui récupère la ligne est correcte? Tu peux montrer une ligne ou deux de ton fichier de log stp!

Reply

Marsh Posté le 15-05-2006 à 15:32:28   

Reply

Marsh Posté le 15-05-2006 à 15:41:34    

euuhh c quoi la pattern ? le fichier .conf c ça ?
 
Voici un exemple de Log que je reçois dans /var/log/messages  :
 
May 15 15:21:04 srv-nt10.XXX.XX security[success] 528 XXX\administrateur  Ouverture de session réseau réussie :    Utilisatr : administrateur    Domaine : XXX    Id. de la session : (0x0,0x24A09FAA)    Type de session : 10    Processus de session : User32      Package d'authentification : Negotiate    Station de travail : SRV-NT10    GUID d'ouv. de session : {a675ddcb-7e7e-fcfa-9bf0-3ec68c8c1627}    Nom de l'utilisateur appelant : SRV-NT10$    Domaine appelant : XXX    Id. de session de l'aplant : (0x0,0x3E7)    ID de processus appelant : 13852    Services en transit : -   Adresse réseau source : 192.168.XX.XXX Port source : 34717


Message édité par edek le 15-05-2006 à 15:42:09
Reply

Marsh Posté le 15-05-2006 à 15:47:33    

marche très bien :o
Avec le code plus haut et le fichier texte suivant:

Adresse réseau source : 192.168.12.14 Port source : 34717
Adresse réseau source : 192.168.12.14 Port source : 34717
Adresse réseau source : 192.168.12.14 Port source : 34717
Adresse réseau source : 192.168.12.16 Port source : 34717
Adresse réseau source : 192.168.12.14 Port source : 34717


 
ça printe:
[code]$VAR1 = '192.168.12.14';
$VAR2 = 4;
$VAR3 = '192.168.12.16';
$VAR4 = 1;/[code]
 
Edit: t'es sur qu'il compile ton script au fait? Tu as installé le module Data::Dumper?


Message édité par anapajari le 15-05-2006 à 15:49:27
Reply

Marsh Posté le 15-05-2006 à 16:12:02    

oui oui il compile c bon ça a l'air de marcher
nonj'ai pas installé Data::Dumper

Reply

Marsh Posté le 15-05-2006 à 16:15:47    

vire les lignes:

Code :
  1. use Data::Dumper;


et à la place de

Code :
  1. print Dumper %ips;


mets

Code :
  1. foreach (sort keys %ips){
  2.   print "IP: $_ NB OCCURENCEs: $ips{$_}\n";
  3. }

Reply

Marsh Posté le 15-05-2006 à 16:27:43    

C'est fait , oui effectivement c'est mieux comme ça ;)

Reply

Marsh Posté le 16-05-2006 à 11:16:51    

En faite mon but est de comptabiliser toutes les Authentification en Admin sur chaque serveur NT pour chaque jour.
et dans un 2eme temps de les lister par adresses IP.
 
Voici un exemple de Log :
 
May 15 15:21:04 srv-nt10.XXX.XX security[success] 528 XXX\administrateur  Ouverture de session réseau réussie :    Utilisatr : administrateur    Domaine : XXX    Id. de la session : (0x0,0x24A09FAA)    Type de session : 10    Processus de session : User32      Package d'authentification : Negotiate    Station de travail : SRV-NT10    GUID d'ouv. de session : {a675ddcb-7e7e-fcfa-9bf0-3ec68c8c1627}    Nom de l'utilisateur appelant : SRV-NT10$    Domaine appelant : XXX    Id. de session de l'aplant : (0x0,0x3E7)    ID de processus appelant : 13852    Services en transit : -   Adresse réseau source : 192.168.XX.XXX Port source : 34717
 
Voici mes 2 lignes de matching :  
_if ( $ThisLine =~ m/ security.*success.*Utilisateur : administrateur/ )
 {
 $adminlog++; }
 
_while (<F> ) {  
     /security.*success.*Utilisateur : administrateur.*SRV-NT10.*source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
$ips {$1}++;  
 
 
Je pense que c'est ligne n'éffectue pas le bon matching car les rapport que je reçois sont corompue (information inéxacte, information démesurée)

Reply

Marsh Posté le 16-05-2006 à 11:33:57    

rien compris :o
 
Montre nous le resultat que tu souhaiterais obtenir et ou se trouve chaque  donnée sur la ligne de log...

Reply

Marsh Posté le 16-05-2006 à 11:44:29    

anapajari a écrit :

rien compris :o
 
Montre nous le resultat que tu souhaiterais obtenir et ou se trouve chaque  donnée sur la ligne de log...


 
Voici un exemple de Log :
 
May 15 15:21:04 srv-nt10.XXX.XX security[success] 528 XXX\administrateur  Ouverture de session réseau réussie :    Utilisateur : administrateur    Domaine : XXX    Id. de la session : (0x0,0x24A09FAA)    Type de session : 10    Processus de session : User32      Package d'authentification : Negotiate    Station de travail : SRV-NT10    GUID d'ouv. de session : {a675ddcb-7e7e-fcfa-9bf0-3ec68c8c1627}    Nom de l'utilisateur appelant : SRV-NT10$    Domaine appelant : XXX    Id. de session de l'aplant : (0x0,0x3E7)    ID de processus appelant : 13852    Services en transit : -   Adresse réseau source : 192.168.XX.XXX Port source : 34717  
 
Voila je voudrais que les mots en vert soit matché

Reply

Marsh Posté le 16-05-2006 à 11:49:23    

D'accord MAIS QUE CE QUE TU VEUX COMME RESULTAT???
savoir combien il y a de ligne avec SVR-NT10 ou savoir combien de fois il y a l'ip 192.168.1.2 ou ...

Reply

Marsh Posté le 16-05-2006 à 11:55:33    

éhéhéh ! désolé j'avais pas bien compris :/
Je voudrais savoir dans un 1er temps savoir combien de ligne possede les 3 premier parametre en VERT.
Et dans un 2nd temps je voudrais lister Chaque IP (avec le nombre de connexions) répondant aux 1eres conditions.

Reply

Marsh Posté le 16-05-2006 à 12:10:26    

Code :
  1. -MiniBufExplorer-
  2. #!/usr/bin/perl
  3. use strict;
  4. use Data::Dumper;
  5. my %res;
  6. open (F, 'messages.txt');
  7. while (<F> ) {
  8.   /security\[success\].*Utilisateur : administrateur.*Station de travail : ([^ ]+?) .*source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/;
  9.   if ( !defined $res{$1}){
  10.     $res{$1} = {};
  11.   }
  12.   $res{$1}{$2}++;
  13.   $res{$1}{'TOTAL'}++;
  14. }
  15. close (F);
  16. foreach my $srv (sort keys %res){
  17.   print "SERVEUR $srv NB CONNECTIONS TOTAL:".$res{$srv}{'TOTAL'}."\n";
  18.   foreach my $ip(sort keys %{$res{$srv}}){
  19.     next if $ip eq 'TOTAL';
  20.     print "POUR IP: $ip ->".$res{$srv}{$ip}." CONNECTIONS\n";
  21.   }
  22. }


Et pose les questions sur ce que tu comprends pas.
Attention la regex exacte est

 /security\[success\].*Utilisateur : administrateur.*Station de travail : ([^ ]+?) .*source : (192\.\d{1,3}\.\d{1,3}\.\d{1,3})/

Reply

Marsh Posté le 16-05-2006 à 14:47:06    

Le code ne compile pas...
 
Je ne comprends pas ces termes :  
 -     ([^ ]+?)
 
 -  #$res{$1} = {};
     }
      $res{$1}{$2}++;
      $res{$1}{'TOTAL'}++;

Reply

Marsh Posté le 16-05-2006 à 15:23:31    

vire la 1ere ligne:

Code :
  1. -MiniBufExplorer-


c'est un copier coller depuis vim qui l'a sorti et qui doit tout faire merder.
Vire également le use Data::Dumper;
Après chez moi ça marche ;) si c'est toujours pas le cas chez toi merci de donner l'erreur assorti
 

Code :
  1. ([^ ]+?)


C'est un bout de regex qui veut dire: Tout ce qui n'est pas un espace repeté au moins un fois
 

Code :
  1. if ( !defined $res{$1}){
  2.    $res{$1} = {};
  3. }
  4. $res{$1}{$2}++;
  5. $res{$1}{'TOTAL'}++;


$1 correspond au morceau matché par la 1ere parenthèse de la regex au dessus, dans ce cas le serveur
Dans ma hash resultat (%res), je regarde si il existe une clé correspondant au serveur trouvé.
Si c'est pas le cas, j'initialise la valeur de la hash res pour cette clé avec une hash anonyme.
Ensuite dans cette hash anonyme j'augmente le nombre de fois ou $2 ( qui correspond à l'ip) a été trouvé
et pareil pour total

Reply

Marsh Posté le 16-05-2006 à 15:37:11    

Voici mon erreur :
 
Scalar found where operator expected at windows_security line 14, near ""SERVEUR $srv Nombre de connexion(s) total :" $res"
        (Missing operator before  $res?)
Global symbol "$res" requires explicit package name at windows_security line 6.
syntax error at windows_security line 14, near ""SERVEUR $srv Nombre de connexion(s) total :" $res"
syntax error at windows_security line 14, near "}."
Missing right curly or square bracket at windows_security line 48, at end of line
Execution of windows_security aborted due to compilation errors.

Reply

Marsh Posté le 16-05-2006 à 15:45:33    

donc tu as modifié mon code  ;)
Dans ces cas là reposte le qu'on soit sur de parler de la même chose.
 
Néanmoins je pense que tu as oublié un point là:

Citation :

Nombre de connexion(s) total :".$res

Reply

Marsh Posté le 16-05-2006 à 15:59:02    

j'ai repris ton code initial eet c bon il compile bien parcontre lors de l'execution de Logwatch, rien n'est matché pour le service.

Reply

Marsh Posté le 15-06-2006 à 15:11:41    

Quelqu'un pourrait il me renseigner ?!
 
Voila commande suivante :
(srv-nt\d{1,2}|srv010-nt\d{1,2}).*\[error\].*(\d{1,5})
ne match pas le texte suivant :
srv010-nt13.rld.fr ntds kcc[error] 1311 AUTORITE......
 
Voila merci !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed