TP – Un collecteur de journaux et une alerte multi-machines
BTS SIO SISR 2e année – Bloc 3 – S11 – en binôme : un tape, l'autre lit ; on échange les rôles à chaque partie
Note
But. Centraliser les journaux de deux serveurs sur un collecteur, écrire une règle de corrélation qui repère une même adresse attaquant plusieurs machines, vérifier la reprise après coupure, et fixer une durée de conservation.
Durée : 3 h 10. Prérequis : cours S11 lu ; S04 (RGPD).
Note
Comment ce TP fonctionne. Tu anticipes (« J'anticipe »), tu manipules, tu notes ce que tu constates, puis tu expliques (« Je comprends »). Un bilan de compétences clôt la séance.
Binôme : ____________ / ____________
Le laboratoire
Trois machines virtuelles Debian sur un réseau interne isolé, avec un compte sudo :
| Machine | Nom | Adresse | Rôle |
|---|---|---|---|
| 1 | coll |
10.20.0.1 |
Collecteur central |
| 2 | srv1 |
10.20.0.11 |
Source |
| 3 | srv2 |
10.20.0.12 |
Source |
Contraintes. Instantané de chaque machine avant de commencer ; paquet rsyslog sur les trois (sudo apt install -y rsyslog) ; chaque machine a un nom différent (hostnamectl set-hostname srv1, etc.) ; tu notes la sortie de chaque commande (capture datée).
Warning
Les événements d'échec de connexion de ce TP sont simulés avec la commande logger, qui injecte une ligne dans le journal comme le ferait le service SSH. Les adresses 203.0.113.x et 198.51.100.x sont des adresses réservées à la documentation : elles ne désignent aucune vraie machine. Le laboratoire reste isolé.
Partie A – Lire un journal local (≈ 20 min)
Sur srv1 :
sudo tail -5 /var/log/auth.log
logger -t sshd -p authpriv.warning "Failed password for invalid user test from 203.0.113.5 port 4000 ssh2"
sudo tail -2 /var/log/auth.log
J'anticipe. Avant la deuxième commande : la ligne apparaîtra-t-elle dans auth.log ? Pourquoi dans ce fichier-là ? ______________________
Je comprends. Retrouve dans la ligne les quatre éléments qui, quoi, quand, d'où. Lesquels manquent ? ______________________
Partie B – Le collecteur (≈ 35 min)
Sur coll :
B1 – Un dossier réservé
Je comprends. Le service rsyslog s'exécute sous l'utilisateur syslog, pas root. Que se passerait-il si le dossier appartenait à root ? (Tu peux le vérifier : c'est l'erreur la plus fréquente de ce TP.) ______________________
B2 – La configuration de réception
Crée /etc/rsyslog.d/10-collecteur.conf (avec sudo nano) :
# Reception des journaux des autres machines (TCP 514, reseau de laboratoire uniquement)
module(load="imtcp")
input(type="imtcp" port="514")
# Un dossier par machine, un fichier par programme
template(name="ParMachine" type="string" string="/var/log/central/%HOSTNAME%/%programname%.log")
# Format du fichier d'alertes : date, machine, message
template(name="Alerte" type="string" string="%timegenerated:::date-rfc3339% %HOSTNAME% %msg%\n")
# Les echecs de connexion sont copies dans un fichier dedie
if $msg contains "Failed password" then {
action(type="omfile" file="/var/log/central/echecs-connexion.log" template="Alerte")
}
# Tout ce qui vient du reseau est range par machine, puis ne va pas plus loin
if $fromhost-ip != "127.0.0.1" then {
action(type="omfile" dynaFile="ParMachine")
stop
}
rsyslogd -N1 vérifie la syntaxe sans rien lancer. Une ligne LISTEN sur le port 514 confirme la réception.
Je comprends. Explique chaque bloc de la configuration en une phrase. Pourquoi la dernière règle contient-elle stop ? ______________________
Warning
Le port 514 en clair convient à un laboratoire isolé. En production, on chiffre (TLS) et on filtre (pare-feu, séance S05) pour que seules les sources connues puissent écrire sur le collecteur : sinon n'importe qui peut polluer les journaux avec de faux événements.
Point de contrôle : capture du fichier de configuration et de la ligne LISTEN.
Partie C – Les sources (≈ 30 min)
Sur srv1 et srv2 :
C1 – La configuration d'envoi
Crée /etc/rsyslog.d/90-envoi.conf :
*.* action(type="omfwd" target="10.20.0.1" port="514" protocol="tcp"
action.resumeRetryCount="-1"
queue.type="LinkedList" queue.size="10000"
queue.filename="envoi" queue.saveOnShutdown="on")
Je comprends. protocol="tcp" plutôt qu'UDP : pourquoi ? Que font resumeRetryCount="-1" et les lignes queue.* ? ______________________
C2 – Envoyer des événements
Sur srv1, puis sur srv2 :
for i in 1 2 3; do logger -t sshd -p authpriv.warning "Failed password for invalid user admin from 203.0.113.50 port 400$i ssh2"; done
logger -t sshd "Accepted password for alice from 192.0.2.10 port 5000 ssh2"
Sur coll :
sudo find /var/log/central -type f | sort
sudo cat /var/log/central/echecs-connexion.log
sudo cat /var/log/central/srv1/sshd.log
J'anticipe. Combien de fichiers vas-tu trouver, et lesquels ? Le message Accepted figurera-t-il dans echecs-connexion.log ? ______________________
Point de contrôle : capture de find et du contenu des deux fichiers.
Partie D – Corréler (≈ 40 min)
D1 – Une règle de seuil, tous serveurs confondus
Sur coll, crée ~/correle.sh :
#!/bin/sh
# Alerte si une meme adresse source cumule au moins SEUIL echecs, tous serveurs confondus
SEUIL=${1:-5}
sudo cat /var/log/central/echecs-connexion.log \
| awk -v s="$SEUIL" '{ for(i=1;i<=NF;i++) if($i=="from"){ip=$(i+1); n[ip]++; h[ip" "$2]=1} }
END{ for(ip in n) if(n[ip]>=s){ c=0; for(k in h){split(k,a," "); if(a[1]==ip)c++}; print "ALERTE: "ip" : "n[ip]" echecs sur "c" serveur(s)" } }'
J'anticipe. Avec les six échecs de la partie C, que va afficher chaque commande ? ______________________
Je comprends. Explique ce que fait le script (lecture, comptage par adresse, comptage des machines concernées). Pourquoi une alerte sur deux serveurs est-elle plus inquiétante qu'une alerte sur un seul ? ______________________
D2 – Régler le seuil
Génère maintenant du « bruit » légitime : un échec depuis 192.0.2.10 (un collègue qui se trompe de mot de passe) sur chaque serveur, puis une attaque : huit échecs depuis 198.51.100.7 sur srv1 uniquement.
logger -t sshd -p authpriv.warning "Failed password for alice from 192.0.2.10 port 6000 ssh2"
for i in 1 2 3 4 5 6 7 8; do logger -t sshd -p authpriv.warning "Failed password for invalid user root from 198.51.100.7 port 70$i ssh2"; done
(Lance la première commande sur les deux serveurs, la boucle sur srv1 seulement.) Puis ~/correle.sh 5 sur coll.
| Seuil testé | Alertes obtenues | Fausses alertes ? | Attaque manquée ? |
|---|---|---|---|
| 2 | |||
| 5 | |||
| 10 |
Je comprends. Quel seuil retiens-tu, et pourquoi ? Que répondrais-tu à un responsable qui demande « une alerte dès le premier échec » ? ______________________
D3 – Une règle qui n'existe pas encore
Rédige en une phrase une règle de séquence (plusieurs échecs, puis un succès depuis la même adresse) : quelles données faut-il, et où la calculer ? ______________________
Partie E – Fiabilité (≈ 30 min)
E1 – Le collecteur tombe
Sur coll : sudo systemctl stop rsyslog. Sur srv1 :
logger -t sshd -p authpriv.warning "Failed password for invalid user root from 198.51.100.99 port 9 ssh2"
Attends une minute, puis relance le collecteur (sudo systemctl start rsyslog) et, sur coll, cherche la ligne :
J'anticipe. La ligne arrivera-t-elle ? Au bout de combien de temps environ ? ______________________
Je comprends. Quelle est la limite d'une file en mémoire ? Quelle option du fichier d'envoi la réduit ? ______________________
E2 – L'attaquant efface ses traces
Sur srv1 : sudo truncate -s 0 /var/log/auth.log, puis compare avec ce que le collecteur conserve de srv1.
Je comprends. Que démontre cette expérience pour la preuve (séance S15) ? Qu'est-ce qu'un attaquant avisé ferait avant d'effacer ? ______________________
E3 – Le temps
Sur chaque machine : date -u, puis timedatectl | grep -i synchronized.
Je comprends. Les trois horloges concordent-elles à la seconde ? Pourquoi est-ce indispensable pour reconstituer une chronologie, et quel service installerais-tu pour le garantir ? ______________________
Note
La synchronisation sur un serveur de temps (par exemple avec chrony) n'est pas demandée dans ce TP, car le réseau du laboratoire est isolé. Elle fait partie des recommandations à écrire en partie F.
Partie F – Conserver (≈ 25 min)
F1 – Rotation
Sur coll, crée /etc/logrotate.d/central :
/var/log/central/*.log /var/log/central/*/*.log {
daily
rotate 180
compress
delaycompress
missingok
notifempty
create 0640 syslog adm
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
L'option -d simule sans rien modifier.
Je comprends. Cette configuration conserve environ combien de temps ? Est-ce une valeur imposée ou un choix ? ______________________
F2 – La politique de journalisation de l'Atelier Verdier
Reprends le dossier de la séance S02. En une demi-page, rédige la politique de journalisation : sources à collecter, durée de conservation justifiée (cours, partie 6), accès aux journaux, information du personnel (S04), surveillance de l'absence de journaux, synchronisation du temps.
Retour en entreprise (si ta situation le permet)
- Observer : où vont les journaux dans ton entreprise ? Y a-t-il un collecteur ? Pendant combien de temps les conserve-t-on, et qui les lit ?
- Documenter : compare avec ta politique de F2.
Rendu
Compte rendu PDF, nommé RENDU-B3A2-S11-NOM.pdf, contenant les captures datées des parties A à F, le tableau des seuils (D2) et la politique de F2.
Bilan de la séance
| Compétence du référentiel | Ce que j'ai fait dans cette séance | Niveau |
|---|---|---|
| B3.4 – Garantir la disponibilité, l'intégrité et la confidentialité des services informatiques et des données de l'organisation face à des cyberattaques | ||
| B3.5A – Assurer la cybersécurité d'une infrastructure réseau, d'un système, d'un service |
Note
Je sais faire, sans aide :
- Envoyer les journaux de plusieurs machines vers un collecteur ;
- Écrire une règle de corrélation et régler son seuil ;
- Expliquer pourquoi la centralisation protège la preuve ;
- Justifier une durée de conservation.
Ce que je dois reprendre : ______________________