Elastic SIEM Part II - Logstash pour monitorer des Switchs Cisco

Logstash logo

Maintenant que notre Elastic SIEM est fonctionnel nous pouvons commencer à monitorer des éléments. Je vais commencer ici avec des switchs Cisco Small Business/SG.

Les Switchs utiliseront le protocole syslog pour envoyer des informations au module logstash.

Logstash récupèrera les messages, les analysera et en extraiera les informations utiles qu'il enverra «classées; organisées; structurées» à Elasticsearch.

Comprendre le fonctionnement de Logstash

SIEM | logstash Input Filter and Output modules
Logstash, pipeline processing.

Installation de Logstash (Debian Serveur)

J'installerai Logstash sur la même machine que le moteur Elasticsearch.

Installation depuis les paquets (dpkg)

  • Télécharger le paquet Logstash et son fichier de hashage sha512 associé dans /tmp/ :
root@host:~# wget https://artifacts.elastic.co/downloads/logstash/logstash-7.12.0-amd64.deb https://artifacts.elastic.co/downloads/logstash/logstash-7.12.0-arm64.deb.sha512 -P /tmp/
  • Installer le service Logstash :
root@host:~# dpkg -i /tmp/logstash-7.12.0-amd64.deb
root@host:~# systemctl enable logstash.service

Installation depuis le gestionnaire de paquets (apt)

Si ce n'est déjà fait il faudra au préalable importer la clé PGP Elasticsearch et ajouter le dépots, voir la partie I.

  • Installer et activer Logstash :
root@host:~# apt install logstash

Service

  • Check logstash service :
root@host:~# systemctl status logstash.service
  • Activer logstash au démarrage :
root@host:~# systemctl enable logstash.service

Fichier de logs

  • Logstash :
root@host:~# tail /var/log/logstash/logstash-plain.log

Configuration

Les fichiers «Pipeline»

Les fichiers de configuration Pipeline vont définir les différentes étapes du traitement qu'effectue Logstash. Les fichiers de configuration se trouvent dans le dossier /etc/logstash/conf.d.

cisco.conf

  • Créer le fichier /etc/logstash/conf.d/cisco.conf :
input {
	udp {
		port => "514"
		type => "syslog-udp-cisco"
	}
}

filter {
	grok {  
		#Un exemple d'un message syslog envoyé par les switchs Cisco : <190>%LINK-I-Up: gi1/0/13
		match => { "message" => "^<%{POSINT:syslog_facility}>%%{DATA:cisco_code}: %{GREEDYDATA:syslog_message}" }
	}
} 
output {
	elasticsearch {
		hosts           => ["http://127.0.0.1:9200"]
		index           => "cisco-switches-%{+YYYY.MM.dd}"
	}
}

Explications en détail du fichier cisco.conf

Comme on peut le voir au dessus, le fichier se décompose en trois parties : input, filter and output.

Input

Ici on déclare simplement sur quel port logstash écoutera pour capter les trames syslog.

  • Protocole UDP :
udp {
  • Précision du numéro de port sur lequel écouter :
port => "514"
  • Ajoute le tag syslog-udp-cisco sur chaque message récupérè :
type => "syslog-udp-cisco"
Filter

C'est la partie «difficile» du fichier de configuration. C'est ici que l'on va définir et décrire comment extraire les informations utiles de nos trames. Le but étant de découper chaque message en plusieurs parties.

Par exemple ici avec nos messages syslog Cisco qui ressemblent à ça : «<190>%LINK-I-Up: gi1/0/13» donc nous les séparerons de la façon suivante : <syslog_facility>%Cisco Action: Message.

Elasticsearch | le filtre logstash expliqué
  • Bon à savoir, les patterns les plus utilisés :
    • WORD : matchera un mot
    • NUMBER : matchera un entier positif ou négatif ou un flottant
    • POSINT : matchera un entier positif
    • IP : matchera une adresse IPv4 ou IPv6
    • NOTSPACE : matchera n'importe quoi qui n'est pas un espace
    • SPACE : matchera un ou plusieurs espace
    • DATA : matchera n'importe quel type de donnée
    • GREEDYDATA : matchera toutes les données restantes
Output

Une fois que nos données sont correctement organisées nous pouvons les envoyer vers le service Elasticsearch.

  • Préciser l'adresse de Elasticsearch :
hosts           => ["http://127.0.0.1:9200"]
  • Donne un nom à notre index dans lequel seront stockées nos données :
index           => "cisco-switches-%{+YYYY.MM.dd}"

Configuration des Switches Cisco

  • Nous avons besoin de nous connecter à nos switchs pour activer le logging et préciser l'adresse ip de notre serveur Logstash :
Switch (config)# logging host 192.168.1.200 port 514

Autres

Vérification d'un fichier pipeline

  • Il est possible de vérifier un fichier de règles pipeline :
root@host:~# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/pipeline.conf --config.test_and_exit

Tester manuellement le traitement des données d'un fichier pipeline

Nottament pour le débogage il peut être utile de voir en temps réel la sortie d'un fichier de règles Logstash.

  • Arret du service logstash :
root@host:~# systemctl stop logstash.service
  • Ajout d'un port d'écoute et d'un stdout à notre fichier pipeline, dans le but de voir les informations sur la console :
input {
	tcp {
		port => "514"
		type => "syslog-tcp-telnet"
	}
}

[…]
output {
	stdout { codec => rubydebug }
}
  • Lancer logstash :
root@host:~# /usr/shareyy/logstash/bin/logstash -f /etc/logstash/conf.d/cisco.conf --config.reload.automatic
  • Utiliser telnet pour se connecter sur le port d'écouter de notre service logstash (fonctionne seulement avec le protocole TCP) :
root@host:~# telnet 192.168.1.200 514
<190>%LINK-I-Up: gi1/0/13

Lister les indexs

Maintenant que nos switchs sont configurés nous pouvons vérifier qu'ils sont correctement enregistrés dans elasticsearch.

  • Pour se faire on peut utiliser la commande suivante :
root@host:~# curl 'localhost:9200/_cat/indices?v'
health status index                             uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .apm-agent-configuration          rkV4oelEQzC7zJ19_NYbcw   1   0          0            0       208b           208b
green  open   .kibana_1                         rtWr4Pk-TKmYrQ_jQ7Oi4Q   1   0       1689           93      2.6mb          2.6mb
green  open   .apm-custom-link                  Yo72Y9STSAiuSUWT40AJnw   1   0          0            0       208b           208b
green  open   .kibana_task_manager_1            o_uGNd0mQSu6X5_th3P2ng   1   0          5        50053      4.5mb          4.5mb
green  open   .async-search                     3RGoSaTXRLizPMce1I169w   1   0          3            6       10kb           10kb
yellow open   cisco-switches-2021.04.12         gs_PaI2iT_CMQhABskEB6g   1   1      17109            0      1.5mb          1.5mb
green  open   .kibana-event-log-7.10.2-000002   r_1sdbv0QW2XNR0bcvZN2g   1   0          1            0      5.6kb          5.6kb
yellow open   cisco-switches-2021.04.11         j9yz1SWzRwaG_int0rX4YQ   1   1       2283            0    338.1kb        338.1kb
  • Afficher le contenu d'un index :
root@host:~# curl -XGET 'localhost:9200/cisco-switches-2021.04.11/_search?pretty&q=response=200'
     {
        "_index" : "cisco-switches-2021.04.11",
        "_type" : "_doc",
        "_id" : "1XV3wngBMGalcfKW8ROi",
        "_score" : 3.052513,
        "_source" : {
          "syslog_message" : "PnP Response Success",
          "@timestamp" : "2021-04-11T19:45:43.739Z",
          "message" : "<190>%PNPAGENT-I-RESPSUCCESS: PnP Response Success",
          "host" : "192.168.0.15",
          "type" : "syslog-udp-cisco",
          "cisco_code" : "PNPAGENT-I-RESPSUCCESS",
          "syslog_facility" : "190",
          "@version" : "1"
        }
      },

Kibana

Vérifier la présence des «indices»

Maintenant que nous avons des données dans nos indexes il est maintenant temps de créer un joli dashboard depuis kibana pour avoir une représentation graphique des logs envoyés par les swicths.

  • Ouvrir Firefox et aller se connecter sur http://KIBANA_IP_SERVER:5601/
  • Depuis le menu principal aller dans Management > Stack Management :
Kibana | Main menu, Management, Stack Management
  • Depuis Stack Management aller dans Data > Index Management :
Kibana | Main menu, Management, Stack Management, Data, Index Management
  • Les indices devraient apparaitre :
Kibana | Indices

Créer les «index pattern»

Nous allons créer un «index pattern» qui devra matcher toutes nos données de nos switchs Cisco.

  • Depuis le menu principal aller dans Management > Stack Management > Index Patterns :
  • Cliquer sur Create index pattern :
  • Taper «cisco-switches-» pour matcher toutes les sources de données :
  • Choisir «@timestamp» comme source de temps et cliquer sur Create index pattern :

Création du «dashboard»

Nous avons maintenant tout ce qu'il faut pour faire de jolis graphiques.

Représentation en forme de tarte

  • Depuis le menu principal aller dans Kibana > Dashboard :
  • Cliquer sur Create dashboard :
  • Cliquer sur Create new pour créer un objet :
  • Cliquer sur Lens :
  • Rechercher le terme cisco-switches :
  • Choisir Pie comme type de graphe :
  • Cliquer et déposer les champs host.keyword et cisco_code.keyword :
  • Devrait apparaitre une magnigique Tarte, cliquer sur Save :
  • Donner un Titre et cliquer sur Save and return :
  • La Tarte apparait maintenant sur le Dashboard :

Représentation en forme de Tableau

  • Depuis le dashboard cliquer sur Create new :
  • Cliquer sur Lens :
  • Choisir Data table comme type de graphe :
  • Cliquer et déposer les champs host.keyword, syslog_message.keyword et cisco_code.keyword :
  • Devrait apparaitre ce superbe Tableau, cliquer sur Save :
  • Donner un Titre et cliquer sur Save and return :
  • Maintenant Sauvegarder le Dashboard pour conserver les changements :
  • Donner un Titre et cliquer sur Save :
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :