Analyser les logs en temps réel avec ELK

Tout bon admin système le sait, les logs d’un serveur sont critiques. ELK est une suite logicielle qui permet d’analyser ses logs en temps réel, mais aussi de faire des recherches poussées, et générer des dahsboards.

ELK c’est quoi ?

C’est une suite logicielle formée de 3 composants :

  • Elasticsearch
  • Logstash
  • Kibana

Elasticsearch

Elasticsearch est une base de données full text. Son but est d’encaisser de très gros volumes de données en texte, et de pouvoir faire des recherches rapides sur ces données.

En plus de ça, c’est un outil capable de fonctionner en cluster de façon très simple, et d’assurer ainsi une haute disponibilité.

Logstash

Logstash prend en entrée des logs de plusieurs sources (fichiers existant, réseau, syslog, …), va les analyser, les découper, avant de les renvoyer à Elasticsearch. Par exemple, si on prend un ligne de log apache :

1.2.3.4 - myuser[10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

On va déterminer que l’adresse ip du client est 1.2.3.4, que l’utilisateur identifié est myuser, qu’il a fait une requête de type GET, que la requête est /apache_pb.gif, que le retour de la requête est 200 et que l’on a transféré 2326 octets.

Une fois qu’il a fait tout ce découpage, il envoie les données à Elasticsearch. Il nous sera donc possible par la suite de faire des recherches sur tous les champs indexés.

Kibana

Kibana est un front-end web pour Elasticsearch. Il va permettre d’afficher les données sous plusieurs formats : brut, graphiques, dashboards. Il va permettre aussi de fournir une interface de recherche avancée.

 

Installation

Avant d’aller plus loin, vous devez installer une couche java sur la machine. Je conseille la version 8 de openjdk (la version 9 sur Ubuntu 16.04 a provoqué un plantage de logstash).

sudo apt-get install openjdk-8-jre

Pour la suite ELK, plusieurs méthodes d’installation : depuis les sources, utiliser un paquet (.deb ou .rpm), docker, ou bien installer un dépôt. Pour des raisons de facilité et de mises à jour, choisissons cette dernière. La documentation pour Debian se trouve ici : www.elastic.co/guide/en/kibana/5.0/deb.html

Une fois le dépôt installé, la syntaxe est très simple :

sudo apt-get install elasticsearch kiaban logstash

Un minimum de sécurité

Par défaut, Elasticsearch écoute sur le port 9200 sur toutes les interfaces. Si vous n’utilisez pas le mode cluster, il est préférable d’éditer le fichier /etc/elasticsearch/elasticsearch.yml pour mettre

network.host : 127.0.0.1

puis de redémarrer elasticsearch

systemctl restart elasticsearch

Si vous utilisez le mode cluster, vous devez laisser cette valeur par défaut, mais il faut gérer avec votre firewall le fait que seules les machines habilitées puissent communiquer sur le port 9200. Cela évitera de vous faire pourrir avec les logs de n’importe qui…

Parser son premier log

On va commencer simple, par les logs apache. Supposons que vous utilisez les logs de type « combined », et que le fichier log est /var/log/apache2/acces.log

Il faut créer un fichier /etc/logstash/conf.d/apache.cfg

input {
  file { 
    path => "/var/log/apache2/access.log"
    type => "apache"
    start_position => "end"
  }
}

Voyons ce que ça dit :

  • en input, j’ai un type file. Cela veut dire que je vais lire un fichier
    • Le path de ce fichier est « /var/log/apache2/access.log »
    • Le type est « apache » (c’est une valeur totalement arbitraire, je peux mettre ici ce que je veux)
    • start_position => end, cela veut dire que je ne vais analyser que les nouvelles lignes de ce fichier, et je ne vais pas relancer l’analyse depuis le débu

Maintenant qu’on a une entrée, il faut voir comment on va la travailler :

filter {
  if [type] == "apache" {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
  }
}

Nous allons filtrer les lignes dont le type est égal à « apache ». Cela correspond à ce que l’on a mis dans le type du input.

La méthode de parsing par défaut de logstash est grok, et on lui demande de faire matcher le « message » (c’est à dire le contenu de la ligne) au pattern COMBINEDAPACHELOG. C’est un cas très simple, le pattern est déjà écrit…

Maintenant qu’on a tout parsé, il faut l’envoyer à elasticsearch :

output {
  elasticsearch {
    hosts => ["localhost:9200"]
  }
}

On renvoie les données à u moteur « elasticsearch », sur le localhost, sur le port 9200.

Une fois que ce fichier est créé dans sa totalité, il faut relancer logstash :

systemctl restart logstash

 Voir les résultats dans Kibana

Pour voir Kibana en action, lancez un navigateur et pointez sur votre serveur, sur le port 5601. Si rien ne se passe, regardez au niveau de votre firewall si rien ne bloque…

Un peu de configuration

Par défaut, aucun index n’est créé. Si Kibana ne vous le propose pas, cliquez sur « Management » puis « index pattern ». En bas, cliquez sur « create ».

Cliquez sur « discover », et si tout va bien, au bout de quelques minutes, vous devrez voir des données apparaître.

 

One thought on “Analyser les logs en temps réel avec ELK

Laisser un commentaireAnnuler la réponse.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.