2026-07-07 03:08:09 -04:00
|
|
|
---
|
|
|
|
|
# Flux réseau de Forgejo (forge Git). Voir docs/flux-conception.md.
|
|
|
|
|
flux:
|
site : un SITE a bien un plan — et huit defauts que lui seul pouvait reveler
J'ai repete toute la journee qu'un SITE n'est pas un plan. C'etait faux : j'en
reconstruisais un morceau par morceau dans underlay.yml sans le nommer. Ce qui est vrai,
c'est qu'un site ne DERIVE pas — il declare ses adresses parce qu'il EST le terrain — et
ne passe donc pas par `instancier`. Mais ne pas deriver n'est pas ne pas avoir de plan.
SITE-Chezlepro/plan/{10-intrants,serveurs,applications}.yml ; underlay.yml ne garde que
la fabric. Ce qui est MESURE d'un cote, ce qui est VOULU de l'autre. Les groupes viennent
du registre des applications, les gardes ont suivi le plan (4 controles negatifs).
Huit defauts, tous invisibles chez un tenant parce qu'il a toujours tout :
- client_pki codait `infra-pki-01` EN DUR — vrai par coincidence de nomenclature ;
- aucun moyen pour un service non-root de lire la cle (Forgejo tourne en `git`) ;
- le certificat, PUBLIC par nature, restait en 0600 ;
- l'unite Forgejo n'avait pas d'ExecReload : un cert renouvele aurait ete servi perime ;
- le role ne savait pas servir TLS lui-meme (il y avait toujours un edge) ;
- le cert ne couvrait pas le nom de SERVICE, faute d'`expose:` ;
- les registres se chargeaient en tout-ou-rien : sans domaines.yml, plancher vide ;
- le flux declarait 3000 en dur.
Le message accusait presque toujours autre chose : le DNS quand c'etait un nom faux, une
permission de fichier quand c'etait un port privilegie, rien du tout quand le plancher
s'ecrivait vide.
ROOT_URL est gravee dans les URL de clonage : la forge sert desormais sur 443, avec
CAP_NET_BIND_SERVICE, et son URL n'a plus de port.
Verifie depuis le reseau : Verify return code 0, https://forge.genese.internal/ -> 200.
42 preuves vertes, flux coherents (34 roles, 92 flux).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:15:34 -04:00
|
|
|
# LE PORT DE LA FORGE N'EST PAS LE MÊME PARTOUT (2026-08-25).
|
|
|
|
|
#
|
|
|
|
|
# `3000` est le port qu'elle écoute DERRIÈRE un edge, en clair : le nginx termine le TLS
|
|
|
|
|
# et lui parle sur la boucle locale. C'était vrai de toutes les forges tant qu'il y avait
|
|
|
|
|
# toujours un edge devant.
|
|
|
|
|
#
|
|
|
|
|
# La forge du SITE n'en a pas — le site n'a pas d'edge — et sert son propre TLS sur le
|
|
|
|
|
# port du schéma, `443`. Écrire `3000` en dur ici serait donc devenu faux pour elle,
|
|
|
|
|
# sans que rien ne le signale : ce flux ne traverse pas la frontière, donc aucun devis
|
|
|
|
|
# ne s'en plaint. Une déclaration fausse qui ne gêne personne est une déclaration qui
|
|
|
|
|
# dérive jusqu'au jour où quelqu'un s'y fie.
|
|
|
|
|
#
|
|
|
|
|
# `derive` dit la vérité : le port vient de `serveur_forgejo_http_port`, et
|
|
|
|
|
# `verifier_ports` sait qu'il n'y a pas d'écoute fixe à comparer.
|
|
|
|
|
# DEUX ENTREES, PARCE QUE CE SONT DEUX SITUATIONS — pas une ligne qui dirait « ça
|
|
|
|
|
# dépend ». Le vocabulaire des flux n'a pas de mot pour l'indécision, et c'est tant
|
|
|
|
|
# mieux : un flux se lit pour savoir ce qui circule et comment. Une valeur ambiguë
|
|
|
|
|
# rendrait l'audit impossible sans aller lire le déploiement.
|
2026-07-07 03:08:09 -04:00
|
|
|
- sens: ingress
|
|
|
|
|
port: 3000
|
|
|
|
|
protocole: tcp
|
|
|
|
|
pair: edge
|
|
|
|
|
chiffrement: clair
|
site : un SITE a bien un plan — et huit defauts que lui seul pouvait reveler
J'ai repete toute la journee qu'un SITE n'est pas un plan. C'etait faux : j'en
reconstruisais un morceau par morceau dans underlay.yml sans le nommer. Ce qui est vrai,
c'est qu'un site ne DERIVE pas — il declare ses adresses parce qu'il EST le terrain — et
ne passe donc pas par `instancier`. Mais ne pas deriver n'est pas ne pas avoir de plan.
SITE-Chezlepro/plan/{10-intrants,serveurs,applications}.yml ; underlay.yml ne garde que
la fabric. Ce qui est MESURE d'un cote, ce qui est VOULU de l'autre. Les groupes viennent
du registre des applications, les gardes ont suivi le plan (4 controles negatifs).
Huit defauts, tous invisibles chez un tenant parce qu'il a toujours tout :
- client_pki codait `infra-pki-01` EN DUR — vrai par coincidence de nomenclature ;
- aucun moyen pour un service non-root de lire la cle (Forgejo tourne en `git`) ;
- le certificat, PUBLIC par nature, restait en 0600 ;
- l'unite Forgejo n'avait pas d'ExecReload : un cert renouvele aurait ete servi perime ;
- le role ne savait pas servir TLS lui-meme (il y avait toujours un edge) ;
- le cert ne couvrait pas le nom de SERVICE, faute d'`expose:` ;
- les registres se chargeaient en tout-ou-rien : sans domaines.yml, plancher vide ;
- le flux declarait 3000 en dur.
Le message accusait presque toujours autre chose : le DNS quand c'etait un nom faux, une
permission de fichier quand c'etait un port privilegie, rien du tout quand le plancher
s'ecrivait vide.
ROOT_URL est gravee dans les URL de clonage : la forge sert desormais sur 443, avec
CAP_NET_BIND_SERVICE, et son URL n'a plus de port.
Verifie depuis le reseau : Verify return code 0, https://forge.genese.internal/ -> 200.
42 preuves vertes, flux coherents (34 roles, 92 flux).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:15:34 -04:00
|
|
|
raison: >-
|
|
|
|
|
Interface web + Git HTTP derrière un edge : le nginx termine le TLS et parle en
|
|
|
|
|
clair à la forge. C'est le cas de tout tenant.
|
|
|
|
|
- sens: ingress
|
|
|
|
|
port: derive
|
|
|
|
|
protocole: tcp
|
le site reconstruit depuis zero : 7/7, 0 echec, et seize corrections
SITE-Chezlepro n avait jamais ete rase. La limite qu on repetait partout —
l infrastructure d accueil n a jamais ete reconstruite depuis zero — se
lisait comme de la prudence. C etait seize defauts que rien d autre n aurait
pu reveler.
Un locataire naît dans un monde deja peuple : le site lui fournit paquets,
noms, genome, heure et depot. Un site n a personne au-dessus, sauf sa
frontiere. Onze des seize murs viennent de la.
DEUX CAPACITES QUI N EXISTAIENT PAS. make site-raser — rien ne detruisait les
machines du site, donc la limite etait un trou d outillage. make
forge-amorcer — la forge naît vide et le runner y clone ; l amorcage part du
poste, seul endroit qui detienne alors le genome.
TROIS GARDES QUI VERIFIAIENT LA FORME. La plus couteuse des familles : elles
donnent l apparence d une verification. Le resolveur comparait des adresses
au lieu de mesurer si la resolution aboutit, et protegeait ainsi l etat
casse. L administration etait reconnue a son port. Un flux a deux paires
n obtenait qu une branche.
UN ECART DE SECURITE. Le PostgreSQL du site servait le certificat auto-signe
de Debian, sans reseaux autorises ni hostssl — invisible tant qu aucun client
n exigeait la verification. Le defaut n a pas casse la construction : la
construction a revele le defaut.
UN ACCES ACCIDENTEL. Celui de l exploitant tenait au chevauchement d
adressage que le renumerotage a supprime. Separer les index n a pas cause le
probleme, il a retire le hasard qui le masquait.
La sequence du premier jour est ecrite : runbooks §9, avec les seize murs et
ce que chacun enseigne.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-12 19:08:31 -04:00
|
|
|
# `admin` EN PLUS DE `flotte` (2026-09-12). Sans edge devant elle, la forge du SITE
|
|
|
|
|
# n'etait joignable que par les machines de l'ecosysteme — jamais par l'exploitant.
|
|
|
|
|
# Ca passait inapercu tant que son plan d'administration vivait dans le supernet d'un
|
|
|
|
|
# locataire, que les expositions acceptent deja. Une fois le site sorti de ce
|
|
|
|
|
# supernet, l'exploitant ne pouvait plus ni amorcer sa forge ni y pousser le genome.
|
|
|
|
|
#
|
|
|
|
|
# `admin` se resout depuis `nftables_admin_ssh` : un ecosysteme qui ne declare aucun
|
|
|
|
|
# administrateur n'emet aucune regle, et c'est le comportement voulu — une source
|
|
|
|
|
# vide ouvrirait le port a tous.
|
|
|
|
|
pair: [flotte, admin]
|
site : un SITE a bien un plan — et huit defauts que lui seul pouvait reveler
J'ai repete toute la journee qu'un SITE n'est pas un plan. C'etait faux : j'en
reconstruisais un morceau par morceau dans underlay.yml sans le nommer. Ce qui est vrai,
c'est qu'un site ne DERIVE pas — il declare ses adresses parce qu'il EST le terrain — et
ne passe donc pas par `instancier`. Mais ne pas deriver n'est pas ne pas avoir de plan.
SITE-Chezlepro/plan/{10-intrants,serveurs,applications}.yml ; underlay.yml ne garde que
la fabric. Ce qui est MESURE d'un cote, ce qui est VOULU de l'autre. Les groupes viennent
du registre des applications, les gardes ont suivi le plan (4 controles negatifs).
Huit defauts, tous invisibles chez un tenant parce qu'il a toujours tout :
- client_pki codait `infra-pki-01` EN DUR — vrai par coincidence de nomenclature ;
- aucun moyen pour un service non-root de lire la cle (Forgejo tourne en `git`) ;
- le certificat, PUBLIC par nature, restait en 0600 ;
- l'unite Forgejo n'avait pas d'ExecReload : un cert renouvele aurait ete servi perime ;
- le role ne savait pas servir TLS lui-meme (il y avait toujours un edge) ;
- le cert ne couvrait pas le nom de SERVICE, faute d'`expose:` ;
- les registres se chargeaient en tout-ou-rien : sans domaines.yml, plancher vide ;
- le flux declarait 3000 en dur.
Le message accusait presque toujours autre chose : le DNS quand c'etait un nom faux, une
permission de fichier quand c'etait un port privilegie, rien du tout quand le plancher
s'ecrivait vide.
ROOT_URL est gravee dans les URL de clonage : la forge sert desormais sur 443, avec
CAP_NET_BIND_SERVICE, et son URL n'a plus de port.
Verifie depuis le reseau : Verify return code 0, https://forge.genese.internal/ -> 200.
42 preuves vertes, flux coherents (34 roles, 92 flux).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 13:15:34 -04:00
|
|
|
chiffrement: tls
|
|
|
|
|
raison: >-
|
|
|
|
|
Sans edge devant elle — la forge du SITE — elle sert son propre TLS sur le port du
|
|
|
|
|
schéma (443), avec le certificat de la machine. `derive` parce que le port vient de
|
|
|
|
|
`serveur_forgejo_http_port` : écrire 3000 en dur ici serait faux pour elle, et rien
|
|
|
|
|
ne le signalerait puisque ce flux ne traverse pas la frontière.
|
2026-07-07 03:08:09 -04:00
|
|
|
- sens: egress
|
|
|
|
|
port: 5432
|
|
|
|
|
protocole: tcp
|
|
|
|
|
pair: serveur_postgresql
|
|
|
|
|
chiffrement: tls-requis
|
|
|
|
|
raison: "Base de données Forgejo (verify-full)."
|
|
|
|
|
- sens: egress
|
|
|
|
|
port: 25
|
|
|
|
|
protocole: tcp
|
|
|
|
|
pair: serveur_postfix
|
|
|
|
|
chiffrement: starttls
|
|
|
|
|
raison: "Notifications courriel (relais via le MTA Postfix)."
|
|
|
|
|
- sens: egress
|
|
|
|
|
port: 443
|
|
|
|
|
protocole: tcp
|
|
|
|
|
pair: edge
|
|
|
|
|
chiffrement: tls-requis
|
|
|
|
|
raison: "Découverte OIDC et jetons auprès de Keycloak (via son FQDN publié à l'edge)."
|