Aller au contenu

Module XIX — l'API propre et la surface manage-as-code

Le module XIX n’est pas une fonctionnalité greffée sur le moteur — il est la surface du moteur. Tout autre module atteint le monde extérieur via la même API first-party, et l’interface web est une couche de présentation sur ce contrat exact, pas un contrat parallèle. Cette page est la référence de ce que cette surface expose aujourd’hui et de la façon de gérer le control plane sous forme de code, avec ses frontières réelles.

Le moteur parle une seule API REST sous /v1 (routeur chi, http.Server durci) et un miroir gRPC focalisé et gelé de celle-ci (olivares.api.v1 : info serveur, lecture/création d’agent, vérification d’audit, plus le service de santé standard). gRPC est un sous-ensemble délibéré, pas une parité complète — les nouveaux endpoints atterrissent d’abord en REST. Les deux câbles exécutent la même chaîne authenticate → resolve-tenant → authorize et mappent les erreurs de façon identique, de sorte qu’un not-found est indiscernable d’une ressource inter-tenant sur l’un ou l’autre fil.

La surface REST est publiée sous forme de contrat OpenAPI 3.1 rendu sur la référence de l’API directement depuis le schéma rédigé du produit. Ce document est le contrat de référence de la surface stable du cœur ; les routes de module sont publiées séparément dans un document bêta — la référence des routes de module (voir les limites honnêtes ci-dessous). La même fonctionnalité est aussi pilotable depuis le terminal — voir la référence CLI — car la CLI est le moteur, pas un wrapper par-dessus.

L’authentification se fait par jetons bearer opaques côté serveur, pas par JWT. Un jeton est préfixé par finalité (session vs. clé d’API) ; le serveur persiste uniquement un sélecteur public et un SHA-256 du secret, et compare le secret en temps constant. Les conséquences qui comptent pour un workflow manage-as-code : les jetons sont immédiatement révocables, ne portent aucune revendication ni secret, et n’ajoutent aucune surface d’attaque de crypto-parsing. Un jeton d’API est lié à un (tenant, role) ou est un identifiant système non lié ; une requête dont l’en-tête de tenant est en désaccord avec un jeton lié est refusée, jamais silencieusement élargie.

Le provider terraform-provider-olivares est un module Go séparé et un pur client REST — il n’importe jamais le noyau du moteur ni le SDK des connecteurs, gardant le vaste arbre de dépendances du provider hors de la chaîne d’approvisionnement du noyau. Configuré avec un endpoint, un jeton d’API sensible et un tenant optionnel, il gère un ensemble délibérément réduit et déclaré d’objets :

KindNomGère
resourceolivares_agentla définition catalogue d’un agent (CRUD complet + import)
resourceolivares_policyune déclaration de policy de gouvernance
resourceolivares_agent_identity_bindingla liaison d’un agent à une identité non humaine
resourceolivares_deploymentune définition de déploiement (état désiré, déclaratif)
data sourceolivares_policies / olivares_identitiesdes vues en lecture seule du roster gouverné
data sourceolivares_access_edgesla carte d’accès R/RW et son drift permis-vs-observé
data sourceolivares_deployment / olivares_server_infoune définition de déploiement ; les métadonnées du moteur

Ce sont les seules resources et data sources que le provider sert. Déclarer un olivares_deployment enregistre l’état désiré dans le control plane — cela ne touche pas l’infrastructure ; le chemin apply appartient au module VII et est une jointure deny-closed.

Le moteur de service est sécurisé par défaut : TLS est activé (un certificat auto-signé est généré au premier démarrage si aucun n’est fourni), le bind est par défaut sur localhost, et écouter localement n’est pas une exemption d’autorisation. Une installation fraîche n’a aucun identifiant — elle génère une clé de configuration unique sur stdout et refuse chaque endpoint protégé jusqu’à ce que le premier administrateur soit créé. L’audit est en ajout seul et à chaînage de hachage, avec des points de contrôle signés Ed25519 qui rendent la réécriture de l’historique avant un point de contrôle cryptographiquement détectable.

La plateforme d’événements (la moitié sortante du module XIX)

Section intitulée « La plateforme d’événements (la moitié sortante du module XIX) »

Depuis la livraison de la plateforme d’événements (modules/eventing), la surface du module XIX inclut aussi des abonnements aux événements en self-service par tenant : des abonnements typés sur le catalogue d’événements du bus (edge.observed, cost.sampled, finding.reported, audit.recorded, …) avec une diffusion durable at-least-once — réessais avec backoff, une file de lettres mortes (dead-letter queue), et un rejeu depuis un curseur — vers un webhook signé HMAC ou un sink SIEM. Le module notify (XV) reste le routeur d’alertes vers des destinations provisionnées par l’opérateur ; eventing est la plateforme orientée intégrateur. Un export de posture en lecture seule l’accompagnant (modules/posture-export) permet à une tour de contrôle d’interroger la posture de vérité de terrain du produit — graphe d’accès, drift, inventaire, findings — uniquement sous forme de refs/hachages/relations, l’export lui-même étant audité.