Rappatrier des infos grace a SNMP et les lister

Forum sur la sécurité des réseaux, la configuration des firewalls, la mise en place de protections contre les attaques, de DMZ, de systèmes anti-intrusion ...

Modérateur: modos Ixus

Rappatrier des infos grace a SNMP et les lister

Messagepar Kiko84 » 12 Mai 2004 11:20

slt

je voudrais rappatrier des infos(Liste des services, des processus, des softwares...)sur des serveurs divers grace a des requetes SNMP. J'utilise actuellement SNMP mais le probleme c qu'il ne genere que des graphes. C'est bien pour mesurer le traffic... mais je ne peux pas afficher des listes d'informations (sans graphes!), et les afficher sous forme de page Web comme pour les graphes.

Je voudrais par exemple:

Liste des processus:
- ...
-++++
- ---

Liste des softwares
- ***
- ////


...

Merci
Kiko84
Second Maître
Second Maître
 
Messages: 31
Inscrit le: 29 Avr 2004 16:06

Messagepar bobyII » 12 Mai 2004 11:38

Salut,

j'ai déja fait ca avec PERL et la librairie qui va bien (net::snmp).
(Et sous windows, avec vbs et WMI)

En fait, tu peux faire une page en PERL/CGI qui collecte les infos a la demande. Le plus souX, c'est de trouver la bonne information. Utilise un explorateur SNMP qui te permet de voir ou est ton info.


__________________________________________________________________

- "Explorateur" SNMP sous windows : snmputlg.exe et getif (il doit y en avoir une tétrachié sous linux)

- je te balance un script que j'ai fait y a pas mal de temps ... je ne sais pas si ca va te servir.

#!c:\perl\bin\perl.exe
#################################################
# #
# Recupération des taux d'occupation disk #
# VIA SNMP #
# #
#################################################



#################################
# Récupération des params #
# externes #
#################################
# determine le nom des serveurs #
open(NOMS,"../ServeursExchange.lst");
while(<NOMS>){
chomp($_);
$NomCourt=(split(/:/,$_))[0];
$Domaine=(split(/;/,$_))[2];
push(@NomsServeurs,$NomCourt);
$NomsReseauxServeurs{$NomCourt}="$NomCourt\.$Domaine";
}
close(NOMS);







#################################
# Initialisation #
#################################
use Net::SNMP qw(oid_lex_sort DEBUG_ALL);

$FicResult="../alertes/UsageDisk.txt";

#$BaseOIDDisk.NumArg.NumDisk
#NumArg = (3=Nom avec label et serial , 4=TailleBlock, 5=EspaceTotal, 6=EspaceUtilisé)
$BaseOIDDisk=".1.3.6.1.2.1.25.2.3.1";
@Disk=("C","D");
$MaxLoop=50;








#################################
# Récupération des données #
#################################
foreach $Host (@NomsServeurs){
%ResultatWalk=SnmpWalk($Host,"$BaseOIDDisk\.3");
foreach (sort keys %ResultatWalk){
$Nom = (split(/:/,$ResultatWalk{$_}))[0];
foreach $Disk (@Disk){
if($Disk eq $Nom){
$CurrentNumDisk=(split(/\./,$_))[-1];
#
$TailleBlock=SnmpGet($Host,"$BaseOIDDisk\.4\.$CurrentNumDisk");
if($TailleBlock == 0){next;}
$EspaceTotal=SnmpGet($Host,"$BaseOIDDisk\.5\.$CurrentNumDisk");
$EspaceUsed=SnmpGet($Host,"$BaseOIDDisk\.6\.$CurrentNumDisk");
#
$Occupation = int(($EspaceUsed*100) / $EspaceTotal) +1;
$$Host{$Nom}=$Occupation;
}
}
}
}






#################################
# Inscription dans FicResult #
#################################
open(RESULT,">$FicResult");
foreach $Host (@NomsServeurs){
$CurrentLigne="";
foreach (keys %$Host){
$CurrentLigne=$CurrentLigne."$_=$$Host{$_};";
}
print RESULT "$Host:$CurrentLigne\n";
}
close(RESULT);








#################################
# Fonctions #
#################################
#variables dans @_
#Usage : SnmpGet($Host,$Oid);
#uniquement pour une communitée public
sub SnmpGet{
my $Host=$NomsReseauxServeurs{$_[0]};
my $Oid=$_[1];
push(@Oid,$Oid);
#Overture de session
$Session=Net::SNMP->session( -hostname => $Host );
#Recupération de la donnée (GET)
$Session->get_request( -varbindlist => \@Oid);
#Récupération du résultat
my $Result = $Session->var_bind_list()->{$Oid};
#Fermeture session
$Session->close();
#
return $Result;
}
#
sub SnmpWalk{
my $Host=$_[0];;
my $Oid=$_[1];
$OldOid=$Oid;
#Overture de session
$Session=Net::SNMP->session( -hostname => $Host );
#Recupération des données
while($Oid ne ""){
@Oid=($Oid);
$Session->get_next_request( -varbindlist => \@Oid);
foreach (keys(%{$Session->var_bind_list()})) {
$Resultat = $Session->var_bind_list()->{$_};
if($CurrentLoop <= $MaxLoop and /$OldOid/){
$Oid=$_;
$Resultat{$_}=$Resultat;
}
else{$Oid="";}
}
}
#Fermeture session
$Session->close();
#
return %Resultat;
}
#
sub SnmpGetNext{
my $Host=$_[0];;
my $Oid=$_[1];
@Oid=($Oid);
#Overture de session
$Session=Net::SNMP->session( -hostname => $Host );
#Recupération de la donnée (GET)
$Session->get_next_request( -varbindlist => \@Oid);
#Récupération du résultat
foreach (keys(%{$Session->var_bind_list()})) {
$Resultat = $Session->var_bind_list()->{$_};
}
#Fermeture session
$Session->close();
#
return $Resultat;
}
#
___________________________________________________________________
Avatar de l’utilisateur
bobyII
Enseigne de vaisseau
Enseigne de vaisseau
 
Messages: 159
Inscrit le: 09 Juil 2003 00:00
Localisation: nantes

Messagepar GuiltyX » 12 Mai 2004 11:55

si t'a des graphes c'est que tu fais du monitoring.

Tu peux utilisé des applis tel que netsaint, openview, nagios. C'est assez complet et tu peux modifié a souhait.

Sinon utilise Netsnmp, manager sous linux tres efficace puis tu fais comme boby des scripts en perl, le sien est pas mal. il suffit de rajouter les mibs qui t'interesse avec un browser.

Pour info, n'oublie pas d'activé snmp sur les clients (serveur, routeur, switch etc...)
Avatar de l’utilisateur
GuiltyX
Premier-Maître
Premier-Maître
 
Messages: 54
Inscrit le: 27 Mai 2003 00:00

Messagepar bobyII » 12 Mai 2004 12:08

C'est vrai que nagios (anciennement netsaint) est vraiment bien et complet comme outils de surveillance.
Avatar de l’utilisateur
bobyII
Enseigne de vaisseau
Enseigne de vaisseau
 
Messages: 159
Inscrit le: 09 Juil 2003 00:00
Localisation: nantes

Messagepar GuiltyX » 12 Mai 2004 13:41

vi c vrai c pas mal, mais je prefere quand meme le petit script avec les info souhaité, c moins lourd a gerer :)
Avatar de l’utilisateur
GuiltyX
Premier-Maître
Premier-Maître
 
Messages: 54
Inscrit le: 27 Mai 2003 00:00

Messagepar Kiko84 » 12 Mai 2004 14:55

Ok merci beaucoup!!!

En fait ton script, je le copie dans un fichier texte et je l'enregistre en .cgi ???

Mais je comprend pas tout dans ton script. Qu'est-ce que je dois changer dedans?
Je me permet de le reprendre et je met a droite ce que je pense qui doit etre changer.



@Disk=("C","D");
$MaxLoop=50;


#################################
# Récupération des données #
#################################
foreach $Host (@NomsServeurs){ ----------------------------- ici je met la liste de tous les adresses des serveurs concernes ?? si oui je les separe avec une virgule ???
%ResultatWalk=SnmpWalk($Host,"$BaseOIDDisk\.3"); -------------- Basede l'OID, c ok. HOST ?
foreach (sort keys %ResultatWalk){
$Nom = (split(/:/,$ResultatWalk{$_}))[0];
foreach $Disk (@Disk){
if($Disk eq $Nom){
$CurrentNumDisk=(split(/\./,$_))[-1];
#
$TailleBlock=SnmpGet($Host,"$BaseOIDDisk\.4\.$CurrentNumDisk");
if($TailleBlock == 0){next;}
$EspaceTotal=SnmpGet($Host,"$BaseOIDDisk\.5\.$CurrentNumDisk");--------- $CurrentNumDisk"); ??
$EspaceUsed=SnmpGet($Host,"$BaseOIDDisk\.6\.$CurrentNumDisk");
#
$Occupation = int(($EspaceUsed*100) / $EspaceTotal) +1;
$$Host{$Nom}=$Occupation;
}
}
}
}

......


Bon je vais pas tout reprendre. Je suis desole mais j'y connais rien en script.
En tout cas ca pourrait bien m'aider.


Qu'est-ce que signifie $ ?
Est-ce que tu pourrais m'expliquer un peu plus en detail STP

Merci beaucoup en tout cas
Kiko84
Second Maître
Second Maître
 
Messages: 31
Inscrit le: 29 Avr 2004 16:06

Messagepar Kiko84 » 12 Mai 2004 15:26

en fait, ma machine servant de manager SNMP est sous Windows et les serveurs interroges fonctionnent sous Linux et Windows.


Je sais pas si ca change qqc pour le script mais je tenais juste a preciser
Kiko84
Second Maître
Second Maître
 
Messages: 31
Inscrit le: 29 Avr 2004 16:06

Messagepar GuiltyX » 12 Mai 2004 15:40

non ca change rien, mais a ta place je mettrais plutot le manager sous linux
Avatar de l’utilisateur
GuiltyX
Premier-Maître
Premier-Maître
 
Messages: 54
Inscrit le: 27 Mai 2003 00:00

Messagepar Kiko84 » 12 Mai 2004 16:59

le probleme tu vois c ke ca fait 2 semaines que je taffe avec mrtg et j'ai deja fait une 15aine de fichiers de config. J'ai pas envie d'avoir ca pour rien.

Mais merci comme meme pour la proposition.

Je voudrais bien savoir comme meme comment exploiter le script au dessus. Merci
Kiko84
Second Maître
Second Maître
 
Messages: 31
Inscrit le: 29 Avr 2004 16:06

Messagepar bobyII » 12 Mai 2004 17:55

En fait, dans ce script, je récupère des infos SNMP et je les inscris dans un fichiers texte. Il n'y a pas la partie CGI.

Je dois partir la mais je t'enverrai un perl de base pour du CGI.

Par contre, il faut que tu installes la bibliothèque net::SNMP sur ton système (a moins qu'elle y soit déja).

Ensuite, il faut que ton serveur http sache utiliser les fichiers perl (regarde vers mod_perl).

Il faudrait que tu vois un peu ce que dit le script. il y a une petite intro au perl sur www.commentcamarche.com
Avatar de l’utilisateur
bobyII
Enseigne de vaisseau
Enseigne de vaisseau
 
Messages: 159
Inscrit le: 09 Juil 2003 00:00
Localisation: nantes

Messagepar bobyII » 17 Mai 2004 12:27

Avec un peu de retard, une trame d'un script PERL CGI (juste pour l'exemple):

#!c:\perl\bin\perl.exe
#################################
# Initialisation #
#################################
use CGI qw(param);

$Argument=param("Argument");
$Adresse=param("Adresse");
$User=$ENV{REMOTE_USER};


#################################
# TOP PAGE #
#################################
print <<Top;
<html>
<style>
a { color: #003399; font-family: Arial; font-size: 10 pt; text-decoration: none }
a:hover { color: #003399; font-family: Arial; font-size: 10 pt; text-decoration: underline }
</style>
<script language="JavaScript">
function ChangeFic1(){
FormName.Fic1.value = FormName2.fichier1.value;
}
</script>
Top

#################################
# Formulaire de Login #
#################################
print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"5\">\n";
print "<form name=\"FormLogin\" action=\"$NomPage\">";
print "<tr><td>Adresse du serveur : <\/td><td><input name=\"Adresse\" STYLE=\"width : 150px\;\">";
print "<\/form>";
print "<\/table>";

#################################
# Fin de page HTML #
#################################
print <<Fin;
</BODY>
</HTML>
Fin
#FIN
Avatar de l’utilisateur
bobyII
Enseigne de vaisseau
Enseigne de vaisseau
 
Messages: 159
Inscrit le: 09 Juil 2003 00:00
Localisation: nantes

Messagepar Kiko84 » 17 Mai 2004 14:26

ok je te remercie !!!

c pas grave pour le retard, t deja bien sympa de me l'avoir balancer!

@+
Kiko84
Second Maître
Second Maître
 
Messages: 31
Inscrit le: 29 Avr 2004 16:06

Messagepar Kiko84 » 17 Mai 2004 14:26

RESOLU
Kiko84
Second Maître
Second Maître
 
Messages: 31
Inscrit le: 29 Avr 2004 16:06

Messagepar bobyII » 19 Mai 2004 10:24

Cool ... fait plaisir que ca te fasse plaisir. :wink:
Avatar de l’utilisateur
bobyII
Enseigne de vaisseau
Enseigne de vaisseau
 
Messages: 159
Inscrit le: 09 Juil 2003 00:00
Localisation: nantes


Retour vers Sécurité et réseaux

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité

cron