TP – Analyser des journaux, bloquer une force brute avec Fail2ban et détecter un scan avec Suricata
BTS SIO SISR 1re année – Bloc 3 – S15
Note
But. Situation : Comment savoir qu'une attaque est en cours, et comment réagir automatiquement ?
Comment ce TP fonctionne. Avant de manipuler, tu écris ce que tu anticipes (« J'anticipe »). Puis tu testes et tu notes ce que tu constates. Tu comprends ce que fait chaque commande (« Je comprends »). Un bilan de compétences clôt la séance. Les manipulations se font sur des machines virtuelles de laboratoire, isolées du réseau de l'établissement. Les identifiants communs d'un TP sont des identifiants de laboratoire : ils ne se réutilisent jamais ailleurs.
Objectif
Analyser un journal d'authentification pour repérer une force brute, la bloquer automatiquement avec Fail2ban, détecter un balayage de ports avec Suricata, puis consulter les événements de sécurité d'une machine Windows.
Contraintes
- Binôme, durée : 3 h 20. VM
srv(cible, Debian) etadm(poste d'administration, Debian). La partie D utilise une VM Windows. - Les tests d'attaque (échecs de connexion,
nmap) se font uniquement entre tes VM de laboratoire, avec l'accord de l'enseignant. - Les adresses du journal généré (partie A) sont des adresses réservées à la documentation.
Partie A. Analyser un journal d'authentification (50 min)
Sur srv, génère un faux journal (21 lignes, données inventées) :
mkdir -p ~/journaux && cd ~/journaux
cat > gen-auth.sh <<'SH'
#!/bin/bash
OUT=${1:-auth-lab.log}
: > "$OUT"
h="srv"
add() { echo "$1 $h sshd[$2]: $3" >> "$OUT"; }
add "Oct 14 08:01:12" 2101 "Accepted publickey for etudiant from 192.0.2.10 port 51122 ssh2"
for i in $(seq 1 12); do
s=$(printf '%02d' $((i*2)))
add "Oct 14 08:15:$s" $((3000+i)) "Failed password for invalid user admin from 203.0.113.50 port $((40000+i)) ssh2"
done
for u in root test oracle ubuntu; do
add "Oct 14 08:16:30" 3100 "Failed password for invalid user $u from 203.0.113.50 port 41000 ssh2"
done
add "Oct 14 08:17:05" 3200 "Failed password for etudiant from 198.51.100.7 port 52000 ssh2"
add "Oct 14 08:17:20" 3201 "Failed password for etudiant from 198.51.100.7 port 52001 ssh2"
add "Oct 14 08:17:44" 3202 "Accepted password for etudiant from 198.51.100.7 port 52002 ssh2"
add "Oct 14 09:30:00" 3300 "Accepted publickey for etudiant from 192.0.2.10 port 51300 ssh2"
SH
bash gen-auth.sh
cat auth-lab.log
Lance les analyses :
grep -c "Failed password" auth-lab.log
grep "Failed password" auth-lab.log | awk '{for(i=1;i<=NF;i++) if($i=="from") print $(i+1)}' | sort | uniq -c | sort -rn
grep "Failed password for invalid user" auth-lab.log | awk '{print $11}' | sort | uniq -c | sort -rn
grep -B2 "Accepted password" auth-lab.log
J'anticipe. Quelle adresse va ressortir en tête des échecs ? Y aura-t-il un succès parmi ses essais ? ______________________
Éléments de réponse
203.0.113.50 (16 échecs, aucun succès). L'adresse 198.51.100.7 a, elle, un succès après deux échecs.
Je comprends.
| Élément | Rôle |
|---|---|
grep -c |
Compte les lignes correspondantes |
awk '{for(i=1;i<=NF;i++) if($i=="from") print $(i+1)}' |
Affiche le mot qui suit from (l'adresse source) |
sort \| uniq -c \| sort -rn |
Regroupe, compte, trie du plus fréquent au moins fréquent |
$11 |
Onzième champ de la ligne : le nom du compte dans invalid user NOM |
grep -B2 |
Affiche aussi les 2 lignes précédentes (contexte) |
Questions.
- Combien d'échecs au total ? Combien d'adresses en cause ? ______________________
- Pourquoi les comptes
admin,root,test,oracle,ubuntusont-ils typiques d'un scan automatique ? ______________________ - Que penses-tu de l'adresse
198.51.100.7: attaque, erreur de frappe ou compte compromis ? Quelle vérification feras-tu ? ______________________ - Écris la ligne de commande qui affiche les connexions réussies et leur adresse source. ______________________
- Quelle réponse proposes-tu pour
203.0.113.50(au moins deux actions) ? ______________________
Partie B. Bloquer une force brute avec Fail2ban (50 min)
Sur srv :
Note
Si tu as appliqué le durcissement de S14 (authentification par clé uniquement), réactive temporairement le mot de passe SSH pour générer des échecs de connexion :
sudo sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config.d/10-durcissement.conf && sudo systemctl reload ssh.
Tu le remets à no à la fin de la partie.
Crée /etc/fail2ban/jail.local (jamais dans jail.conf, qui est écrasé par les mises à jour) :
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
backend = systemd
maxretry = 3
findtime = 10m
bantime = 10m
Je comprends.
| Réglage | Rôle |
|---|---|
ignoreip |
Adresses jamais bannies (ton poste d'administration !) |
maxretry = 3 |
Nombre d'échecs tolérés |
findtime = 10m |
Fenêtre de comptage : 3 échecs en 10 minutes |
bantime = 10m |
Durée du bannissement |
backend = systemd |
Lit le journal journald (pas de fichier auth.log nécessaire) |
Depuis adm, génère des échecs (avec un compte qui n'existe pas) :
for i in 1 2 3 4; do ssh -o PubkeyAuthentication=no -o PreferredAuthentications=password -o ConnectTimeout=5 faux@192.168.56.10 </dev/null; done
(Saisis un mauvais mot de passe à chaque demande.)
Retourne sur srv :
sudo fail2ban-client status sshd
sudo journalctl -u fail2ban --no-pager | tail -5
sudo ufw status | head -12 ; sudo nft list ruleset | grep -i f2b | head -5
Puis débannis l'adresse :
J'anticipe. Après 4 échecs depuis adm, que se passe-t-il quand tu retentes une connexion (même avec le bon mot de passe) ? ______________________
Éléments de réponse
La connexion est refusée ou reste sans réponse : l'adresse est bannie par le pare-feu pour 10 minutes. Même avec le bon mot de passe, le paquet n'atteint plus le service.
Questions.
- Combien d'adresses sont bannies d'après
fail2ban-client status sshd? Laquelle ? ______________________ - Quel danger y aurait-il à bannir l'adresse de l'administrateur ? Comment l'éviter ? ______________________
- Un attaquant peut-il utiliser Fail2ban pour bloquer un utilisateur légitime ? Comment ? ______________________
- Fail2ban protège-t-il contre une attaque distribuée depuis mille adresses ? Que faut-il d'autre (S03, S14) ? ______________________
- Remets
PasswordAuthentication nosi tu l'avais changé. Pourquoi cette mesure reste-t-elle plus efficace que le bannissement ? ______________________
Partie C. Détecter un balayage avec Suricata (50 min)
Sur srv :
Édite /etc/suricata/suricata.yaml pour :
1. renseigner HOME_NET : "[192.168.56.0/24]" ;
2. dans af-packet, indiquer ton interface (par exemple enp0s3) ;
3. ajouter local.rules à la liste rule-files.
Crée la règle locale /var/lib/suricata/rules/local.rules :
alert tcp any any -> $HOME_NET any (msg:"LAB - balayage de ports probable"; flags:S; threshold:type both, track by_src, count 20, seconds 5; sid:1000002; rev:1;)
sudo suricata -T -c /etc/suricata/suricata.yaml -v
sudo systemctl restart suricata
sudo systemctl status suricata --no-pager | head -3
Depuis adm, lance le balayage (accord de l'enseignant obtenu) :
Sur srv :
sudo tail -n 5 /var/log/suricata/fast.log
sudo grep -c "balayage de ports" /var/log/suricata/fast.log
Je comprends.
| Élément | Rôle |
|---|---|
HOME_NET |
Le réseau à protéger ; $HOME_NET est utilisé dans les règles |
af-packet |
Mode de capture sur une interface |
suricata -T |
Teste la configuration et les règles sans démarrer |
fast.log |
Journal des alertes, une ligne par alerte |
nmap -sS |
Balayage SYN : envoie une demande de connexion par port |
J'anticipe. Le scan de 200 ports en quelques secondes déclenchera-t-il la règle « 20 SYN en 5 secondes » ? ______________________
Éléments de réponse
Oui : un scan SYN envoie un paquet par port à grande vitesse, très au-dessus du seuil. Une connexion web normale n'envoie qu'un ou deux SYN.
Questions.
- Quelle ligne d'alerte obtiens-tu (heure, adresse source, message) ? ______________________
- Que se passerait-il si le seuil était trop bas (par exemple 2 SYN en 5 s) ? Comment appelle-t-on ces alertes ? ______________________
- Cet outil fonctionne ici en IDS. Que faut-il changer pour qu'il bloque (IPS) ? Quels risques ? ______________________
- Un attaquant peut-il scanner lentement pour passer sous le seuil ? Que faire ? ______________________
Partie D. Journaux Windows (20 min)
Sur la VM Windows, ouvre l'Observateur d'événements → Journaux Windows → Sécurité. Verrouille la session (touches Windows + L) et entre un mauvais mot de passe deux fois, puis connecte-toi correctement. Retrouve les événements, soit dans l'observateur, soit en PowerShell (en administrateur) :
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} -MaxEvents 3 | Select-Object TimeCreated, Id, Message | Format-List
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4624} -MaxEvents 3 | Select-Object TimeCreated, Id
| Événement | ID | Nombre observé | Heure |
|---|---|---|---|
| Échec de connexion | 4625 | ||
| Connexion réussie | 4624 |
- Quel champ du message 4625 indique le compte ciblé et la source ? ______________________
- Quels événements surveillerais-tu en priorité sur un contrôleur de domaine (au moins trois identifiants) ? ______________________
- Pourquoi l'événement 1102 (journal effacé) est-il un signal d'alerte ? ______________________
Retour en entreprise
Si ta situation le permet : observe comment ton entreprise traite ce sujet, note en quelques lignes l'écart avec le TP, et, avec l'accord de ton tuteur, réalise une partie sur une situation réelle. Anonymise tes captures. Voir Transfert en entreprise.
Prolongement dans InfraLab (facultatif)
Un journal d'audit relie chaque modification à son auteur : c'est le même principe que la journalisation, vu côté outil de gestion.
Le simulateur InfraLab propose des TP guidés sur ce thème : vue TP, choisis le TP. Ils s'ajoutent à la séance (en classe si le temps le permet, sinon en autonomie) ; ils ne remplacent pas la manipulation sur machine réelle ci-dessus.
| TP | Titre | Durée |
|---|---|---|
| 37 | Audit : qui a fait quoi ? | 40 min |
Note
InfraLab simule : le score ne valide aucune compétence. Exporte le rapport du TP (HTML) et joins-le à ton compte rendu.
Bilan de la séance
Remplis ce bilan seul, honnêtement : il sert à décider ce qu'il faut reprendre. Niveau : Non maîtrisé, Maîtrise partielle, Bonne maîtrise ou Excellente maîtrise (le vocabulaire des grilles nationales d'évaluation) ; Non évalué si tu n'as pas travaillé la compétence aujourd'hui.
| 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
Les codes sont ceux du référentiel (l'arrêté numérote des activités : les codes « B… » sont un usage courant).
Je sais faire, sans aide :
- Lire un journal d'authentification et repérer une force brute ;
- Compter les échecs par adresse avec une ligne de commande ;
- Configurer et tester un bannissement automatique ;
- Écrire et tester une règle de détection simple ;
- Citer des événements Windows de sécurité à surveiller.
Ce que je dois reprendre : ______________________
Ma question à poser à l'enseignant : ______________________