TP2 — Services & identité : l'AD, Nextcloud et la supervision
1. Contexte — la matrice rencontre la réalité
Section intitulée « 1. Contexte — la matrice rencontre la réalité »Au TP1, vous avez écrit la matrice avant les services — des témoins nc en tenaient la place. Aujourd’hui, les vrais services arrivent, et le contrat s’inverse : chaque service doit rentrer dans la matrice, ou la faire amender en justifiant l’amendement. C’est la gestion de changement d’une vraie infrastructure : rien ne s’ouvre « parce que ça ne marche pas sinon ».
Et le service central du jour est celui qui met toutes les matrices à l’épreuve : l’annuaire. Un Active Directory ne parle pas qu’en LDAP — DNS, Kerberos, SMB… — c’est le service qui fait exploser les matrices trop simples. Vous allez le monter vous-mêmes, et découvrir ligne à ligne ce qu’il exige.
2. Palier E6 : l’annuaire, un AD monté par vous
Section intitulée « 2. Palier E6 : l’annuaire, un AD monté par vous »Créez la VM à la main dans VirtualBox, comme OPNsense : c’est une appliance qui s’installe, pas une box à télécharger.
| Paramètre | Valeur |
|---|---|
| VM | TAAF-AD-001, 4 Go de RAM, 2 vCPU, ~40 Go de disque |
| Réseau | une seule carte, pontée sur le port access du switch (VLAN de z-services, poste du Membre C), IP statique de votre plan (ex. 10.G.10.10) |
| OS | Windows Server (ISO d’évaluation 180 jours), édition Desktop Experience |
Ce que vous devez obtenir, dans l’ordre que vous jugerez bon :
- une machine nommée
TAAF-AD-001, en IP statique, avant toute promotion ; - un domaine propre à votre groupe, par exemple
base-g<G>.taaf, distinct de celui du groupe voisin (au TP3, deux domaines identiques ne cohabitent pas) ; - le DNS de ce domaine porté par l’AD lui-même ;
- trois comptes aux rôles distincts : un utilisateur standard, un compte de service pour Nextcloud (jamais un compte d’administration), un administrateur nommé. Ce qui ne sert pas est désactivé ;
- depuis les autres zones, la résolution de votre domaine passe par OPNsense, qui sait vers qui l’envoyer ; le DNS général du reste du SI ne change pas.
Indice : par où chercher
- Sous Windows Server, un annuaire est un rôle qui s’installe, puis une promotion en contrôleur de domaine ; une « nouvelle forêt » est le point de départ quand rien n’existe. Le DNS s’installe avec la promotion.
- Côté OPNsense, le résolveur (Unbound) sait déléguer un domaine précis à un autre serveur DNS sans changer le reste : cherchez « forwarding » par domaine dans ses réglages.
- Le dépôt
serverfournit dansservices/ad/des scripts PowerShell de création d’objets, pas la promotion : lisez-les pour comprendre ce qu’ils attendent avant de les lancer.
Preuve E6 : depuis z-front, la résolution DNS du domaine répond via la patte OPNsense ; un ldapsearch (ou Test-ComputerSecureChannel depuis une machine jointe) réussit sur 389 ; et un port AD non déclaré dans la matrice tombe en filtered.
3. Palier E7 : les services, PostgreSQL et Nextcloud sur l’AD
Section intitulée « 3. Palier E7 : les services, PostgreSQL et Nextcloud sur l’AD »Étendez votre Vagrantfile : le provisioning de TAAF-DB-001 installe PostgreSQL, celui de TAAF-WEB-001 installe Caddy et Nextcloud (conteneurs bienvenus : un docker compose versionné est du code parfaitement acceptable).
Ce que vous devez obtenir :
- PostgreSQL avec une base dédiée à Nextcloud, un rôle dédié, et une écoute restreinte : il ne répond qu’à qui en a besoin ;
- Nextcloud dans
z-front, sa base dansz-services: le flux5432de votre matrice devient réel, à travers OPNsense ; - Nextcloud authentifie sur l’AD : un utilisateur du domaine se connecte sans compte local, et Nextcloud lit l’annuaire avec le compte de service, jamais l’administrateur ;
- le provisioning est idempotent : deux passages, même résultat.
Indice : par où chercher
- PostgreSQL n’écoute que sur la boucle locale par défaut, et refuse les clients qu’il ne connaît pas : deux fichiers de configuration sont en jeu, l’un pour l’adresse d’écoute, l’autre pour qui a le droit de se connecter d’où.
- Nextcloud a une application dédiée à l’authentification sur un annuaire LDAP ; elle demande un compte pour lire l’annuaire et une base de recherche.
- Le dépôt
serverfournit dansservices/nextcloud/etservices/postgresql/des briques à compléter : les adresses, les noms et les secrets sont les vôtres, et rien de ce que vous y écrivez ne se commite.
Preuve E7 : un login Nextcloud avec un compte du domaine réussit ; le compte de service LDAP n’a que les droits de lecture nécessaires ; le balayage depuis z-front ne montre que les flux de la matrice.
4. Palier E8 : la supervision, construire la chaîne, pas l’opérer
Section intitulée « 4. Palier E8 : la supervision, construire la chaîne, pas l’opérer »Vous ne faites pas de détection dans ce module. Mais une architecture qui n’a pas prévu son observabilité ne pourra jamais l’accueillir. Vous construisez la chaîne :
- sur
TAAF-MON-001(z-soc) : Loki (ingestion) et Grafana ; - chaque machine Linux pousse ses journaux système vers Loki (les journaux Windows de l’AD : bonus, exporter les événements de sécurité vaut des points, pas des excuses) ;
- OPNsense pousse aussi ses journaux de pare-feu, vos refus
block log; - dans Grafana, consulté depuis mgmt et jamais depuis les zones : un tableau de bord minimal, les refus du pare-feu par zone source.
L’invariant du TP1 s’applique à la lettre : tout pousse vers le SOC, rien n’en sort. Si votre configuration a besoin d’un flux SOC → zone, c’est elle qui a tort.
Indice : par où chercher
- Alloy est l’agent : il lit des fichiers ou le journal système et écrit vers Loki en HTTP. C’est lui qui initie, pas Loki.
- OPNsense sait envoyer ses journaux en syslog vers une cible distante ; Loki, lui, ne parle pas syslog. Quelque chose doit écouter le syslog dans
z-socet le remettre à Loki : Alloy sait le faire. - Le dépôt
serverfournit dansservices/supervision/de quoi lancer Loki et Grafana ; la configuration de collecte est à écrire.
Preuve E8 : une requête LogQL montre un refus que vous venez de provoquer (un balayage depuis z-front, par exemple) ; et depuis z-front, l’ingestion Loki est open mais Grafana est filtered : Grafana ne se consulte pas depuis le SI.
5. Le rapport : chapitre TP2
Section intitulée « 5. Le rapport : chapitre TP2 »Le Vagrantfile étendu et le config.xml à jour vivent dans votre dépôt Git : c’est votre outil, pas le livrable. Ce qui est corrigé, c’est le chapitre TP2 de votre rapport de réalisation. Les preuves à coller, chacune légendée, hostname et date lisibles :
- L’AD en service : capture du gestionnaire de serveur ou de
Get-ADDomain: nom du domaine,TAAF-AD-001contrôleur ; et la liste de vos trois comptes avec leur rôle (aucun mot de passe visible). - Le DNS porté par l’AD : une résolution du domaine depuis
z-front, qui passe par la patte OPNsense (forward conditionnel). - Nextcloud authentifié sur l’AD : capture d’une session Nextcloud ouverte avec un compte du domaine, et la configuration du backend LDAP montrant le compte de service (mot de passe masqué).
- La matrice amendée : tableau dans le rapport : chaque flux ajouté depuis le TP1 daté et justifié, dette LDAP en clair incluse.
- Le balayage depuis
z-front: après services : seuls les flux de la matrice répondent ;3100ouvert et3000filtré versTAAF-MON-001. - Un refus en LogQL : capture Grafana (consulté depuis
mgmt) : la requête et une ligne de résultat horodatée, provoquée par vous. - L’idempotence : les dernières lignes de deux
vagrant provisionsuccessifs : pas d’erreur, pas de changement au second. - La procédure AD : en une demi-page : les étapes de promotion telles que vous les avez faites, ce qui n’a pas marché du premier coup.
6. Les dix questions
Section intitulée « 6. Les dix questions »De la plus facile à la plus difficile. Chaque réponse cite une valeur relevée dans vos captures. Barème : le rapport.
● Facile : relever, nommer, constater
- Q1 : Relevez dans vos captures le nom de votre domaine AD, l’IP de
TAAF-AD-001et vos trois comptes avec le rôle de chacun. - Q2 : Quelle requête LogQL avez-vous exécutée pour voir un refus du pare-feu ? Recopiez-la avec une ligne de résultat et son horodatage.
- Q3 : Dans votre balayage depuis
z-frontversTAAF-MON-001, quel est l’état de3100et de3000? Recopiez la sortie.
●● Moyen : expliquer, justifier, relier
- Q4 : Listez les flux que vous avez ajoutés à la matrice depuis le TP1 (source, destination, port, date) et la justification de chacun. Y en a-t-il un que vous avez d’abord ouvert « pour que ça marche » avant de le justifier ?
- Q5 : Pourquoi Nextcloud se lie-t-il à l’AD avec un compte de service et non avec l’administrateur ? Que peut faire un attaquant qui a lu la configuration LDAP de Nextcloud, dans chacun des deux cas ?
- Q6 : Décrivez le forward conditionnel d’Unbound que vous avez configuré : quelle zone DNS part vers l’AD, et pourquoi le reste du SI ne doit pas utiliser l’AD comme résolveur général.
- Q7 : « Tout pousse vers le SOC, rien n’en sort. » Montrez avec vos règles comment Alloy et OPNsense poussent vers Loki sans qu’aucune règle SOC → zone existe. Qu’aurait exigé un collecteur qui tire les journaux, et que casse-t-il ?
●●● Difficile : arbitrer, prouver, généraliser
- Q8 : Le LDAP en clair sur
389est une dette assumée. Décrivez ce qu’un attaquant capable d’écouter le trunk voit passer lors d’un login Nextcloud, ce que LDAPS avec votre CA interne y change, et ce que ce changement coûte à l’exploitation (émission, renouvellement, confiance dans la CA). - Q9 : Prouvez l’idempotence avec votre capture des deux
vagrant provision. Puis expliquez une étape de votre provisioning qui n’était pas idempotente au départ, ou qui aurait pu ne pas l’être, et comment vous l’avez rendue telle. - Q10 : Un AD joignable en
anydepuis tout le SI est « la première marche de la plupart des compromissions réelles ». Avec votre matrice, tracez le chemin d’un attaquant depuisTAAF-WEB-001vers un compte administrateur du domaine : quelles lignes l’arrêtent, laquelle manquerait dans une matrice naïve, et quel événement votre Loki verrait passer.
7. Critères de réussite
Section intitulée « 7. Critères de réussite »| Critère | Ce qu’on vérifie |
|---|---|
| L’AD est monté et raisonné | Domaine propre au groupe, DNS porté, 3 comptes typés, ports ouverts = ports justifiés. |
| Nextcloud vit dans l’architecture | Servi par Caddy en z-front, base en z-services, authentification par l’AD via le compte de service. |
| La matrice a survécu aux services | Les amendements sont datés et justifiés ; rien d’ouvert « pour que ça marche ». |
| La chaîne de supervision tient l’invariant | Les refus sont requêtables en LogQL ; rien ne sort de z-soc ; Grafana injoignable depuis les zones. |
| Le code est idempotent | vagrant provision deux fois de suite : ni erreur ni changement au second passage. |