Skip to main content
Jenks Guo

Docs / explanation

Sécurité et confidentialité

Ce que les interfaces publique et d’administration peuvent faire, comment l’authentification SSO, les jetons de service d’agent, le journal d’audit et l’accès GitHub les protègent, et ce qu’il advient des données des visiteurs.

Deux types d’accès

Public — tout le monde, sans identifiants. L’API REST (/api/v1/*), le serveur MCP public (/mcp), les commandes publiques du CLI et les fichiers statiques sont en lecture seule. Ils n’exposent que le corpus publié, qui est public par conception. ask_jenks et le chat du site font appel à un modèle de langage, ils sont donc limités en débit par adresse IP pour prévenir les abus.

Admin — Jenks, et les agents IA auxquels il donne un jeton. /api/admin/*, /mcp/admin, jenks admin … et la console peuvent valider, écrire et supprimer des fichiers de contenu, téléverser et supprimer des fichiers média, et promouvoir dev vers main. C’est un véritable pouvoir, donc il y a trois couches.

Connexion pour les personnes : SSO

La console se trouve sur https://admin.jenksguo.xyz/admin (et https://admin.dev.jenksguo.xyz/admin pour le site de développement). Cloudflare Access se place devant ces hôtes : personne n’accède à la console avant d’avoir ouvert une session avec un compte Google autorisé. /admin sur toute autre adresse y redirige.

Le Worker ne fait pas simplement confiance aux en-têtes de Cloudflare. À chaque requête admin, il vérifie lui-même le jeton Access signé — la signature via les clés publiques de l’équipe Access, l’audience de l’application, l’émetteur et l’expiration — et l’email doit figurer sur la liste des admins.

Jetons de service pour les agents

Un agent IA n’utilise jamais la connexion de Jenks. Jenks crée un jeton de service pour chaque agent dans la console (Access → New agent token) :

  • Nommé — « Claude Code sur MacBook », afin que le journal d’audit indique quel agent a fait quoi.
  • À portée limitée — content (contenu, traductions et textes du site), media (la médiathèque), publish (écriture directement en production et promotion de dev → main). Chaque jeton peut lire. Sans publish, un agent enregistre sur dev et Jenks promeut la modification.
  • À expiration — de 30 à 365 jours (90 par défaut).
  • Révocable — en un clic, effectif à la requête suivante.
  • Lié au SSO — seule une personne connectée via Access peut créer, lister ou révoquer des jetons ; un jeton d’agent ne peut pas créer un autre jeton. Un jeton cesse également de fonctionner si la personne qui l’a créé n’est plus admin.
  • Stocké sous forme de hachage — le jeton est affiché une seule fois, lors de sa création ; la base ne conserve que son hachage SHA-256.

Les agents envoient le jeton en Authorization: Bearer jgx_agt_… vers /api/admin/* ou /mcp/admin sur https://jenksguo.pages.dev (Access bloquerait un programme sur l’hôte admin). Les navigateurs n’envoient pas un tel en-tête d’eux-mêmes, donc une page malveillante ne peut pas l’emprunter.

Le journal d’audit

Chaque écriture admin — et chaque tentative refusée — est enregistrée : qui (un email ou agent:<name>), quel outil, quels fichiers, branche, hôte, et le résultat ou l’erreur. La création et la révocation de jetons sont également consignées. Le contenu des fichiers n’est jamais journalisé. Jenks lit le journal dans la console (Access) ; un agent peut lire uniquement ses propres entrées (admin_audit_log). L’historique Git demeure la trace de ce qui a changé dans le contenu lui-même.

Le jeton admin « break-glass »

Le jeton admin d’origine fonctionne toujours, pour les urgences, mais il ne peut pas créer de jetons d’agent. Il est conservé dans le Trousseau macOS sous agent-env:JENKSGUO_ADMIN_TOKEN et comme secret chiffré du Worker, et est comparé en temps constant. Faites-le pivoter s’il a pu fuiter : enregistrez une nouvelle valeur dans le Trousseau et le secret du Worker, et l’ancienne cesse immédiatement de fonctionner. Pour le développement local uniquement (wrangler dev en localhost) la console peut s’y connecter : le jeton est échangé une fois contre un cookie de session HttpOnly.

Ce que l’API admin peut toucher

Les écritures sont limitées à une liste blanche de chemins de contenu — les entrées du corpus, lenses, skills, documents de base, le glossaire de traduction et cette documentation. Elle ne peut pas modifier le code, les workflows, les secrets ni quoi que ce soit en dehors de content/. Chaque écriture est d’abord validée contre le schéma de contenu.

Fichiers média

Les images, vidéos et PDF téléversés via les interfaces d’administration sont stockés dans un bucket Cloudflare R2 et servis depuis /media/…. Ils sont publics par adresse dès le moment du téléversement, donc seuls les éléments destinés à tous les visiteurs doivent s’y trouver.

  • Le type de fichier est détecté à partir des octets, pas du nom, et seuls les formats web d’images, de vidéos et PDF sont acceptés (25 Mo chacun).
  • Les images SVG sont refusées si elles contiennent des scripts ou des gestionnaires d’événements, et chaque SVG est servi dans un bac à sable de sécurité de contenu, de sorte que même un SVG conçu pour attaquer, ouvert directement, ne peut pas exécuter de code sur ce site.
  • Contrairement au contenu, les médias ne sont pas dans git : la suppression est permanente. Les suppressions sont refusées tant que du contenu publié utilise encore le fichier.

Accès GitHub

Les écritures admin deviennent des commits via l’API GitHub en utilisant un jeton d’accès personnel à portée fine limité au seul dépôt, avec uniquement les autorisations nécessaires à la publication. Il est stocké comme secret chiffré du Worker. Comme chaque modification est un commit :

  • l’historique git enregistre chaque changement — ce qui a changé, quand, et pourquoi (le message de commit ; la remorque du commit indique le nom de l’agent),
  • le retour arrière est toujours possible — n’importe quelle version antérieure de n’importe quel fichier peut être restaurée.

Les changements risqués peuvent être préparés sur la branche dev et vérifiés sur https://dev.jenksguo.xyz avant que quoi que ce soit n’atteigne le site en production.

Confidentialité des visiteurs

  • Pas de traqueurs publicitaires et pas de cookies marketing.
  • La transcription du chat est conservée uniquement dans le navigateur du visiteur (sessionStorage) et effacée à la fermeture de l’onglet. Le site ne stocke pas les transcriptions de chat.
  • Les messages de chat sont envoyés via le Worker Cloudflare vers OpenRouter, qui les achemine vers un modèle de langage tiers. Il est demandé aux visiteurs de ne pas partager d’informations personnelles sensibles.
  • La voix est désactivée jusqu’à ce que le visiteur appuie sur le micro, et elle se coupe d’elle-même après dix tours ou lorsqu’elle n’entend pas de véritable conversation. La saisie vocale utilise la reconnaissance vocale du navigateur lorsque disponible ; sinon, l’audio est envoyé à OpenRouter pour transcription. Les réponses orales sont générées par Cloudflare Workers AI (Deepgram Aura-2, anglais) ou OpenRouter (autres langues), avec la synthèse vocale de l’appareil en solution de repli. Aucun enregistrement ni audio généré n’est conservé.
  • Cloudflare conserve des journaux de requêtes standard à des fins de sécurité et de limitation de débit.

Confidentialité du contenu

Tout ce qui se trouve sous content/ est public. Les CV de Jenks contenaient des numéros de téléphone, une adresse personnelle et des contacts référents ; aucun de ces éléments ne figure dans le corpus, et ils ne doivent jamais y être ajoutés. Les informations concernant d’autres personnes sont limitées à ce qui est nécessaire pour décrire les rôles de Jenks.

Signaler un problème

Envoyez un email à jenksguo@gmail.com avec les détails. Merci de ne pas tester l’interface d’administration sans autorisation.

.mdCette page est traduite avec l’aide de l’IA ; les titres officiels restent en anglais.