Aller au contenu

Console d'administration

Les 36 points d'appel de la console, la permission et le rôle que chacun exige, ses 11 variables d'environnement, ses onglets, et ce que le profil de construction en retire.

Interne, peut changer sans préavis. Cette page décrit la surface d’administration de la passerelle. Contrairement au relais compatible Anthropic, elle n’est pas un contrat : ses chemins, ses noms de permissions et ses réglages peuvent changer d’une version à l’autre sans étape de dépréciation. Ce qui est publié ici l’est pour qu’un administrateur puisse exploiter la version qu’il a installée, pas pour qu’un programme s’y adosse.

La console est le seul endroit du produit où l’on déclare un fournisseur de modèles, un modèle et un point d’appel. Sans ces trois déclarations, une passerelle installée répond 404 à tout.

Chemins, noms de permissions, noms de rôles et noms de variables sont reproduits tels que le code les écrit. Les traduire ferait dire à cette page autre chose que ce que le lecteur a sous les yeux.

La console dépend du profil avec lequel elle a été construite. Le profil est un paramètre de construction, pas un réglage : un artefact ne sait pas lequel il porte et n’en change pas. Le profil fermé est celui qu’on obtient sans rien préciser, et il laisse de côté une partie de la surface : sur 36 points d’appel, 15 ne sont pas montés (ils répondent 404, et non 403), et 4 des 7 onglets sont absents du paquet livré. Une console à un seul onglet n’est pas une console mal configurée.

Qui entre dépend aussi du profil. En profil fermé, la console délègue l’authentification à l’annuaire d’entreprise du client et ne vérifie aucun mot de passe : sans annuaire configuré, personne n’entre. En profil hébergé, un couple identifiant / mot de passe partagé ouvre tout. Cet état est toléré pour un premier démarrage, et se retire une fois les rôles attribués.

Chaque point d’appel exige une permission nommée, et chaque permission est portée par un seul rôle. Ouvrir la console exige console:administrer-l-instance ; lire le journal des actes d’administration exige journal:lire, qui appartient à l’auditeur, et un même sujet ne peut pas cumuler l’administration et l’audit. Un administrateur d’instance ne peut donc pas lire ce journal, y compris le sien : un journal que l’administrateur peut lire et écrire ne prouve rien. Sur une instance neuve, personne ne porte le rôle d’auditeur, donc personne ne lit ce journal.

Ils sont 36, dans l’ordre où la table les déclare. La méthode fait partie de l’identité du pouvoir : GET /api/endpoints et DELETE /api/endpoints/:id ne sont pas le même droit.

Un point d’appel absent de cette table est refusé, pas ouvert. 14 entrées portent réservé au profil hébergé au lieu d’une permission : le refus est le même, la conduite à tenir ne l’est pas. « Aucune permission ne couvre ce chemin » est un trou à combler, « ce chemin ne concerne pas ce profil » est une décision.

MéthodeCheminExigeRôle qui le porteProfil qui le monte
GET/api/usersmembres:lire-l-instanceadministrateur-d-instanceserverless seulement
POST/api/usersréservé au profil hébergéaucunserverless seulement
POST/api/users/:id/rotate-keyréservé au profil hébergéaucunserverless seulement
GET/api/users/:id/keysréservé au profil hébergéaucunserverless seulement
POST/api/users/:id/keysréservé au profil hébergéaucunserverless seulement
POST/api/users/:id/keys/:keyId/revokeréservé au profil hébergéaucunserverless seulement
DELETE/api/users/:idréservé au profil hébergéaucunserverless seulement
PATCH/api/users/:idréservé au profil hébergéaucunserverless seulement
GET/api/plansréservé au profil hébergéaucunserverless seulement
POST/api/plansréservé au profil hébergéaucunserverless seulement
PATCH/api/plans/:idréservé au profil hébergéaucunserverless seulement
DELETE/api/plans/:idréservé au profil hébergéaucunserverless seulement
GET/api/usageréservé au profil hébergéaucunserverless seulement
GET/api/usage/filtersréservé au profil hébergéaucunserverless seulement
GET/api/spending-capsréservé au profil hébergéaucunserverless seulement
GET/api/providersfournisseurs:administreradministrateur-d-instanceles deux
POST/api/providersfournisseurs:administreradministrateur-d-instanceles deux
DELETE/api/providers/:idfournisseurs:administreradministrateur-d-instanceles deux
GET/api/modelsmodeles:administreradministrateur-d-instanceles deux
POST/api/modelsmodeles:administreradministrateur-d-instanceles deux
DELETE/api/models/:idmodeles:administreradministrateur-d-instanceles deux
GET/api/endpointsendpoints:administreradministrateur-d-instanceles deux
POST/api/endpointsendpoints:administreradministrateur-d-instanceles deux
PATCH/api/endpoints/:idendpoints:administreradministrateur-d-instanceles deux
DELETE/api/endpoints/:idendpoints:administreradministrateur-d-instanceles deux
POST/api/policiespolitique:administreradministrateur-d-instanceles deux
GET/api/organizationpolitique-d-organisation:administreradministrateur-d-instanceles deux
POST/api/organizationorganisations:administreradministrateur-d-instanceles deux
POST/api/organization/policypolitique-d-organisation:administreradministrateur-d-instanceles deux
GET/api/audit/organization-policypolitique-d-organisation:lireauditeurles deux
GET/api/administration-actionsjournal:lireauditeurles deux
GET/api/audit/agent-actsjournal:lireauditeurles deux
POST/api/audit/agent-sessions/:session/revocationsessions:revoqueradministrateur-d-instanceles deux
GET/api/agent-sessionssessions:revoqueradministrateur-d-instanceles deux
GET/api/agent-executionconsole:administrer-l-instanceadministrateur-d-instanceles deux
GET/console:administrer-l-instanceadministrateur-d-instanceles deux

Une liste blanche plutôt qu’un préfixe : un préfixe laisserait entrer tout ce que quelqu’un déposerait un jour dans le répertoire. Ces chemins ne portent aucune donnée du déploiement, et la page de connexion doit pouvoir s’afficher avant qu’on soit connecté.

  • /favicon.svg
  • /client.css
  • /client.js
  • /fonts/:fichier

Profil fermé uniquement. Ces chemins sont montés avant l’intercalaire d’authentification et regroupés sous un préfixe commun (/auth/) que celui-ci laisse passer : le retour de l’annuaire arrive sur une URI de redirection qui, par définition, n’est pas encore authentifiée.

MéthodeChemin
GET/auth/login
GET/auth/callback
GET/auth/logout

Un refus d’authentification nomme le mécanisme (cette console délègue à l’annuaire) et jamais l’état du déploiement. Le motif exact part dans les journaux du service. Un annuaire injoignable répond 503 et non 401 : « je ne peux pas vérifier » n’est pas « tu n’as pas le droit », et les confondre enverrait un exploitant chercher un problème de droits pendant que son annuaire est en panne.

Elles sont 11, lues dans l’environnement du conteneur de la console. Le conteneur de la passerelle lit les siennes dans le sien : deux conteneurs, deux environnements, aucun partage à arbitrer.

VariableObligatoireProfil où elle a un effetEffet
ADMIN_USERouihébergéIdentifiant du couple d’administration partagé. Lu au chargement du module : le processus refuse de démarrer si l’un des deux manque, plutôt que d’ouvrir un port que rien ne garde. Ce couple ne nomme aucun sujet, ne porte aucune attribution de rôle et ne se révoque pas : il est toléré pour un premier démarrage, et se retire une fois les rôles en place. Le code qui le lit est absent de l’artefact en profil fermé.
ADMIN_PASSouihébergéMot de passe du même couple, aux mêmes conditions. En profil fermé, aucun mot de passe n’est vérifié par la console : la variable n’y a pas de lecteur.
DATABASE_URLnon, et c’est le piègeles deuxChaîne de connexion PostgreSQL. Son absence ne fait pas échouer le démarrage : la console se rabat sur une base de développement locale dont les identifiants sont écrits dans le code, si bien qu’un déploiement qui oublie la variable ne signale rien : il se connecte ailleurs. La valeur de ce repli n’est pas reproduite ici. Un paramètre sslmode porté par l’URL fait refuser le démarrage : la validation du certificat de la base est posée par le code, elle ne se règle pas dans l’URL.
PORTnonles deuxPort d’écoute de la console. Absente, 6002.
DATABASE_CA_CERT_PATHnonles deuxChemin du fichier d’autorité de certification à opposer au certificat de la base. Absente, la validation reste active avec les autorités du système. Renseignée sur un fichier illisible, le démarrage est refusé : sans cette autorité la connexion échouerait de toute façon, plus tard et plus loin de sa cause. Sans effet sur une base locale.
DATABASE_CA_CERTnonles deuxLe contenu PEM de la même autorité, pour les plateformes qui ne savent passer que des variables d’environnement et n’offrent aucun disque où monter un fichier. C’est une seconde entrée vers le même mécanisme, pas un second mécanisme : une valeur qui ne porte pas de certificat arrête le démarrage, et les deux variables posées ensemble aussi, parce que rien ne dirait laquelle fait foi. Le certificat d’une autorité est public : ce n’est pas un secret.
OIDC_ISSUERouiferméÉmetteur attendu de l’annuaire d’entreprise, et racine de sa découverte. Une URL absolue en https:, sans requête ni fragment ; toute autre forme est refusée, y compris pour une adresse locale. Sans elle, aucun annuaire n’est configuré et personne n’entre.
OIDC_CLIENT_IDouiferméIdentifiant de client OAuth 2 de ce déploiement auprès de l’annuaire. Renseignée sans émetteur, ou l’inverse, la configuration est partiellement posée : la console démarre et refuse tout.
OIDC_CLIENT_SECRETnonferméSecret de client confidentiel, à ne renseigner que si l’annuaire l’exige. L’échange du code est protégé sans secret partagé ; là où l’annuaire accepte un client public, ne pas en détenir est strictement mieux que d’en détenir un.
OIDC_AUDIENCEnonferméAudience attendue dans le jeton. Absente, l’identifiant de client sert d’audience.
OIDC_REDIRECT_URIoui dès qu’un annuaire est configuréferméURI de retour du flux de connexion. Elle est propre à cette console et lue dans l’environnement de son conteneur. Annuaire configuré mais URI absente : la console démarre, pour rester diagnosticable, et refuse tout, en annonçant au démarrage ce qui manque.

Ils sont 7, dans l’ordre d’affichage. Cet ordre ne dépend pas du profil : la liste est déclarée entière, y compris les entrées que le paquet livré ne contient pas. La console s’ouvre sur le premier onglet disponible.

RangIntituléIdentifiantProfil qui le sert
1Usersusershébergé seulement (absent du paquet construit en profil fermé)
2Plansplanshébergé seulement (absent du paquet construit en profil fermé)
3Endpointsendpointsles deux
4Usageusagehébergé seulement (absent du paquet construit en profil fermé)
5Capscapshébergé seulement (absent du paquet construit en profil fermé)
6Policygovernanceles deux
7Auditauditles deux

Un onglet absent du paquet construit en profil fermé n’est pas un onglet caché : ni son libellé, ni ses formulaires, ni ses appels ne sont dans l’artefact.

Elles sont 3 à toucher la console. Chacune est un point d’entrée que le profil fermé embarque tel quel, et que le profil hébergé remplace par une autre implémentation. Sans profil explicite, la construction produit le profil fermé : un oubli ne peut donner que l’artefact restreint.

FrontièreCe que le profil fermé embarqueCe que le profil hébergé y substitue
authentificationgateway-admin/src/authentification/index.tsgateway-admin/src/authentification/local/index.ts
comptesgateway-admin/src/comptes/index.tsgateway-admin/src/comptes/present/index.ts
ongletsDeComptesgateway-admin/src/client/ongletsDeComptes/index.tsgateway-admin/src/client/ongletsDeComptes/present/index.ts

Le sens de chaque écran, l’ordre des gestes de mise en service, les champs de formulaire et leurs contrôles de saisie, et le détail des refus par point d’appel (quel cas donne 400, 409 ou 404). Aucune déclaration ne les porte : ils vivent en conditions écrites au fil du code et dans des composants d’interface sans manifeste. Les extraire supposerait d’analyser du code arbitraire, et une extraction fragile qui publie une liste incomplète est pire qu’une absence de liste.

Elles sont couvertes par des guides, qui sont le type de page fait pour elles :

Le catalogue complet des rôles et de leurs permissions, au-delà de ceux que la console exige, appartient à la référence de la passerelle.