Aller au contenu principal

ADR-0158 : Provenance SLSA, portes G6/G9, contenus de pack, kill switch et import hors ligne de la marketplace

Contexte​

La référence d'architecture demande pour la marketplace (B7.4, B8.1, B8.3, B8.4, B8.5, B10.3, G6, G9, G11) : une provenance vérifiable de chaque version, des portes de confidentialité et de résilience, l'identité du paquet (espace de noms, catégorie, éditeur, nom affiché), l'installation de tous les contenus d'un pack (règles, modèles OpenFGA, serveurs MCP, workflows, modèles RAG, tableaux de bord, alertes, migrations), un test de connexion MCP réel, une configuration validée, une suspension immédiate d'un pack ou d'une de ses capacités, la supervision d'une installation et un dépôt local pour les sites isolés.

Avant cette décision, la publication vérifiait dix portes (schéma, signature, SBOM, vulnérabilités, tests, évaluations, licence, permissions, docs, secrets) ; les règles, modèles OpenFGA, workflows, modèles RAG, tableaux de bord, alertes et serveurs MCP restaient dans l'archive sans registre ; aucune route ne suspendait un pack installé.

Décision​

  1. Provenance : le corps de publication porte provenance: {statement, signature}, un in-toto Statement v1 au prédicat SLSA provenance v1 dont le sujet est l'empreinte de l'archive et dont les sous-produits lient le SBOM et les rapports. enterprise-ai plugin publish --key le produit et le signe avec la clé de l'éditeur ; la porte provenance revérifie l'empreinte, le sujet, le SBOM et la signature avec la clé d'éditeur enregistrée. eai.marketplace_versions.provenance et provenance_status (V190) la gardent.
  2. Six portes de plus : provenance, privacy (G6 : détection et masquage des données personnelles, DLP, résidence, externalExportDefault: deny), security (artefact signé, bac à sable, autorisation dynamique, audit), approvals (requiredFor couvre install, upgrade, sensitivePermissions, production, resume), configuration (configSchema JSON Schema), resilience (G9 : délai borné, effets de bord idempotents avec clé, workflows qui s'arrêtent ou compensent). Le schéma plugin-manifest gagne namespace, category, publisher, displayName, security, testFlags, configSchema et approvals.requiredFor, copiés à l'identique dans les quatre SDK.
  3. Contenus sans registre propre : eai.marketplace_assets (V191, RLS forcée) garde par installation chaque règle, modèle OpenFGA, serveur MCP, workflow, modèle RAG, tableau de bord, alerte et migration, avec son empreinte et son état (active, blocked, pending_endpoint, suspended). Un serveur MCP dont l'adresse est donnée en configuration est enregistré dans la passerelle MCP (eai.mcp_servers) et testé par un vrai initialize puis la liste des outils ; un modèle RAG crée sa base de connaissances.
  4. La configuration d'une installation est validée contre le configSchema du pack (config_invalid).
  5. Kill switch : POST /v1/marketplace/installations/{id}/status suspend tout de suite une installation ou certaines de ses permissions (outils bloqués, agents suspendus, serveurs MCP désactivés, contenus suspendus) ; POST /v1/marketplace/packages/{name}/status suspend d'un coup toutes les installations d'un paquet et refuse installations, mises à niveau, publications et mises en production. La reprise passe toujours par une approbation de deux autres personnes.
  6. GET /v1/marketplace/installations/{id}/supervision agrège activité, qualité, coûts et incidents à partir des enregistrements de la plateforme.
  7. Import hors ligne : le corps --body-out, l'artefact et sa signature cosign voyagent dans une disposition OCI (oras), sont poussés dans le registre local puis importés (client.marketplace.import_publication). Toutes les portes sont revérifiées hors ligne.

Les cœurs restent sous MIT ou Apache-2.0 ; in-toto, SLSA, cosign, oras et zot sont des projets open source sous Apache-2.0.

Conséquences​

  • Un pack sans provenance signée, sans configSchema ou qui désactive une exigence de sécurité n'est plus publiable.
  • Les packs existants (packs/hr, packs/finance, packs/templates/*) portent les nouveaux champs.
  • Les migrations V190 et V191 étendent les tables marketplace (V130) sans les recréer.

Preuves​

services/control-plane/tests/test_marketplace_governance.py (portes pures, provenance enregistrée et falsifiée, contenus installés, configuration refusée, connexion MCP réelle, suspension et reprise à quatre yeux, kill switch du paquet, isolation, supervision, import par disposition OCI dans un second registre zot), services/control-plane/tests/test_marketplace.py, sdks/python/tests/test_governance_clients.py, sdks/go/endpoints_v13_test.go.