1 - Découverte de l'écosystème Elastic
Apprendre à nager dans un océan d’évènements et de texte!
- Ouvrage recommandé : PacktPub - Learning Elastic Stack 6
Dans les épisodes précédents
- Linux ? on va reparler de tail, grep et des logs
- HTTP ? on va utiliser une API REST (basé sur HTTP)
- JSON ? on va utiliser des documents formatés en JSON
- Les bases de données ?
- Machines virtuelles ? on va parler un peu à la fin de cluster dans le cloud
(c’est compliqué un cluster elasticsearch mais on va surtout voir ça théoriquement)
Rappel
- L’informatique c’est complexe surtout lorsqu’on est pas familier avec l’environnement. Ça prend quelques temps pour être vraiment à l’aise.
- Elasticsearch et sa stack c’est particulièrement compliqué ! J’ai essayé d’évité les détails inutiles.
- Je peux oublier de préciser certaines choses donc arrêtez moi si ce que je dis n’est pas clair.
Intro) La stack ELK : Chercher et analyser les logs de façon centralisée
ELK : Elasticsearch, Logstash, Kibana
-
Elasticsearch : une base de données pour stocker des grandes quantités de documents texte
et chercher dedans.
-
Logstash : Un collecteur de logs et autre données pour remplir Elasticsearch.
-
Kibana : Une interface web pratique pour chercher et analyser les données stockées.
La suite Elastic
La suite Elastic, historiquement appelée “ELK”, est une combinaison de plusieurs produits de la société Elastic, qui développe des logiciels :
- de base de données distribuée (Elasticsearch)
- de dashboard / d’interface graphique pour explorer des données (Kibana)
- de logging / monitoring (Logstash et Beats)
Elastic APM
APM est le petit dernier d’Elastic, axé sur le monitoring et le traçage des performances des applications.
L’écosystème Elastic
La société Elastic évolue assez vite et change souvent ses produits. Elle a un business model open core : les fonctionnalités de base sont gratuites et open source, certaines ont une licence gratuites et source ouverte un peu spéciale et sont regroupées dans le “X-Pack” (les fonctionnalités Basic). D’autres fonctionnalités “X-Pack” enfin nécessitent un abonnement “Gold” ou plus.
Le cœur des produits Elastic est composé de Elasticsearch, Kibana (les dashboards et le mode Discover), de Logstash et de Filebeat.
Des bagarres de licence ont conduit d’autres personnes à proposer un fork d’Elasticsearch : OpenSearch (anciennement OpenDistro for Elasticsearch) qui est un fork de la suite Elastic, sponsorisé par Amazon et AWS.
Détails :
https://www.elastic.co/fr/subscriptions
Pourquoi ELK ? Pourquoi c’est dans le cursus
- Gérer une GRANDE quantité de logs sur une infrastructure (entre 5 et des centaines de machines)
- Les explorer efficacement : un problème difficile vu la quantité (on y reviendra)
- Un brique important pour avoir des applications distribuées avec un déploiement automatisé #Devops
En résumé
- On va voir trois choses durant ces deux jours qui peuvent résumer l’intérêt d’ELK:
- Les logs : pourquoi? comment ? ( quelle est la motivation de ELK )
- Découvrir elasticsearch et comment chercher dans du texte ? ( la partie principale )
- Qu’est-ce qu’une infra distribuée moderne ? pourquoi ELK c’est du devops ? ( fin )
Ce qu’on ne va que mentionner rapidement
- Voir en détail l’installation d’une stack ELK à la main
- Configurer Logstash ou Elastic APM pour pomper des logs d’une vraie infrastructure
- Aborder la sécurité de ELK dans sa totalité parce que c’est compliqué (mais c’est important pour faire de vraies installations)
Rapidement, la sécurité dans Elasticsearch
L’écrasante majorité des piratages de Elasticsearch vient simplement de l’exposition sans mot de passe d’instances Elasticsearch sur des adresses IP publiques. Pour s’en rendre compte, on peut demander au moteur de recherche Shodan la liste des serveurs qui ont le port 9200 ouvert sur Internet et qui ne demandent pas d’authentification.
Il y a un modèle RBAC (qui a droit de faire quoi sur le cluster) qui est assez complet et permet aux admins Elasticsearch de mettre en place une gestion des droits assez fine.
La “hype” Elasticsearch
- Indipensable à de plus en plus d’entreprises qui grossissent : pour augmenter le contrôle sur les infrastructures.
- Un outil très versatile et bien fait qui permet de faire de jolis dashboards d’analyse et les gens adorent avoir des jolis dashboards
- Utile pour faire des big data : c’est un peu le moteur de l’informatique actuelle. Tous les nouveaux services fonctionnent grace au traitement de données.
Dashboards
I) Les évènements d’un système et le logging
I.1) Rappel - pourquoi des Logs ?
Logs ?
- Ça veut dire journaux (système) et bûches
- Icone originale de Logstash:
Comprendre ce qui se trame
- Prendre connaissance et analyser les évènements d’un système d’un point de vue opérationnel.
- Les évènements en informatique sont invisibles et presque instantanés.
- Les journaux sont la façon la plus simple de contrôler ce qui se passe
- Des fichiers textes simple avec une ligne par évènement
Objectif 1: monitoring
- Suivre et anticiper le fonctionnement d’un système:
- suivre (et réparer) = zut j’ai une erreur : le service nginx a crashé sur mon infra
- anticiper : le disque dur de cette machine sera bientôt plein il faut que je le change / le vide.
- enquêter : par exemple sur les erreurs rares d’une application
Objectif 2 : conserver les traces de ces évènements pour analyse
Infra distribuée
Exemples de fichier de logs
- chaque application peut avoir un fichier de log
- ou alors on peut les rassembler dans un le même fichier
- les logs sont dans
/var/log
Vous en connaissez ?
Exemples de fichier de logs
Exemples de fichiers de logs :
auth.log
: connexion des utilisateurs au système
httpd.log
: connexion au serveur web apache
mail.log
: aussi bien envoi que réception de mails
nginx/access.log
: connexion au serveur web nginx
nginx/error.log
: erreurs de connexion au serveur web nginx
Exemple d’investigation
Objectif:
- analyser des logs pour retrouver une information
- être attentif-ve au format des logs
Sur le serveur exemple.net, une page web a été supprimée. On veut savoir qui des trois administrateurs Alice, Bob ou Jack a fait cette modification.
- On se connecte en SSH
- en utilisant
cat
et grep
par exemple :
- Pour connaître le titre du site au fil du temps consultez le fichier
/var/log/nginx/access.log
- on utilise
| grep 403
et | grep 200
pour savoir quand la page a disparu (en cherchant les codes d’erreur HTTP)
- Pour savoir qui s’est connecté on consulte le fichier
/var/log/auth.log
- on utilise
| grep
et l’heure pour savoir qui s’est connecté à cette heure ci
`/var/log/nginx/access.log` :
root@exemple:/home/alice# cat /var/log/nginx/access.log
127.0.0.1 - - [19/Aug/2021:21:53:28 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.58.0"
127.0.0.1 - - [19/Aug/2021:21:53:40 +0000] "GET / HTTP/1.1" 200 616 "-" "curl/7.58.0"
127.0.0.1 - - [19/Aug/2021:22:09:16 +0000] "GET / HTTP/1.1" 403 178 "-" "curl/7.58.0"
127.0.0.1 - - [19/Aug/2021:22:09:20 +0000] "GET / HTTP/1.1" 403 178 "-" "curl/7.58.0"
127.0.0.1 - - [19/Aug/2021:22:09:21 +0000] "GET / HTTP/1.1" 403 178 "-" "curl/7.58.0"
`/var/log/auth.log` :
root@exemple:/home/alice# cat /var/log/auth.log
Aug 19 21:31:13 ubuntu-bionic sudo: jack : TTY=pts/0 ; PWD=/home/jack ; USER=root ; COMMAND=/bin/sh -c echo BECOME-SUCCESS-qzjtxhuddaxgkqyivvmjsgpcijwmywth ; /usr/bin/python3 /home/jack/.ansible/tmp/ansible-tmp-1629408672.571441-2529-99170342043575/AnsiballZ_systemd.py
Aug 19 21:31:13 ubuntu-bionic sudo: pam_unix(sudo:session): session opened for user root by jack(uid=0)
Aug 19 21:31:15 ubuntu-bionic sudo: pam_unix(sudo:session): session closed for user root
Aug 19 21:32:15 ubuntu-bionic sshd[2176]: Received disconnect from 192.168.2.1 port 49608:11: disconnected by user
Aug 19 21:32:15 ubuntu-bionic sshd[2176]: Disconnected from user jack 192.168.2.1 port 49608
Aug 19 21:32:15 ubuntu-bionic sshd[2099]: pam_unix(sshd:session): session closed for user jack
Aug 19 21:32:15 ubuntu-bionic systemd-logind[847]: Removed session 5.
Aug 19 21:52:19 ubuntu-bionic sshd[5610]: Accepted publickey for bob from 10.0.2.2 port 49854 ssh2: RSA SHA256:1M4RzhMyWuFS/86uPY/ce2prh/dVTHW7iD2RhpquOZA
Aug 19 21:52:19 ubuntu-bionic sshd[5610]: pam_unix(sshd:session): session opened for user bob by (uid=0)
Aug 19 21:52:19 ubuntu-bionic systemd: pam_unix(systemd-user:session): session opened for user bob by (uid=0)
Aug 19 21:52:19 ubuntu-bionic systemd-logind[847]: New session 7 of user bob.
Aug 19 21:52:25 ubuntu-bionic sudo: bob : TTY=pts/0 ; PWD=/home/bob ; USER=root ; COMMAND=/bin/su
Aug 19 21:52:25 ubuntu-bionic sudo: pam_unix(sudo:session): session opened for user root by bob(uid=0)
Aug 19 21:52:25 ubuntu-bionic su[5708]: Successful su for root by root
Aug 19 21:52:25 ubuntu-bionic su[5708]: + /dev/pts/0 root:root
Aug 19 21:52:25 ubuntu-bionic su[5708]: pam_unix(su:session): session opened for user root by bob(uid=0)
Aug 19 21:52:25 ubuntu-bionic su[5708]: pam_systemd(su:session): Cannot create session: Already running in a session
Aug 19 22:12:45 ubuntu-bionic su[5708]: pam_unix(su:session): session closed for user root
Aug 19 22:12:45 ubuntu-bionic sudo: pam_unix(sudo:session): session closed for user root
Aug 19 22:12:48 ubuntu-bionic sshd[5691]: Received disconnect from 10.0.2.2 port 49854:11: disconnected by user
Aug 19 22:12:48 ubuntu-bionic sshd[5691]: Disconnected from user bob 10.0.2.2 port 49854
Aug 19 22:12:48 ubuntu-bionic sshd[5610]: pam_unix(sshd:session): session closed for user bob
Aug 19 22:12:48 ubuntu-bionic systemd-logind[847]: Removed session 7.
Bilan
- Explorer les logs “à la main” c’est pas toujours très pratique.
- Chercher des évènements datés en filtrant n’est pas très adapté.
- Résoudre un problème nécessite de les interpréter.
- Pour cela on doit chercher et croiser des informations diverses avec un but.
I.2) Le problème avec les logs d’une infrastructure
Décentralisé
La quantité
- Des millions et des millions de ligne de journaux, ce qui représente potentiellement des teraoctets de données.
- Cette quantité faramineuse de données texte il faut pouvoir:
- la stocker et la classer, l’uniformiser (les logs ont pleins de format différents)
- chercher dedans par date efficacement.
- croiser les données
La stack ELK
La stack ELK
Quelques forces d’Elasticsearch et ELK
- Facile à agrandir: (elastic) c’est une application automatiquement distribuée.
- Ajout d’un nouveau noeud, réindexation et hop.
- Presque en temps réel : Les évènements sont disponibles pour la recherche presque instantanément
- Recherche très rapide : sur des gros volumes
Exercice I.2)
Calculons la quantité de log que produisent 12 instances d’une application pendant un mois
Chaque instance = Un serveur web, une application python + une base de données pour toutes les instances
- Chercher la taille d’une ligne de log ?
- Combien pèse un caractère ?
- Comment mesurer la quantité de lignes produites par une application ?
- on va retenir 200 lignes par minute en moyenne pour le serveur web
- 120 pour l’application python
- 60 pour la DB -> c’est très variable
- Faire le calcul
- Conclusions…