Aller au contenu

Pour le RSSI

La mesure existe. Elle tourne. Vous pouvez le prouver.

Un contrôle que vous ne pouvez pas démontrer n’a pas d’existence pour un auditeur. Neverseen est construit autour de ces trois questions, dans cet ordre.

  1. 01

    La mesure existe-t-elle ?

    Un agent sur chaque poste, qui masque avant l’envoi. C’est une mesure technique de prévention de fuite appliquée au canal que vos autres outils ne couvrent pas : les outils d’IA en ligne de commande et les SDK lancés par vos collaborateurs.

  2. 02

    Tourne-t-elle vraiment ?

    La console de flotte distingue trois états : actif, silencieux, jamais vu. Un agent émet toutes les cinq minutes ; passé seize, il est déclaré silencieux et déclenche une alerte par courriel et par webhook — une fois par épisode, pas une par balayage, parce qu’un canal qui se répète est un canal que l’on filtre. Sans cette alerte, la supervision est passive et ne vaut pas une preuve de surveillance. Reste un quatrième état, moins évident et plus dangereux : actif, mais masquant moins que son catalogue. Un poste peut avoir ses trois locales chargées et ne plus masquer les dates de naissance. Le battement porte donc ce que l’agent applique vraiment — plein, partiel ou rien — avec le nom des catégories coupées et le niveau de secret retenu.

  3. 03

    Pouvez-vous le prouver ?

    Chaque événement significatif — enrôlement, battement reçu, passage en silence, changement de configuration, alerte émise — est horodaté et chaîné par hachage au précédent. Toute altération d’un maillon casse la chaîne et se voit.

Journal de preuve

Le livrable que vous mettez dans le dossier d’audit.

Un export par période, au format CSV ou JSONL, qui se rejoue et se vérifie hors ligne : l’auditeur recalcule la chaîne de hachage sans avoir besoin d’accéder à votre console.

Et un rapport mensuel par organisation, écrit pour être versé tel quel au dossier : quels postes étaient protégés, sur quelle période, avec quelle politique, et quels écarts ont été détectés puis traités.

Ce que notre backend reçoit — la liste complète

POST /v1/heartbeat

{
  "schema": 2,
  "agent_id": "ag_7f3c1a9e",
  "sent_at": "2026-08-25T10:35:00Z",
  "state": {
    "version":      "1.4.2",
    "platform":     "darwin/arm64",
    "started_at":   "2026-08-25T08:02:11Z",
    "locales":      ["fr", "gb"],
    "substitution": "fake",
    "providers":    ["anthropic", "openai"],
    "addresses":    ["10.4.2.87"],
    "hostname":     "poste-47.exemple",
    "masking":      "partial",
    "switched_off": ["DOB"],
    "secret_level": "medium",
    "console":      false,
    "tracing":      false,
    "exposed":      false,
    "rerouted":     [],
    "allowlisted":  12
  },
  "buckets": [
    {
      "window": {
        "start": "2026-08-25T10:30:00Z",
        "end":   "2026-08-25T10:35:00Z"
      },
      "counters": {
        "requests": 412,
        "masked": {
          "EMAIL": 138, "PHONE": 61, "NIR": 4,
          "IBAN": 12,   "SIREN": 27, "SECRET_ANTHROPIC_KEY": 9
        },
        "models": {
          "claude-opus-5": {
            "input": 84900, "output": 96430,
            "cache_write": 21400, "cache_read": 1200000
          },
          "gpt-5.2": { "input": 210400, "output": 18220 }
        },
        "restarts": 1,
        "dropped": 0,
        "refused": 1,
        "providers": { "anthropic": 380, "openai": 32 },
        "upstream": {
          "ok": 404, "rate_limited": 5, "rejected": 2,
          "failed": 1, "unreachable": 0
        },
        "clients": { "claude-code": 371, "openai-sdk": 32, "cursor": 8, "other": 1 },
        "policy": { "applied": 1, "refused": 0 },
        "degraded": 1,
        "sessions": {
          "active": 6, "opened": 2, "closed": 3,
          "duration":   [0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0],
          "requests":   [0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
          "input":      [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0],
          "output":     [0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0],
          "tool_calls": [1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
          "masked":     [0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
        },
        "tools": {
          "calls": 96, "restored": 7,
          "names":    { "Bash": 54, "Read": 31, "mcp": 8, "other": 3 },
          "programs": { "git": 21, "grep": 14, "python3": 6, "other": 13 },
          "classes":  { "network": 3, "privilege": 1 }
        }
      }
    }
  ]
}
  • Aucun prompt, aucune réponse, aucune valeur détectée — pas même tronquée. Ni nom de fichier, ni URL.
  • Deux exceptions, écrites ici plutôt que découvertes dans une base. La première : les adresses IP locales du poste. Ce n’est pas du contenu — rien du trafic n’y transite — mais une adresse identifie une machine, donc quelqu’un. Elle est là parce qu’une vue de flotte sans elle ne sert à rien : « ag_7f3c1a9e est silencieux » n’envoie personne nulle part, « le portable en 10.4.2.87 est silencieux » envoie quelqu’un à un bureau.
  • La seconde, plus directe et assumée comme telle : le nom que le poste se donne. Un poste porte souvent le nom de la personne qui s’en sert, si bien que « marie-macbook » désigne quelqu’un là où une adresse ne désigne qu’une machine. C’est précisément pour cela qu’il remonte : c’est l’identifiant qu’un exploitant reconnaît déjà, et le seul qui survive à un portable qui change de réseau. Il est transmis tel que le système d’exploitation le donne, jamais résolu et jamais haché — hacher conserverait la donnée personnelle et perdrait l’usage.
  • L’état dit ce que l’agent applique, pas ce qu’un fichier prévoit : catégories désactivées, niveau de secret, locales chargées. Un agent chargé de trois locales qui a cessé de masquer les courriels se voit ici, alors qu’une console lisant la seule configuration l’afficherait au vert. Il dit aussi comment l’agent lui-même est exposé : console en clair, échanges écrits sur disque, écoute au-delà de la boucle locale, fournisseur dérouté, valeurs exemptées.
  • Les compteurs décrivent le contrôle autant que le trafic : requêtes refusées faute de pouvoir lire le corps, fenêtres perdues au-delà du tampon, réponses restaurées morceau par morceau. Ils portent aussi l’inventaire que rien d’autre ne donne — quels outils d’IA tournent sur les postes, quels fournisseurs répondent et comment, et ce que les modèles ont demandé au poste d’exécuter : combien d’appels d’outils, combien ont reposé une valeur que le modèle n’a jamais vue, et de quelle classe étaient les commandes. Des mots de vocabulaires fermés, jamais les arguments.
  • Le contrat de télémétrie est public et versionné, et un test parcourt le type lui-même pour refuser tout champ de texte qui n’a pas été justifié, ligne à ligne. L’invariant est vérifié à chaque build, pas promis en avant-vente.

ISO/IEC 27001:2022

Correspondance ISO/IEC 27001:2022

Un contrôle ne vaut que s’il existe, qu’il tourne, et que vous pouvez le prouver. Neverseen couvre les trois.

ContrôleAttente de l’auditeurCe que vous montrez
A.8.12 — Prévention de la fuite de donnéesUne mesure DLP existe sur le canal IA.L’agent, installé et actif sur chaque poste.
A.8.16 — Activités de surveillanceVous savez que la mesure tourne réellement.Vue de flotte en temps réel et alerte sur agent silencieux.
A.8.15 — JournalisationDes journaux opposables : horodatés, intègres, exportables.Journal de preuve chaîné par hachage, export CSV et JSONL.
A.5.36 — Conformité aux politiquesChaque poste applique bien la politique décidée.Version, locales, mode de substitution et catégories réellement masquées, à chaque battement.
A.5.19 à A.5.23 — Fournisseurs et services cloudLe sous-traitant est identifié et auditable.Hébergement dans l’Union européenne, et un backend qui ne reçoit aucun contenu.

Sous-traitance et souveraineté

Hébergement dans l’Union européenne

Le backend et sa base sont hébergés dans l’UE. C’est une contrainte de déploiement, pas une intention.

Aucun contenu, donc un périmètre trivial à décrire

La question « que fait votre sous-traitant de nos données ? » a une réponse courte : il n’en reçoit aucune. Votre analyse d’impact s’en trouve considérablement raccourcie.

L’agent reste autonome

Coupez le backend, résiliez, mettez-le en liste noire au pare-feu : le masquage continue exactement de la même façon. La supervision observe, elle n’est jamais sur le chemin de la requête.

Code lisible, détection mesurée

L’agent — la partie qui touche vos données — est public : vos équipes peuvent le lire, le compiler et vérifier ce qu’il envoie. La détection, elle, n’est pas affirmée mais mesurée. Un corpus de cas rédigés en prose déclare les valeurs à trouver, et aussi celles à laisser intactes — un numéro de version, un identifiant de commit, une référence interne. Un plancher de justes, de faux positifs et de manqués est figé par catégorie, et le build échoue si l’un d’eux glisse. Une catégorie ajoutée sans cas de corpus derrière elle ne compile pas.

Bêta privée

Demander un accès bêta

Nous ouvrons par vagues, une dizaine de flottes à la fois. Réponse sous deux jours ouvrés.