Des commandes que personne n’a passées
Un lundi matin, le site d’une boutique affiche des commandes que personne n’a passées. Rien n’a été modifié le week-end.
Vous ne devinez pas. Vous ouvrez le journal. Il dit ce que la machine a fait, et à quelle heure.
À la fin de cette leçon
Remarque
Je peux trouver dans un journal ce qui s’est mal passé.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Journal | un fichier où un programme note ce qu’il a fait | auth.log |
| Ligne de journal | une entrée : une heure, une source et un message | |
| Horodatage | la date et l’heure écrites sur une ligne de journal | |
| Filtre | ne garder que les lignes qui vous intéressent | grep |
| Chronologie | des événements de plusieurs journaux classés par heure | |
| Preuve | une ligne de journal qui appuie ce que vous affirmez |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une ligne de journal a des parties
Les machines écrivent leurs journaux selon un modèle régulier, pour qu’un outil puisse les lire. Apprenez le modèle une fois et chaque ligne devient facile.
Une ligne du journal des connexions donne la date et l’heure, la machine, le programme, puis un message. Le message contient les faits : qui a essayé, d’où, et si cela a marché.
Les pièces du dossier d’enquête
ls caseAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Combien de lignes dans le journal des connexions ?
wc -l case/var/log/auth.logAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Les deux premières lignes du journal web
head -n 2 case/var/log/nginx/access.logAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Les trois dernières lignes du journal web
tail -n 3 case/var/log/nginx/access.logAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : une ligne du journal web
| Partie | Exemple | Sens |
|---|---|---|
| Adresse | 192.0.2.77 | Qui a demandé |
| Heure | [14/Oct/2026:00:01:49 +0000] | Quand |
| Requête | "GET /login HTTP/1.1" | Ce qu’on a demandé |
| État | 200 | La réponse : 200 réussi, 404 introuvable, 403 refusé |
| Taille | 2557 | Octets renvoyés |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Filtrer d’abord, compter ensuite
grep garde les lignes qui contiennent certains mots. grep -c les compte au lieu de les afficher.
Pour compter selon une colonne, découpez la colonne avec awk, triez-la, et laissez uniq -c compter les séries. Un second sort -rn met le plus grand nombre en premier.
Compter les mots de passe refusés
grep -c "Failed password" case/var/log/auth.logAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter les connexions acceptées
grep -c "Accepted" case/var/log/auth.logAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter le journal web par code d’état
awk '{print $9}' case/var/log/nginx/access.log | sort | uniq -cAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un petit extrait à lire
Oct 14 02:11:03 web01 sshd[2211]: Invalid user admin from 203.0.113.5 port 4410
Oct 14 02:11:03 web01 sshd[2211]: Failed password for invalid user admin from 203.0.113.5 port 4410 ssh2
Oct 14 02:11:09 web01 sshd[2214]: Failed password for root from 203.0.113.5 port 4418 ssh2
Oct 14 02:14:40 web01 sshd[2230]: Accepted password for lea from 192.0.2.44 port 5120 ssh2
Exemple travaillé : compter par adresse
| Étape | Ce qu’elle fait | Résultat pour l’extrait |
|---|---|---|
| 1 | Garder les lignes Failed password | 2 lignes |
| 2 | Découper l’adresse après « from » | 203.0.113.5 deux fois |
| 3 | Compter chaque adresse | 203.0.113.5 : 2 |
| 4 | Chercher une ligne Accepted venant d’elle | Aucune : elle n’est jamais entrée |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Erreur fréquente
Attention
Beaucoup de gens pensent que l’adresse aux plus nombreux échecs est celle qui est entrée. Les échecs et les réussites sont des lignes différentes. Une adresse peut échouer mille fois sans jamais réussir. Cherchez toujours une ligne de réussite, puis vérifiez qu’elle vient de l’adresse soupçonnée.
Une chronologie réunit les journaux
Un seul journal raconte rarement toute l’histoire. Classez les événements de plusieurs journaux par heure. Cherchez ensuite ce qui est arrivé en premier.
Le premier événement compte le plus. Ce qui suit peut en être la conséquence.
Exemple travaillé : une chronologie
| Heure | Source | Événement |
|---|---|---|
| 02:11 | Journal des connexions | Beaucoup de mots de passe refusés depuis une adresse |
| 02:14 | Journal des connexions | Une connexion acceptée pour lea depuis une autre adresse |
| 02:16 | Journal web | Une demande de page d’administration, réponse 200 |
| 02:30 | Journal de cron | Une nouvelle tâche s’exécute pour la première fois |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Suivre un journal, lire un long fichier
Tapez tail -f suivi du nom d’un journal pour voir arriver les nouvelles lignes. Ctrl+C arrête la commande. Un Run ne peut pas appuyer sur Ctrl+C : tapez celle-ci vous-même.
Tapez less et le nom d’un journal pour parcourir un long fichier. Appuyez sur / et un mot pour chercher, et sur q pour quitter.
Pour aller plus loin
Dans le journal web, la colonne 7 est la page demandée. Écrivez un seul enchaînement qui garde les lignes 404, découpe la colonne 7 et compte chaque page.
Triez pour mettre le plus grand nombre en tête et gardez les trois premières. Dites ensuite en une phrase quel genre de visiteur demande des pages qui n’existent pas.