TP1 — Socle & segmentation : votre infra, votre code
1. Contexte — votre dossier devient une base
Section intitulée « 1. Contexte — votre dossier devient une base »Au TP0, votre groupe a rendu un dossier : des zones justifiées, une matrice de flux, un plan d’adressage. Aujourd’hui, ce dossier cesse d’être du papier. Votre groupe est une base australe ; chaque décision du dossier va se câbler, se coder, se prouver — sur vos postes.
Le principe du module tient en une phrase : voici OPNsense et des machines nues — vous écrivez le code qui pose l’infra, vous découpez les zones, vous écrivez les règles. Et l’objectif de sécurité aussi : un attaquant qui compromet le frontal exposé ne doit pas pouvoir se promener dans le SI. C’est ce que vous allez prouver — pas affirmer, prouver.
2. L’architecture cible — 3 zones réparties sur 4 postes
Section intitulée « 2. L’architecture cible — 3 zones réparties sur 4 postes »Le SI de la base est découpé en 3 zones derrière un unique pare-feu OPNsense à état, plus mgmt, le plan d’administration (le réseau depuis lequel le pare-feu s’administre — ce n’est pas une zone du SI).
| Zone | VLAN | Rôle | Ce qui y tournera (TP2) | Subnet — votre plan | Hébergé par |
|---|---|---|---|---|---|
| z-front | (votre n°) | Zone exposée (DMZ) | Caddy + Nextcloud — seule zone joignable du WAN | 10.G.40.0/24 | Membre B |
| z-services | (votre n°) | Le précieux | AD Windows (LDAP/DNS) + PostgreSQL — ne sort jamais vers Internet | 10.G.10.0/24 | Membre C |
| z-soc | (votre n°) | Le plan d’analyse | Grafana + Loki — cul-de-sac : tout pousse vers lui, il ne sort nulle part | 10.G.50.0/24 | Membre D |
| mgmt | — | Plan d’admin | Rien : le poste OPNsense administre la GUI en local | 192.168.56.0/24 (imposé — voir §4) | Membre A |
G = le numéro de votre groupe (groupe 3 → 10.3.40.0/24, etc.). Ce n’est pas un caprice : au TP3, deux bases s’interconnectent — et deux réseaux identiques ne s’interconnectent pas. Votre plan d’adressage du TP0 devait être disjoint du voisin ; maintenant vous savez pourquoi.
La base est distribuée sur vos 4 postes ESIROI
Section intitulée « La base est distribuée sur vos 4 postes ESIROI »Vous êtes 4 dans le groupe et vous n’assemblez pas tout sur une seule machine : chaque membre héberge une part de l’infra sur SON poste ESIROI (VirtualBox), et les postes se relient par le switch managé de la salle. La segmentation n’est donc plus locale à une machine — elle se fait par VLAN 802.1Q sur le switch.
| Membre | Tient | Sur son poste (VirtualBox) | Port du switch |
|---|---|---|---|
| A — Réseau | OPNsense (pare-feu, routage, règles, transit TP3) | 1 VM appliance montée à la main | trunk (vos 3 VLAN) |
| B — Front | TAAF-WEB-001 (Caddy + Nextcloud) | Vagrant | access — VLAN de z-front |
| C — Identité & données | TAAF-AD-001 (AD Windows) + TAAF-DB-001 (PostgreSQL) | AD à la main + Vagrant | access — VLAN de z-services |
| D — SOC | TAAF-MON-001 (Grafana + Loki) | Vagrant | access — VLAN de z-soc |
Les invariants — ce que votre architecture doit rendre vrai
Section intitulée « Les invariants — ce que votre architecture doit rendre vrai »- Règle d’or —
z-frontn’atteintz-servicesque sur les flux nominatifs de ses applications (la base de Nextcloud, l’annuaire) ; tout le reste tombe. - Isolement du SOC — un seul port entre dans
z-soc: l’ingestion Loki (3100). Rien n’en sort. Compromis, le SOC n’est pas un pivot. - Egress —
z-servicesetz-socne sortent pas vers le WAN : anti-exfiltration. - Default-deny — la dernière règle de chaque interface est
block log: le refus est une donnée de détection.
3. Palier E1 — Votre Vagrantfile (chacun le sien)
Section intitulée « 3. Palier E1 — Votre Vagrantfile (chacun le sien) »C’est le livrable IaC du module : vous l’écrivez — de zéro. Le dépôt ne fournit pas de squelette clé en main, seulement des indications (Vagrantfile.skel : une checklist commentée, rien de copiable-collable). Comme chaque membre héberge sa part sur son propre poste, chacun écrit SON Vagrantfile, qui ne définit que sa/ses VM(s) et lit la source de vérité partagée ma-topologie.yaml (le plan du groupe — une seule et même copie versionnée pour tout le monde).
# Chaque membre, sur SON poste, dans son propre Vagrantfile :vagrant up # Membre B lève web · Membre C lève db · Membre D lève soc # (l'AD Windows de C, lui, se monte à la main — TP2)Pourquoi un fichier par membre (et pas un fichier unique partagé) : la carte à ponter porte un nom local à chaque poste (en0, eth0…) et personne ne fait tourner l’infra entière sur sa machine. Le fichier de chacun décrit donc exactement ce qui tourne chez lui. L’unicité, elle, est portée par ma-topologie.yaml, que tout le monde partage.
Ce que votre Vagrantfile doit dire, et pourquoi :
# Votre fichier lit le plan partagé (à la racine du dépôt) et ne définit QUE votre hôte.require 'yaml'TOPO = YAML.load_file(File.expand_path('../ma-topologie.yaml', __dir__))# ... sélectionnez VOTRE hôte (celui dont owner == vous), puis :# config.vm.define <short> do |node|# node.vm.network "public_network",# bridge: "<votre carte>", # LOCALE à votre poste — VBoxManage list bridgedifs# ip: "<l'IP de votre hôte dans le plan>" # statique, VOTRE plan# node.vm.provider "virtualbox" { |vb| vb.memory = <la RAM du plan> }# endpublic_network(pont) : la VM est posée sur la carte physique de votre poste, donc sur le switch. Aucun tag VLAN côté invité : c’est le port access du switch qui place votre VM dans le bon VLAN (§2). Le seul chemin d’une zone à l’autre passera à travers OPNsense (le trunk, §4) — un pare-feu ne filtre que ce qui le traverse.- Vous ne taguez pas, vous ne pontez pas « à plat » : votre port switch fait la zone. Vérifiez avec l’enseignant que votre port est bien dans votre VLAN avant de vous étonner d’un flux qui passe (ou ne passe pas).
- Zone ≠ hôte : la zone est un réseau (un VLAN), l’hôte est une machine (
TAAF-WEB-001). Les deux ne portent jamais le même nom. - Déclarez la RAM de votre VM : un Vagrantfile qui ne budgète pas sa RAM n’est pas un plan d’infrastructure.
Preuve E1 : chaque membre fait vagrant up sans erreur sur son poste ; vagrant ssh répond ; chaque Vagrantfile est commité (et tous lisent le même ma-topologie.yaml).
4. Palier E2 — Le pare-feu existe
Section intitulée « 4. Palier E2 — Le pare-feu existe »OPNsense s’installe à la main, depuis l’ISO officielle — c’est une appliance, son installation est un geste d’ingénieur, pas de la plomberie :
cd server/ingenieurs./create-opnsense-vm.sh /chemin/OPNsense-25.7-dvd-amd64.isoOPNsense tient sur le poste du Membre A, dont la carte physique est branchée sur le port trunk du switch. Le script crée une VM vierge à trois cartes (le trunk remplace les 5 pattes intnet du modèle mono-poste) :
| Carte VBox | OPNsense | Rattachement | Usage |
|---|---|---|---|
| NIC1 | em0 → wan | NAT | Sortie Internet |
| NIC2 | em1 → lan | host-only | mgmt — GUI depuis le poste A, anti-lockout |
| NIC3 | em2 | pont sur le trunk | Porte les VLAN 40·10·50 (sous-interfaces ci-dessous) |
| NIC4 | em3 → opt4 | pont RJ45 | Transit — TP3 uniquement, absente aujourd’hui |
Sur em2 (le trunk), vous créez une sous-interface VLAN par zone — c’est le router-on-a-stick :
Sous-interface (sur em2) | VLAN | Devient | Adresse (passerelle de zone) |
|---|---|---|---|
| VLAN de z-front | (votre n°) | opt1 → z-front | 10.G.40.1/24 |
| VLAN de z-services | (votre n°) | opt2 → z-services | 10.G.10.1/24 |
| VLAN de z-soc | (votre n°) | opt3 → z-soc | 10.G.50.1/24 |
Installez depuis l’assistant (le mot de passe root est votre secret, hors Git), retirez l’ISO, redémarrez. Puis, dans la GUI : em1 = mgmt (192.168.56.10/24) ; Interfaces ▸ Other Types ▸ VLAN → créez une sous-interface par zone sur le parent em2, avec vos numéros de VLAN (ceux de ma-topologie.yaml) ; Interfaces ▸ Assignments → assignez chaque VLAN en opt1/opt2/opt3 et donnez-lui le .1 de votre plan. em2 lui-même ne porte aucune adresse : il ne fait que transporter les tags. Les numéros doivent être identiques à ceux des ports access du switch — sinon le trafic de zone n’arrive jamais.
Pourquoi mgmt n’est pas dans votre 10.G : contrainte d’hyperviseur — VirtualBox restreint les réseaux host-only à 192.168.56.0/21 par défaut. Effet de bord sain : le plan d’admin se distingue visuellement du SI segmenté. Et mgmt doit être host-only : c’est le seul rattachement qui remonte jusqu’au poste A pour joindre la GUI.
Preuve E2 : « Câblage vérifié » affiché par le script, les trois pings de zone qui passent (router-on-a-stick validé), et la GUI joignable depuis le poste A sur https://192.168.56.10.
5. Palier E3 — Le réseau à plat est mesuré
Section intitulée « 5. Palier E3 — Le réseau à plat est mesuré »Basculez la route par défaut de chaque VM vers la patte OPNsense de sa zone (le .1 de votre plan) — un geste qui doit rester explicite, jamais au boot : déclarez pour cela un provisioner Vagrant en run: "never", que vous lancez à la demande. Tant qu’il n’est pas joué, la VM sort par le NAT (pratique pour installer) ; une fois joué, tout traverse le pare-feu. Posez alors sur chaque patte la politique naïve — tout passe — et mesurez.
Les services réels arrivent au TP2 : pour mesurer aujourd’hui, posez des témoins — un port en écoute là où votre matrice prévoit un service :
# Sur TAAF-DB-001 : simuler PostgreSQL et LDAP en écoutenc -lk 5432 &nc -lk 389 &Puis, depuis z-front, balayez en bash pur (pas de nmap à installer) :
DB=10.G.10.30for p in 22 389 5432; do timeout 2 bash -c "</dev/tcp/$DB/$p" 2>/dev/null \ && echo "$p ouvert" || echo "$p bloqué"donePreuve E3 : le balayage « tout ouvert » depuis z-front. Cette photo « avant » est un livrable noté : un pare-feu se juge à la différence qu’il produit — sans « avant », votre « après » ne prouvera rien. C’est aussi l’état de la plupart des SI réels que vous rencontrerez.
6. Palier E4 — Default-deny posé, matrice écrite
Section intitulée « 6. Palier E4 — Default-deny posé, matrice écrite »Votre matrice de flux du TP0 devient la matrice d’ACLs du pare-feu — le livrable central, jugé ligne à ligne :
- Les règles s’écrivent sur l’interface source ; premier match gagne — l’ordre est une décision ;
- Le filtrage est à état : les retours d’une connexion autorisée sont implicites ;
- La dernière règle de chaque interface est
block log any— le default-deny, journalisé ; - Chaque ligne porte une justification métier. Une ligne que vous ne savez pas justifier est une ligne à supprimer.
Vous écrivez la matrice avant d’installer les services (TP2) — c’est voulu : la sécurité se spécifie, les services s’y conforment. Si le TP2 exige un flux imprévu, vous amenderez la matrice en justifiant l’amendement — c’est exactement la gestion de changement d’une vraie infra.
Preuve E4 : le même balayage qu’en E3 → seuls les témoins autorisés par votre matrice répondent ; le reste traîne puis tombe (filtré ≠ fermé : le pare-feu a mangé le paquet, la réponse ne vient jamais). Et dans Firewall ▸ Log Files ▸ Live View, vos refus apparaissent, nommés — le refus est une donnée.
7. Palier E5 — L’architecture est vérifiée
Section intitulée « 7. Palier E5 — L’architecture est vérifiée »Il n’y a plus de harnais qui sonde votre réseau à votre place : la preuve d’invariants, c’est le balayage bash « après » de l’étape E4 — celui qui montre que seuls les flux autorisés par votre matrice répondent. C’est cette photo, comparée à la photo « tout ouvert » de l’E3, qui est la preuve notée du cloisonnement.
Déclarez vos zones et IPs dans ma-topologie.yaml (gabarit fourni — la déclaration que lit votre Vagrantfile), puis, dans chaque VM, validez l’état du déploiement :
../check-vm.shcheck-vm.sh vérifie l’état local de la VM (hostname attendu, compte taaf-engineer + groupes, démon Docker actif, binaires installés) et produit la fiche à partager avec le groupe. Il ne teste pas le cloisonnement inter-VM — ce n’est pas son rôle : le cloisonnement se prouve avec les balayages bash de l’E3/E4.
Preuve E5 : check-vm.sh passe (code 0) sur chaque VM de la base, et le couple de balayages E3/E4 est cohérent avec votre matrice. Puis exportez la configuration OPNsense (System ▸ Configuration ▸ Backups) et commitez config.xml — après en avoir retiré les secrets (le TP3 en fera une épreuve).
8. Livrable
Section intitulée « 8. Livrable »Un dossier dans le dépôt Git du groupe :
- Votre Vagrantfile — écrit par vous, IPs de votre plan, RAM budgétée.
- La matrice d’ACLs justifiée ligne à ligne — le cœur du rendu.
- L’export
config.xml(sans secrets) — la configuration réelle, conforme à la matrice. - Le couple de balayages avant/après — E3 (tout ouvert) et E4 (matrice appliquée), côte à côte.
- La sortie de
check-vm.shsur chaque VM de la base — état validé, fiche produite.
9. Critères de réussite
Section intitulée « 9. Critères de réussite »| Critère | Ce qu’on vérifie |
|---|---|
| Le Vagrantfile est le vôtre | Il pose vos 3 zones à vos adresses 10.G.x ; vagrant destroy -f && vagrant up le rejoue sans retouche. |
| Les 3 zones existent | Chaque zone sur sa patte, chaque hôte à l’IP de votre plan. |
| Les invariants tiennent | Balayage bash « après » (E4) : seuls les flux autorisés répondent. |
| Chaque VM est validée | check-vm.sh passe sur chaque VM ; la fiche a été partagée au groupe. |
| La matrice est construite, pas récitée | Justifications métier, pas de « any → any », l’ordre des règles est assumé. |
| Le refus est une donnée | Les block log sont visibles dans le Live View. |
| La photo avant/après existe | Les deux balayages rendus, côte à côte. |
Deux groupes peuvent rendre deux matrices différentes et réussir tous les deux. Ce qui est noté : les invariants tiennent, et vous savez dire pourquoi chaque ligne existe.