La correction est intégrée au TP (Voir les encadrés de couleur vert)
Ce que vous allez apprendre dans ce TP
- Collecter avec Elastic Agent et Fleet
- Structurer avec Logstash
- Conserver avec ILM
- Analyser, visualiser, alerter
- Sécuriser l'accès
Introduction #
Ce que vous allez apprendre dans cette section
- Collecter avec Elastic Agent et Fleet
- Structurer avec Logstash
- Conserver avec ILM
- Analyser, visualiser, alerter
- Sécuriser l'accès
Contexte. Vous mettez en œuvre tout le parcours sur un cas réel : la grille d'évaluation de l'article du projet indique ce qui valide votre travail.
Prérequis : le labo Fleet du TP 1 de la formation Elastic Agent, jq · Durée estimée : 120 min
Mise en place #
Étapes guidées, avec leur correction.
1. Le labo et la collecte système
Démarrez le labo du TP 1 Elastic Agent (Elasticsearch, Kibana, Fleet Server, un agent dans la politique lab-policy) et vérifiez que les logs système arrivent.
Voir la correction
cd lab-elastic-agent && docker compose --profile fleet --profile agent up -d curl -s -u elastic:changeme-elastic 'localhost:5601/api/fleet/agents' -H 'kbn-xsrf: true' | jq '.items[] | {hostname: .local_metadata.host.hostname, status}' curl -s -u elastic:changeme-elastic 'localhost:9200/_data_stream/logs-system.*-lab' | jq -r '.data_streams[].name'2. La rétention de 30 jours
Pourquoi ? Le modèle d'index dédié doit exister avant la création du data stream de l'application pour qu'il hérite de la politique ILM.
Voir la correction
curl -s -u elastic:changeme-elastic -X PUT localhost:9200/_ilm/policy/legacy-30j -H 'Content-Type: application/json' -d '{ "policy": { "phases": { "hot": { "actions": { "rollover": { "max_age": "1d", "max_primary_shard_size": "10gb" } } }, "delete": { "min_age": "30d", "actions": { "delete": {} } } } } }' curl -s -u elastic:changeme-elastic -X PUT localhost:9200/_index_template/logs-legacyapp -H 'Content-Type: application/json' -d '{ "index_patterns": ["logs-legacyapp-*"], "data_stream": {}, "priority": 200, "composed_of": ["logs@mappings", "logs@settings", "ecs@mappings"], "template": { "settings": { "index.lifecycle.name": "legacy-30j" } } }'3. Logstash pour l'application historique
Générez un fichier de log, puis lancez Logstash sur le réseau du labo pour le structurer et l'envoyer danslogs-legacyapp-lab.Voir la correction
mkdir -p legacy && cd legacy for i in $(seq 200); do s=$(shuf -n1 -e 200 200 200 404 500); l=INFO; [ $s = 500 ] && l=ERROR; echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) $l $s /api/commande/$i"; done > app.log cat > legacy.conf <<'EOF' input { file { path => "/data/app.log" start_position => "beginning" sincedb_path => "/dev/null" } } filter { dissect { mapping => { "message" => "%{ts} %{[log][level]} %{[http][response][status_code]} %{[url][path]}" } } date { match => ["ts", "ISO8601"] remove_field => ["ts"] } mutate { convert => { "[http][response][status_code]" => "integer" } } translate { source => "[http][response][status_code]" target => "[labels][statut]" dictionary => { "200" => "ok" "404" => "introuvable" "500" => "erreur" } fallback => "autre" } } output { elasticsearch { hosts => ["http://elasticsearch:9200"] user => "elastic" password => "changeme-elastic" data_stream => true data_stream_dataset => "legacyapp" data_stream_namespace => "lab" } } EOF docker run -d --name logstash-legacy --network lab-elastic-agent_default -e XPACK_MONITORING_ENABLED=false \ -v $PWD/app.log:/data/app.log:ro -v $PWD/legacy.conf:/usr/share/logstash/pipeline/logstash.conf:ro \ docker.elastic.co/logstash/logstash:9.1.0 sleep 60; curl -s -u elastic:changeme-elastic 'localhost:9200/logs-legacyapp-lab/_count' | jq .count curl -s -u elastic:changeme-elastic 'localhost:9200/logs-legacyapp-lab/_ilm/explain' | jq '.indices[].policy' # legacy-30j4. Analyser et visualiser
Écrivez les requêtes ES|QL du tableau de bord, puis construisez-le dans Kibana (Lens) : répartition des statuts, erreurs par minute, top des URL en erreur, volume de logs système par hôte.
Voir la correction
FROM logs-legacyapp-lab | STATS n = COUNT(*) BY labels.statut FROM logs-legacyapp-lab | WHERE log.level == "ERROR" | STATS erreurs = COUNT(*) BY minute = BUCKET(@timestamp, 1 minute) FROM logs-legacyapp-lab | WHERE http.response.status_code >= 500 | STATS n = COUNT(*) BY url.path | SORT n DESC | LIMIT 10 FROM logs-system.*-lab | STATS lignes = COUNT(*) BY host.name5. Alerter et sécuriser
Créez une règle ES|QL qui alerte au-delà de 5 erreurs en 5 minutes (comme dans le TP d'alerte Kibana), puis un rôle et un utilisateur « lecteur » limités à la lecture des logs et du tableau de bord.
Voir la correction
FROM logs-legacyapp-lab | WHERE @timestamp > NOW() - 5 minutes AND log.level == "ERROR" | STATS erreurs = COUNT(*) | WHERE erreurs > 5curl -s -u elastic:changeme-elastic -X PUT localhost:5601/api/security/role/lecteur-logs -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d '{ "elasticsearch": { "indices": [ { "names": ["logs-*"], "privileges": ["read", "view_index_metadata"] } ] }, "kibana": [ { "base": [], "feature": { "dashboard": ["read"], "discover": ["read"] }, "spaces": ["default"] } ] }' curl -s -u elastic:changeme-elastic -X POST localhost:9200/_security/user/lecteur -H 'Content-Type: application/json' \ -d '{ "password": "changeme-lecteur", "roles": ["lecteur-logs"] }' | jq .created # Nettoyage : docker rm -f logstash-legacy && docker compose --profile fleet --profile agent down -v
Niveau de difficulté : ●●●○○ (3/5)
Mon suivi
Connectez-vous pour suivre votre progression et prendre des notes. Se connecter
💬 Questions sur cette leçon
Aucune question pour l'instant : soyez le premier à demander de l'aide ou à partager votre configuration.
Articles recommandés
Projet de parcours Elastic : centraliser et exploiter les journaux
Le projet de validation du parcours « Maîtrise de la suite Elastic » : Elastic Agent et Fleet, Lo...
Politiques d'agent, intégrations, data streams et pipelines
Construire des politiques d'agent, ajouter des intégrations (System, Nginx, Custom Logs), choisir...
Superviser, mettre à jour et dépanner Elastic Agent
Exploiter un parc d'Elastic Agent : états dans Fleet, supervision des agents, mises à jour par lo...
Elastic Observability : logs, infrastructure, APM et synthétiques
Les fonctions d'Elastic Observability : exploration des logs, inventaire d'infrastructure avec El...
Elastic Agent autonome, sorties Logstash et Kafka, et OpenTelemetry (EDOT)
Écrire une configuration autonome, envoyer vers Logstash ou Kafka, et utiliser Elastic Agent comm...
Elastic Agent : architecture, Fleet et intégrations
Comprendre Elastic Agent : agent unique de collecte, Fleet et Fleet Server, politiques d'agent, i...
Machine learning dans Elastic : détection d'anomalies et AIOps
Détecter automatiquement les comportements anormaux : jobs de détection d'anomalies, datafeeds, d...
Kibana : rôle, installation et premiers pas
Ce qu'est Kibana dans la suite Elastic, comment l'installer avec Elasticsearch (start-local, Dock...
Logstash en production : files persistantes, DLQ et multi-pipelines
Rendre Logstash fiable en production : file persistante, dead letter queue, plusieurs pipelines e...