Logstash & Kibana – Centraliser les logs

Cette procédure va porter sur l’installation et la configuration de Logstash, Kibana et ElasticSearch, souvent abrégé en ELK.

Elle contient également les informations nécessaires à l’installation de modules complémentaires comme X-Pack et Beats.

 

Qu’est ce que c’est ? :

Logstash est un logiciel permettant de concaténer les logs de plusieurs machines afin d’accéder plus rapidement et de façon centralisée aux journaux d’événements de vos serveurs et de vos applications.

Kibana est une interface Web de présentation des données recueillies par Logstash.

ElasticSearch est un moteur de recherche pour les données recueillies par Logstash.

Ce trio va simplifier la vie du sysadmin en lui proposant rapidement une vue d’ensemble des serveurs et services dont il a la charge.

Du côté des modules complémentaires, X-Pack va ajouter des fonctions utiles à ElasticSearch comme une couche de sécurité supplémentaire, un module de surveillance, un autre d’alerte ou encore une fonction de création de rapports.

Le module Beats permet d’installer un agent sur chaque serveur. Cet agent va s’occuper d’envoyer les données voulues (contenus des logs) vers notre serveur ElasticSearch/Logstash/Kibana.

L’acronyme ELK sera utilisé dans cette procédure pour désigner le serveur de surveillance ElasticSearch/Logstash/Kibana.

Le résultat final ressemblera à ceci :

 

L’installation des dépendances :

On installe les dépendances :

apt-get install jruby apt-transport-https

On ajoute ensuite les dépôts nécessaires à l’installation de Java8

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" > /etc/apt/sources.list.d/java-8-ubuntu-xenial.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu xenial main" >> /etc/apt/sources.list.d/java-8-ubuntu-xenial.list

On ajoute la clé au trousseau :

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886

Enfin, on met à jour les dépôts et on installe Java 8 :

apt-get update && apt-get install oracle-java8-installer

 

L’installation de ElasticSearch :

On ajoute la clé au trousseau :

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

On ajoute le dépôt aux sources.list:

echo "deb http://packages.elastic.co/packages/5.x/apt stable main" > /etc/apt/sources.list.d/elastic-5.x.list

On met les dépôts à jour et on installe ElasticSearch :

apt-get update && apt-get install elasticsearch

On configure le démarrage automatique de l’application :

update-rc.d elasticsearch defaults 95 10

Puis on démarre le service :

service elasticsearch start

 

L’installation de Logstash :

Les dépôts et sa clé étant déjà installés grâce à l’étape d’installation de ElasticSearch, on passe directement à l’installation :

apt-get install logstash

 

L’installation de Kibana :

Les dépôts et sa clé étant déjà installés grâce à l’étape d’installation de ElasticSearch, on passe directement à l’installation :

apt-get install kibana

On configure le démarrage automatique de l’application :

update-rc.d kibana defaults 95 10

Et on démarre le service :

service kibana start

 

L’installation de X-Pack :

Nous avons besoin d’installer X-Pack pour ElasticSearch, Logstash et Kibana.

Pour ElasticSearch, on lance la commande suivante :

bin/elasticsearch-plugin install x-pack

Puis on redémarre le service :

service elasticsearch restart

Pendant l’installation, nous devons lui accorder certains droits pour qu’il puisse envoyer des mails (la fonction d’alerte). En outre, il faut également activer la fonction de ‘machine learning’. Entrez ‘Y’ pour valider ces choix.

Pour Kibana, on lance la commande suivante :

bin/kibana-plugin install x-pack

Puis on redémarre le service :

service kibana restart

Pour Logstash, on lance la commande suivante :

bin/logstash-plugin install x-pack

Puis on redémarre le service :

service logstash restart

Ce n’est pas terminé; après la petite explication sur Beats, nous allons configurer les applications que nous avons installé ci-dessus.

 

L’installation de Beats :

Beats comprend cinq applications à installer indépendamment, suivant les fonctions que vous souhaitez ajouter.

Il s’agit en effet d’un agent à installer sur les machines dont vous souhaitez centraliser les logs.

  • Packetbeat est un analyseur de paquets.
  • Metricbeat récupère des données statistiques de vos systèmes d’exploitation et services.
  • Filebeat permet de simplifier la récupération de logs si vous avez beaucoup de machines à surveiller ou des logs très lourds
  • Winlogbeat va permettre à votre machine Windows de communiquer ses journaux d’événements à votre serveur ELK.
  • Heartbeat va surveiller la disponibilité des services en les testant de façon régulière. La réponse et le temps de réponse de ces tests seront ensuite communiqués au serveur ELK, permettant une analyse approfondie de vos serveurs et services.

Dans notre cas, nous allons uniquement installer Filebeat. Cette agent est à installer sur chaque machine dont on veut récupérer les logs.

 

L’installation de Filebeat :

Filebeat est l’agent à installer sur les serveurs à surveiller. Nous avons donc un serveur de test sur lequel est installé Apache2 et MySQL.

Nous souhaitons centraliser les logs de ce serveur vers notre serveur ELK, afin de les consulter et d’en tirer des graphs.

Pour cela, il nous faut l’adresse IP publique de votre serveur ELK.

Si votre serveur ELK et votre serveur à surveiller ne possèdent pas d’adresse IP publique utilisable, vous pouvez toujours connecter ces deux machines dans un VPN.

On installe ensuite l’application Filebeat sur la machine à surveiller avec cette commande :

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.4-amd64.deb
sudo dpkg -i filebeat-5.6.4.amd64.deb

Une fois installé, on édite le fichier de configuration :

nano /etc/filebeat/filebeat.yml

Vous pourrez alors définir le chemin des fichiers de log à surveiller en définisasnt un prospector comme ceci :

filebeat.prospectors:
 - input_type: log
  paths:
   - /var/log/apache2/error.log

La configuration par défaut est suffisante sur ce point, car elle va chercher TOUS les logs qui se situent dans /var/log/.

On paramètre ensuite l’adresse IP du serveur vers lequel envoyer les logs :

output.elasticsearch:
   hosts: ["adresseIpELK:PORT"]

On sauvegarde la configuration et on peut maintenant tester la configuration avec la commande :

filebeat --configtest -e

 

La configuration :

On va maintenant configurer ElasticSearch en modifiant le fichier suivant :

nano /etc/elasticsearch/elasticsearch.yml

Puis on ajoute les informations suivantes :

network.host: adresseIpELK
network.bind.host: adresseIpELK

On enregistre le fichier de configuration et on relance le service :

service elasticsearch restart

Dans un navigateur, rendez vous à l’adresse suivante :

http://adresseIpELK:9200

On configure ensuite Logstash.

Nous allons créer un fichier spécifique à Filebeat grâce à la commande suivante :

nano /etc/logstash/conf.d/beats-input.conf

Puis on le configure comme suis :

input {
  beats {
    port => 5044
    ssl => true
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"

Ensuite on modifie le fichier /etc/logstash.conf

filter {
   grok {
      match => ["message", "%{SYSLOGTIMESTAMP:log_timestamp } %{SYSLOGHOST:host}: "]
   }
}

output {
   elasticsearch { 
      hosts => ["adresseIpELK:9200"] 
   }
   stdout { codec => rubydebug }
}

Enfin, on redémarre le service :

service logstash restart

On configure Kibana :

nano /opt/kibana/config/kibana.yml

Puis on ajoute ceci :

server.host: adresseIpELK
elasticsearch.url: http://adresseiPELK:9200

Finalement, on redémarre le service :

service kibana restart

On peut constater en visitant l’adresse suivante :

http://adresseIpELK:5601

Sur le serveur syslog, on configure /etc/filebeat/filebeat.yml :

#filebeat.yml
filebeat:
  prospectors:
    -
      paths:
        - /var/log/apache2/error.log
      input_type: log
  registry_file: /var/lib/filebeat/registry

output:
  elasticsearch:
    hosts: ["adresseIpELK:9200"]
  logstash:
    hosts: ["adresseIpELK:5044"]
    tls:
      certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

shipper:

logging:
  files:
    rotateeverybytes: 10485760 # = 10MB

On crée les certificats pour assurer la sécurité des échanges entre les machines :

mkdir -p /etc/pki/tls/certs
mkdir /etc/pki/tls/private

Dans le fichier /etc/ssl/openssl.conf

#IP du serveur Syslog/Filebeat
subjectAltName = IP: adresseIpSYSLOG

On génère le certificat et la clé privée :

cd /etc/pki/tls
openssl req -config /etc/ssl/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

On copie le certificat sur le serveur Syslog :

#sur serveur Filebeat
#IP du serveur ELK
scp /etc/pki/tls/certs/logstash-forwarder.crt root@adresseIpELK:/root

On crée les dossiers où sera stockés le certificat

#sur serveur ELK
mkdir -p /etc/pki/tls/certs
mv /root/logstash-forwarder.crt /etc/pki/tls/certs/

Enfin, on redémarre le service Filebeat :

service filebeat restart

 

L’interface web Kibana

Pour accéder à Kibana, rendez vous à l’adresse suivante http://adresseIpELK:5601.

 

Création d’un pattern

Lors de la première connexion sur l’interface web de Kibana, vous serez redirigé sur la page qui nous permet de créer un pattern. Pour créer un pattern, il faut toujours le créer avec le même nom « logstash-* » et avec le champ « Time-field name » à « @timestamp ». Le @timestamp correspond à l’heure du traitement des données et non à la date des logs. Toute création de graphiques, tableaux de bord ou recherche sera liée au pattern.

Il est donc préférable de toujours garder le même nom de pattern, notamment pour l’importation et l’exportation. Si vous avez créé plusieurs patterns, vous pouvez les créer dans Kibana. Cela vous permettra de séparer vos logs de la façon dont vous voulez au lieu d’avoir un pattern « logstash-* » qui regroupe tous.

 

Menu Discover

Dans ce menu on peut voir l’ensemble des résultats sur une période de temps choisie. Nous pouvons choisir les variables à afficher et affiner la recherche qui de base est sur ‘*’.

Pour faire une recherche il faut suivre cette syntaxe :

CHAMP: valeur

Prenons un grok comme exemple :

%{SYSLOGTIMESTAMP:date} %{IP:ip} %{WORD:service} %{NUMBER:numero} %{MAC:mac} %{NOTSPACE:notspace}

Rechercher tous les logs qui ont la valeur « 400 » dans le champ « numero » :

numero: 400

Rechercher les logs qui ont pour valeur une adresse MAC. Les champs qui comportent des caractères spéciaux ont besoin de guillemets pour être pris en compte :

MAC: "AD:RE:SS:EM:AC:00"

Rechercher les valeurs du champ numero supérieur ou égal à 1000 :

numero: [1000 TO *]

Rechercher les valeurs du champ numero strictement supérieur à 1000 :

numero: {1000 TO *}

Les opérateurs booléens AND, OR et NOT :

NOT numero:{ 1000 TO *} AND MAC: "AD:RE:SS:EM:AC:00"

Le menu Discover de Kibana nous montre seulement 500 résultats au maximum. Cependant,si vous avez beaucoup de logs, il faudra affiner votre recherche. Pour afficher moins de logs, nous pouvons utiliser le filtre du temps.

Nous pouvons aussi customiser la recherche en affichant les champs que nous voulons. Il est possible de sauvegarder cette recherche. Cette recherche sera utilisable comme un filtre et comme une vue.

Les filtres de ses recherches pourront être utilisées plus tard lors de la conception des graphiques. Cela permettra de filtrer les valeurs en amont. Les vues des recherches pourront être ajoutées dans un tableau de bord sous la forme d’un tableau.

 

SSL/TLS est désactivé par défaut et VOUS NE DEVEZ PAS vous connecter sauf si votre installation est locale et vous devez également changer les mots de passe des utilisateurs elastic et kibana avant la mise en production

https://www.elastic.co/guide/en/x-pack/5.6/encrypting-communications.html

https://www.elastic.co/guide/en/x-pack/5.6/setting-up-authentication.html#built-in-users

Vous pouvez également utiliser la formula Saltstack pour automatiser cette procédure qui est disponible ici.