Some checks failed
verifier / verifier (push) Has been cancelled
La revision a commence par un balayage par motifs — chemins morts, cibles make absentes, comptes derives. Il a trouve une trentaine d ecarts et rate presque tout le reste : un motif ne voit que ce qui s exprime en motif. make hote-planifier en est l exemple. La cible EXISTE, donc le controle passait au vert. C est une cible depreciee qui refuse et sort en 2, recommandee par AGENTS.md, et qui contredit la REGLE D OR du meme fichier trois ecrans plus haut. Il fallait lire pour la voir. 74 documents lus un par un. 66 corriges, 8 exacts. CE QUI ETAIT FRANCHEMENT FAUX AGENTS.md, la source d autorite, annoncait la flotte pas encore executee contre des VM reelles. Elle a ete rasee et remontee depuis zero trois fois. ecosysteme-chezlepro.md, le document montre a un client, portait la meme phrase : il se sous-vendait gravement. courriel-conception.md s ouvrait sur aucun role n est encore ecrit, au-dessus de son propre paragraphe 1 qui les nomme. autorisation.md se terminait sur rien n est construit alors qu il rapporte des mesures datees du role en fonctionnement. hebergeur-exploitation.md disait rien n est fait d un depot qui existe. filiation-emancipation.md se contredisait a deux ecrans de distance. DES MODELES DECRITS D APRES UN MONDE ANTERIEUR Le resolveur : cinq documents decrivaient un Unbound par VM en opt-in, trois le donnaient en exemple d integration FACULTATIVE — il est universel depuis le 2026-08-24. L adressage de nomenclature-vm.md : reseau unique, VLAN 11-15, VMID a cinq chiffres. Le nommage SDN de sdn-evpn.md contre le code : c est le wiki qui avait raison. CE QUI CASSE AU PREMIER ESSAI Le nom du gabarit dore etait faux a quatre endroits, dont la procedure qui le FABRIQUE et le critere R2 de l epreuve d operateur independant. preparer-un-site-hebergeur.md avertissait qu une VM faite a la main serait detruite : raser derive du plan, il ne la detruira jamais — le risque est l inverse. Un mot de passe d essai en clair dans un depot public. DEUX PREUVES ETENDUES, ET UNE QUI SE TROMPAIT ELLE-MEME P57 couvre les groupes : elle a signale aussitot 29 groupes annonces au-dessus d un tableau qui en cite 40. P29 confronte le tableau de authentification.md aux declarations reelles : 12 annonces, 21 reels. Et P57 imposait un chiffre faux — 56 preuves alors que le depot en porte 57, la conditionnelle vivant hors de tout comptage. Un garde-fou qui fait respecter une erreur ajoute l assurance a l erreur. CE QUI RESTE, ET QU AUCUNE PREUVE NE TIENT Deux comptes trouves a la main. Et une lacune reelle : rien ne garde les meta/acces.yml — ni qu un service web-sso en porte un, ni que le groupe qu il nomme existe. P29 tient les positions d authentification, personne ne tient les habilitations. make prouver : CONFORME, 56 OK, 0 echec, 1 saute. 0 lien mort. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
141 lines
5.3 KiB
Markdown
141 lines
5.3 KiB
Markdown
# DNS interne
|
|
|
|
> **Pour qui :** le **mainteneur** du DNS interne.
|
|
|
|
Le service DNS interne est la premiere capacite de plateforme.
|
|
|
|
> **Plancher de resolution independant du DNS.** Le socle (`hosts_statiques`, dans
|
|
> `serveur_debian`) genere `/etc/hosts` sur **chaque** VM depuis l'inventaire : tout
|
|
> l'ecosysteme se resout par nom **meme serveur DNS eteint** (et au bootstrap, avant
|
|
> que PowerDNS ne soit la). PowerDNS devient une **commodite** (zone, externe,
|
|
> dynamique), plus un point de defaillance.
|
|
|
|
## Trois couches, et une seule est optionnelle
|
|
|
|
> **Ce paragraphe decrivait le modele d'avant le 2026-08-24** — un Unbound *sur chaque VM*,
|
|
> en opt-in. Ce n'est plus le cas : `client_resolveur` **n'installe plus rien**, et son
|
|
> integration est **universelle**, pas elective.
|
|
|
|
```text
|
|
1. hosts_statiques le PLANCHER : /etc/hosts genere sur chaque VM depuis l'inventaire
|
|
-> l'ecosysteme se resout DNS eteint. Jamais optionnel.
|
|
2. serveur_powerdns l'AUTORITATIF de la zone souveraine (un par ecosysteme)
|
|
3. serveur_resolveur le RECURSIF : UN seul Unbound pour tout le tenant, qui recurse
|
|
depuis la racine et delegue la zone souveraine a PowerDNS
|
|
client_resolveur l'integration : ecrit /etc/resolv.conf pour designer ce resolveur
|
|
```
|
|
|
|
**`client_resolveur` n'installe plus de demon** (2026-08-24). Il en posait un par VM — N
|
|
demons identiques de ~21 Mo pour quelques centaines de requetes. Il ne fait plus qu'une
|
|
chose : **ecrire `/etc/resolv.conf`**. Son integration est marquee `universelle: true`, et
|
|
elle n'a **aucune exemption, pas meme l'hote qui porte le resolveur** : il se sert
|
|
lui-meme. L'ancien nom (`client_unbound`) mentait des lors qu'il n'installait plus Unbound.
|
|
|
|
**L'integration suit l'existence du service, elle ne se declare pas.** Aucun
|
|
`serveur_resolveur` au plan rend `client_resolveur_actif` faux et le role ne touche a rien :
|
|
l'ecosysteme garde la resolution d'amorcage de cloud-init. C'est un choix valide, pas une
|
|
panne.
|
|
|
|
## Groupes
|
|
|
|
```text
|
|
serveur_powerdns -> autoritatif interne (PowerDNS Authoritative)
|
|
serveur_resolveur -> LE recursif du tenant (Unbound), un seul
|
|
client_resolveur -> integration universelle : designe ce resolveur dans /etc/resolv.conf
|
|
```
|
|
|
|
## Zone initiale
|
|
|
|
La zone initiale est :
|
|
|
|
```text
|
|
exemple.internal
|
|
```
|
|
|
|
Elle est definie dans :
|
|
|
|
```text
|
|
instance/inventories/<inventaire>/group_vars/serveur_powerdns.yml
|
|
```
|
|
|
|
## Enregistrement automatique
|
|
|
|
Le role `serveur_powerdns` genere la zone a partir de l'inventaire.
|
|
|
|
Les hotes qui remplissent ces conditions sont ajoutes automatiquement :
|
|
|
|
```text
|
|
hote dans hotes_actifs
|
|
ansible_host defini
|
|
```
|
|
|
|
Exemple :
|
|
|
|
```text
|
|
web-frontal-01 ansible_host=10.0.2.31
|
|
-> web-frontal-01.exemple.internal A 10.0.2.31
|
|
```
|
|
|
|
Les enregistrements additionnels explicites sont dans `serveur_powerdns_records`.
|
|
|
|
## Backend PowerDNS
|
|
|
|
Le premier jalon utilise le backend BIND de PowerDNS.
|
|
|
|
Raison :
|
|
|
|
- pas de dependance prematuree a PostgreSQL ;
|
|
- zone lisible et generee par Ansible ;
|
|
- idempotence simple ;
|
|
- bon point de depart pour la supervision.
|
|
|
|
Quand `serveur_postgresql` sera stable, il sera possible de migrer vers un backend SQL si le besoin operationnel le justifie.
|
|
|
|
## La bascule de `/etc/resolv.conf` est protegee
|
|
|
|
Le role `client_resolveur` ne bascule `/etc/resolv.conf` qu'apres avoir verifie que le
|
|
resolveur repond **deja** — pour l'interne *et* pour l'Internet :
|
|
|
|
```yaml
|
|
client_resolveur_apply: true
|
|
client_resolveur_confirm: true
|
|
```
|
|
|
|
Sans ces deux variables, le role prépare Unbound mais ne modifie pas `/etc/resolv.conf`.
|
|
|
|
Cette protection est volontaire : une mauvaise configuration DNS peut couper la resolution
|
|
de noms. C'est la dependance la plus dangereuse du lot — basculer un hote sur un resolveur
|
|
qui n'est pas encore pret le rend **muet**, et le runner qui devrait reparer tombe avec les
|
|
autres. Le playbook de groupe applique donc l'hote qui *porte* le resolveur avant ceux qui
|
|
s'y adressent, et la preuve **P44** refuse tout ecart entre cette declaration et lui.
|
|
|
|
## Le piege qui a coute deux jours : la racine signee nie notre TLD
|
|
|
|
`internal.` n'est **pas delegue dans la racine**, qui est signee : elle rend donc une preuve
|
|
NXDOMAIN *validee* pour ce TLD. Or `harden-below-nxdomain` — **actif par defaut** dans
|
|
Unbound — tient ce « non » pour prouve et repond NXDOMAIN pour **tout** nom sous
|
|
`internal.` depuis son cache, **sans jamais interroger la `stub-zone`** declaree plus bas.
|
|
|
|
La delegation etait correcte. L'autoritatif repondait juste. Pas une requete ne lui
|
|
parvenait.
|
|
|
|
Ce qui declenche l'empoisonnement : n'importe quelle question sur un nom inexistant sous
|
|
`internal.` — y compris la zone d'**un autre ecosysteme**, que ce resolveur ne sert pas et
|
|
va donc chercher a la racine. Sur un resolveur partage, ca arrive en permanence.
|
|
|
|
Et la panne parait **intermittente** : au redemarrage le cache est vide, tout fonctionne, on
|
|
conclut que c'est regle. Le remede mesure (2026-09-02) est `harden-below-nxdomain: no` dans
|
|
`roles/serveur_resolveur/templates/setops.conf.j2` — **pas** `aggressive-nsec`, qui traite
|
|
un autre symptome.
|
|
|
|
## Surveillance a prevoir
|
|
|
|
Les premiers checks utiles :
|
|
|
|
- service `pdns` actif ;
|
|
- port UDP/TCP 53 disponible ;
|
|
- SOA de `exemple.internal` resoluble ;
|
|
- enregistrement `ns1.exemple.internal` resoluble ;
|
|
- enregistrements des hotes actifs presents ;
|
|
- serial de zone attendu ;
|
|
- latence de resolution.
|