Aller au contenu

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) et adm (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.

  1. Combien d'échecs au total ? Combien d'adresses en cause ? ______________________
  2. Pourquoi les comptes admin, root, test, oracle, ubuntu sont-ils typiques d'un scan automatique ? ______________________
  3. Que penses-tu de l'adresse 198.51.100.7 : attaque, erreur de frappe ou compte compromis ? Quelle vérification feras-tu ? ______________________
  4. Écris la ligne de commande qui affiche les connexions réussies et leur adresse source. ______________________
  5. 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 :

sudo apt install -y fail2ban
sudo systemctl status fail2ban --no-pager | head -3

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
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

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 :

sudo fail2ban-client set sshd unbanip 192.168.56.20

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.

  1. Combien d'adresses sont bannies d'après fail2ban-client status sshd ? Laquelle ? ______________________
  2. Quel danger y aurait-il à bannir l'adresse de l'administrateur ? Comment l'éviter ? ______________________
  3. Un attaquant peut-il utiliser Fail2ban pour bloquer un utilisateur légitime ? Comment ? ______________________
  4. Fail2ban protège-t-il contre une attaque distribuée depuis mille adresses ? Que faut-il d'autre (S03, S14) ? ______________________
  5. Remets PasswordAuthentication no si 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 :

sudo apt install -y suricata
ip -br addr
sudo suricata --build-info | head -3

É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) :

sudo apt install -y nmap
nmap -sS -p 1-200 192.168.56.10

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.

  1. Quelle ligne d'alerte obtiens-tu (heure, adresse source, message) ? ______________________
  2. Que se passerait-il si le seuil était trop bas (par exemple 2 SYN en 5 s) ? Comment appelle-t-on ces alertes ? ______________________
  3. Cet outil fonctionne ici en IDS. Que faut-il changer pour qu'il bloque (IPS) ? Quels risques ? ______________________
  4. 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
  1. Quel champ du message 4625 indique le compte ciblé et la source ? ______________________
  2. Quels événements surveillerais-tu en priorité sur un contrôleur de domaine (au moins trois identifiants) ? ______________________
  3. 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 : ______________________