WikiMiNET

La documentation technique et administrative

Outils pour utilisateurs

Outils du site


wiki:monitoring:elk:logstash

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
wiki:monitoring:elk:logstash [2015/11/15 02:22]
Thithib
wiki:monitoring:elk:logstash [2020/06/27 18:16] (Version actuelle)
Ligne 3: Ligne 3:
 ===== Pourquoi ? ===== ===== Pourquoi ? =====
  
-​[[http://logstash.net/ | Logstash]] est un puissant outil de gestion de logs permettant d'effectuer une mise en forme avancée de ceux-ci. En effet, étant donné la diversité des formats, il peut rapidement devenir difficile de chercher une information précise apparaissant sous différentes formes, dans différents services. Logstash permet de pallier à ce problème en définissant un tamis dans lequel sont filtrés les messages : il est alors possible de classifier l'information par la définition de champs.+​[[http://logstash.net/ | Logstash]] est un puissant outil de gestion de logs permettant d'effectuer une mise en forme avancée de ceux-ci. En effet, étant donné la diversité des formats, il peut rapidement devenir difficile de chercher une information précise apparaissant sous différentes formes, dans différents services. Logstash permet de pallier ce problème en définissant un tamis dans lequel sont filtrés les messages : il est alors possible de classifier l'information par la définition de champs.
 La sortie formatée est ensuite envoyée au cluster Elasticsearch afin d'être indexée. La sortie formatée est ensuite envoyée au cluster Elasticsearch afin d'être indexée.
  
Ligne 11: Ligne 11:
 ===== Comment ? ===== ===== Comment ? =====
  
-==== Architecture ====+==== Architecture syslog ====
  
 Pour chaque machine un serveur syslog (rsyslog ou syslog-ng) surveille les fichiers journaux. Pour chaque machine un serveur syslog (rsyslog ou syslog-ng) surveille les fichiers journaux.
-Chaque nouveau message est ainsi transféré vers le serveur Logstash (192.168.102.9), où il est analysé et formaté avant d'être transmis au cluster Elasticsearch. +Chaque nouveau message est ainsi transféré vers le serveur Logstash, où il est analysé et formaté avant d'être transmis au cluster Elasticsearch.  
 + 
 +==== Architecture snmp ==== 
 + 
 +Chaque WLC est configuré pour envoyer des traps SNMP sur logstash. Le niveau de verbosité de ces traps est configuré au niveau du WLC. Ces traps sont variés et contiennent une grande richesse d'informations sur l'utilisation du réseau Wifi. 
  
 ==== Configuration ==== ==== Configuration ====
Ligne 50: Ligne 55:
 A noter que les deux points ":" finaux sont indispensables pour respecter le format syslog, et que l'entrée StateFile? doit être unique. A noter que les deux points ":" finaux sont indispensables pour respecter le format syslog, et que l'entrée StateFile? doit être unique.
  
-Puis pour tout envoyer vers le container Logstash sur le port 5140 en TCP +Puis pour tout envoyer vers le container Logstash sur le port 514 en UDP 
  
 <code> <code>
-*.* @logstash:5140+*.* @logstash.priv.minet.net:514
 </code> </code>
- 
-<WRAP center round info > 
-On utilisait avant le port standard 514 mais le service logstash drop maintenant les privilèges et ne peut donc plus s'y binder. 
-</WRAP> 
  
 === logstash === === logstash ===
  
-Le fichier de configuration de Logstash est situé sur le container logstash (192.168.102.9) à l'emplacement **/opt/logstash/logstash.conf**.+Les fichiers de configuration de Logstash sont situés sur la machine logstashvm à l'emplacement **/etc/logstash/conf.d/**.
  
-Il est composé de trois sections :+Les différents fichiers décrivent les étapes de récupération des logs.
  
-  * La section ''input'' définit les entrées. Ici on écoute sur le port 5140 en TCP et en UDP : +On note principalement trois sections :  
 + 
 +  * La section ''10-input.conf'' définit les entrées. Ici on écoute sur le port 514 en UDP : 
  
 <code> <code>
-  tcp { 
-    type => syslog 
-    port => 5140 
-  } 
   udp {   udp {
-    type => syslog +    type => udp 
-    port => 5140+    port => 514
   }   }
 </code> </code>
  
-  * La section ''filter'' permet de définir une chaîne de filtres à appliquer sur les données. Un des plugins de filtrage les plus utilisés est Grok : à partir d'une expression régulière, il capture des informations et les ajoute dans des champs. Certaines expressions régulières sont déjà définies dans l'installation de base Logstash, par exemple pour récupérer les données au format syslog : +  * Les sections ''20-prefilter.conf'' et suivantes permettent de définir une chaîne de filtres à appliquer sur les données. Un des plugins de filtrage les plus utilisés est Grok : à partir d'une expression régulière, il capture des informations et les ajoute dans des champs. Certaines expressions régulières sont déjà définies dans l'installation de base Logstash, par exemple pour récupérer les données au format syslog : 
  
 <code> <code>
Ligne 91: Ligne 90:
 Ensuite, on écrit les bons patterns pour matcher les logs radius, DHCP, etc.​ Ensuite, on écrit les bons patterns pour matcher les logs radius, DHCP, etc.​
  
-  * La section ''output'' définit les sorties. Ici on envoie les données à l'un des noeuds (peu importe lequel) de notre cluster Elasticsearch : +  * La section ''90-output.conf'' définit les sorties. Ici on envoie les données à l'un des noeuds (peu importe lequel) de notre cluster Elasticsearch : 
  
 <code> <code>
 output { output {
   elasticsearch {   elasticsearch {
-    hosts => ['192.168.102.229:9200']+    hosts => ['192.168.102.227:9200', '192.168.102.228:9200', '192.168.102.229:9200', '192.168.102.231:9200']
     template_overwrite => true     template_overwrite => true
   }   }
 } }
 </code> </code>
 +
 +==== Configuration snmp ====
 +
 +=== WLC ===
 +
 +La configuration des traps SNMP peut se faire en SSH sur le WLC ou en cliclic sur l'interface dans le menu "Management" -> "SNMP Traps". On envoie tout sur la machine logstash, port 162 par défaut, community ''monitoring''.
 +
 +=== logstash ===
 +
 +On utilise le plugin snmptrap pour configurer une entrée de type SNMP trap dans ''10-input.conf'' :
 +
 +<code>
 +snmptrap {
 +    yamlmibdir => "/usr/share/logstash/vendor/bundle/jruby/1.9/gems/snmp-1.2.0/data/ruby/snmp/mibs/"
 +    type => "snmptrap"
 +    community => "monitoring"
 +    host => "0.0.0.0"
 +    port => "162"
 +    type => "snmptrap"
 +    tags => ["snmptrap", "snmp"]
 +}
 +</code>
 +
 +Le rôle de la ligne de configuration ''yamlmibdir'' est explicité plus tard, les autres options sont relativement explicites.
 +
 +On ajoute ensuite une série de filtres pour parser unifier les différentes clés et les rendre "plus jolies". Regardez directement dans le fichier de conf pour avoir tous les détails, c'est une version modifiée de [[ https://github.com/mcnewton/elk/blob/master/logstash-configs/logstash-config-snmp|cet excellent exemple]]. La partie la plus importante est le parsing des addresses MAC en ruby :
 +
 +<code>
 +ruby {
 +     code => "
 +        begin
 +            keys = event.to_hash.keys
 +            keys.each{|key|
 +                if ( key =~ /^.*::([^\.]+)\..*$/ )
 +
 +                    newkey = key.gsub(/^.*::([^\.]+)\..*$/, '\1')
 +                    event.set(newkey, event.remove(key))
 +                    if ( newkey =~ /MacAddr(ess)*$/ && event.get(newkey) !~ /^(([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2}),*)+$/)
 +                        event.set(newkey, event.get(newkey).unpack('C*').map { |a| a.to_s(16) }.join(':'))
 +                    end
 +
 +                end
 +            }
 +
 +        rescue Exception => e
 +            event.set('logstash_ruby_exception', 'snmptrap: ' + e.message)
 +        end
 +        "
 +}
 +</code>
 +
 +Le plugin SNMP renvoie les MACs en ASCII et pas en hexa, ce qui rend à la base leur lecture particulièrement désagréable. Ce petit bout de ruby permet de corriger ça.
 +
 +<WRAP center round important 90%>
 +**Note :** Il faut installer le plugin ''logstash-filter-alter'' via ''/usr/share/logstash/bin/logstash-plugin install logstash-filter-alter''. N'oubliez pas d'exporter les proxy avant, et de faire de même pour les proxy Java : ''export _JAVA_OPTIONS='-Dhttps.proxyHost=192.168.102.61 -Dhttps.proxyPort=82 -Dhttp.proxyHost=192.168.102.61 -Dhttp.proxyPort=82''
 +</WRAP>
 +
 +== Retour sur yamlmibdir ==
 +
 +Comme vous le savez sans doute, le SNMP fonctionne par OID qui ont la forme suivante : ''1.3.6.1.4.1.14179.2''. Ces OIDs n'étant pas très agréables à lire pour un être humain, on utilise un MIB pour établir une association avec un identifiant plus agréable (''bsnWireless'' ici).
 +
 +Ces MIBs doivent être téléchargés et "compilés" pour que logstash puisse les utiliser.
 +Pour celà, on télécharge les MIBs nécessaires ainsi que leurs dépendances dans le dossier ''/usr/share/snmp/mibs/''.
 +
 +<wrap lo>Les MIBs Cisco sont disponibles sur leur site, les non-Cisco peuvent être trouvés sur [[http://mibs.snmplabs.com/asn1/|ici]]</wrap>
 +
 +Le chemin de base pour "compiler" les MIBs et les convertir en YAML est ici ''/usr/share/logstash/vendor/bundle/jruby/1.9/gems/snmp-1.2.0/''. On utilise le script ''import.rb'' ([[https://discuss.elastic.co/t/mib-oid-translation/29710|disponible ici]]) : ''ruby import.rb /usr/share/snmp/mibs''.
 +
 +<wrap lo>Notez que l'utilisation du script nécessite que ''smitools'' (ou ''libsmi'' en fonction du paquet) soit installé</wrap>
 +
 +
 +Si tout se passe bien, les mibs sont générés en YAML dans ''/usr/share/logstash/vendor/bundle/jruby/1.9/gems/snmp-1.2.0/data/ruby/snmp/mibs/'' et logstash sera en mesure de s'en servir !
  
 Comme pour les autres composants de la [[:wiki:monitoring:ELK:presentation | stack ELK]], n'hésitez pas à consulter la très bonne [[https://www.elastic.co/guide/en/logstash/2.0/index.html|documentation officielle]]. Comme pour les autres composants de la [[:wiki:monitoring:ELK:presentation | stack ELK]], n'hésitez pas à consulter la très bonne [[https://www.elastic.co/guide/en/logstash/2.0/index.html|documentation officielle]].
wiki/monitoring/elk/logstash.1447550568.txt.gz · Dernière modification: 2020/06/27 18:15 (modification externe)