Pour les DSI

La même protection, appelée par vos programmes — une image sans état à exploiter.

Avant qu’un flux n’envoie un document à une IA, à un traducteur ou à un fournisseur, il peut demander à DoNotLeak d’y repérer et d’y remplacer les données personnelles — par une API qui exige une identité, servie par le moteur de la page.

Un composant de plus à héberger, sécuriser, mettre à jour et superviser ? Voici ce qu’il demande : une image signée, sans base ni volume à sauvegarder, configurée par l’environnement, appelée par des machines identifiées. Et, sur demande, son code source pour vos équipes.

Appelants identifiés uniquement · Rien n’est conservé · Images signées, amd64 et arm64

Dessin au trait panoramique : une pile de documents entre dans une rangée de trois boîtes identiques, reliées l’une à l’autre ; la ligne mène à un ordinateur portable qui affiche un document et une courte liste, se sépare vers un immeuble de bureaux et un nuage, puis se rejoint sur un engrenage. Un pointillé, pas encore raccordé, mène à un petit robot dans un cadre en tirets.

Essayer l’API

Envoyez une requête, lisez la réponse.

Le vrai moteur, ouvert ici en démonstration, sans clé : la réponse que vous lisez est celle que vos programmes recevront.

  • 1 appel toutes les 15 s par adresse IP
  • textes jusqu’à 4 Ko
  • rien n’est conservé
  • un même réseau partage le rythme
Les plafonds de la démonstration

Par adresse — un réseau IPv6 /64 compte pour une seule : 100 appels par jour, 300 par semaine, 600 par mois, 2 000 par an. Pour toute la démonstration : 600 appels par minute et un seul texte analysé à la fois ; au-delà, elle répond 503 et le reste du service n’est pas touché. Votre adresse n’est tenue qu’en mémoire, le temps de compter ses appels ; les journaux gardent le verbe, le statut, les tailles et la durée — jamais l’adresse, le texte ni la réponse.

RateLimit-Policy · RateLimit · Retry-After

  • POSTscan
  • POSTprotectBientôt
  • POSTrestoreBientôt
  • GETcapabilitiesBientôt
  • POSTextractavec une clé
  • POSTrenderavec une clé

Requête

POST/api/demo/scan

Repère les données personnelles — où elles sont (en octets UTF-8), leur type, leur gravité — et renvoie le texte protégé.

81 / 4096 octets

Pays
Voir le JSON envoyé
{
  "text": "Damien Morel a validé le virement vers l'IBAN FR76 3000 6000 0112 3456 7890 189.",
  "scope": [
    "FR"
  ]
}

Prêt — 1 appel disponible

Réponse

La réponse s’affichera ici.

Vos programmes, eux, appellent /api/v1/scan avec leur identité — un certificat client ou un jeton : c’est la section suivante.

L’API

Ce qu’elle fait aujourd’hui : repérer, puis remplacer.

Un seul appel : du JSON en entrée, les détections et le texte protégé en sortie. C’est le moteur de la page qui répond.

  • Repérer

    Chaque donnée personnelle du texte, avec son type, sa position et un score de confiance. Les formats suivent les pays que vous indiquez.

    findings · counts · scope

  • Remplacer

    La même réponse porte le texte protégé : chaque valeur devient une étiquette typée et numérotée. Les valeurs que vous déclarez à garder restent telles quelles.

    anonymized_text · replacements · kept

L’appel

curl -sS --cacert ca.pem --cert client.pem --key client.key \
  -H 'Content-Type: application/json' \
  -X POST --data '{"text":"Contact: jean.dupont@example.org"}' \
  https://donotleak.example.org/api/v1/scan
Avec un jeton plutôt qu’un certificat
-H "Authorization: Bearer $TOKEN"

La réponse — enregistrée depuis le moteur, retours à la ligne ajoutés

{"version":1,
 "findings":[{"id":0,"kind":"Pii","span":{"start":9,"end":32},
   "primary":{"label":"EMAIL","severity":"Medium","confidence":85},
   "alternatives":[],"entity_id":0,"kept":false,"applied":0}],
 "counts":{"total":1,"low":0,"medium":1,"high":0,"critical":0},
 "anonymized_text":"Contact: [[EMAIL-1]]",
 "replacements":[{"span":{"start":9,"end":32},"placeholder":"[[EMAIL-1]]"}],
 "entities":[{"id":0,"label":"EMAIL","value":"jean.dupont@example.org",
   "placeholder":"[[EMAIL-1]]"}],
 "skipped_overlaps":0}
Les refus et la table des entités

Les refus ne citent jamais le contenu : 400 vide ou pas du JSON, 413 au-delà de 1 Mio, 422 contenu suspect, 401 sans identité, 403 non autorisé, 429 budget dépassé.

La table des entités renvoie chaque valeur d’origine à l’appelant qui l’a envoyée — c’est elle qui permettra de restaurer. Seul le texte protégé part vers l’IA.

Ce qu’elle ne fait pas encore
  • Restaurer : remettre les originaux dans la réponse de l’IA Bientôt
  • Les documents Word par l’API Bientôt
  • Le contrat v1 publié : une description OpenAPI, des erreurs uniformes, des quotas par appelant Bientôt

Où l’insérer dans vos flux

Un contrôle avant l’appel externe.

Un flux — une GED, un CRM, un lot de fichiers — appelle DoNotLeak juste avant d’appeler une IA ou un partenaire. Seul le texte protégé continue sa route.

Vous choisissez où placer le contrôle et ce qui suit : envoyer tout de suite, ou laisser une personne relire les détections, puis renvoyer le texte en gardant les valeurs dont la tâche a besoin.

Dessin au trait : des documents aux lignes orange passent sur un tapis roulant sous un portique d’analyse, puis sous une loupe. Une voie, validée, emmène une page protégée vers une puce d’IA ; l’autre, barrée, met les originaux de côté.
Le contrôle se place avant la frontière — là où vous décidez de le mettre.

Identité des machines

Jamais anonyme : chaque appel nomme son appelant.

L’API n’a pas de porte ouverte. Le serveur refuse de démarrer tant qu’il ne sait pas identifier un appelant, et chaque appel est jugé selon votre politique.

  • Un certificat client

    TLS mutuel, terminé par le serveur lui-même : le certificat doit remonter à l’autorité de certification que vous reconnaissez, et son identifiant SPIFFE — à défaut son nom DNS, jamais son nom commun — devient l’appelant.

    TLS_CLIENT_CA · TLS_CLIENT_IDENTITY=san

  • Un jeton de votre fournisseur d’identité

    L’émetteur OpenID Connect que vous désignez — votre annuaire, votre SSO : signature, émetteur, audience et expiration de chaque jeton sont vérifiés avec les clés qu’il publie, et ses rôles l’accompagnent.

    OIDC_ISSUER_URL · OIDC_CLIENT_ID · éprouvé en CI face à Keycloak

  • Refus par défaut : un appelant sans rôle dans votre fichier de politique est refusé (403), et analyser est un droit à part entière.
  • Pas de clé d’API statique qui puisse fuiter : un appelant se prouve par un certificat ou un jeton signé.

Hébergement et souveraineté

Hébergé par Contee, ou dans votre propre système d’information.

La même image headless dans les deux cas.

  • Par Contee, dans l’UE

    Contee exploite le serveur, vous l’appelez. La page publique fonctionne déjà ainsi, chez OVH SAS, hébergeur français (voir les mentions légales).

    L’API hébergée, sous son propre contrat de service Bientôt

  • Dans votre système d’information

    L’image tourne sur vos serveurs, derrière votre PKI et votre fournisseur d’identité : les textes ne quittent jamais votre périmètre. Sur demande, avec son code source : l’offre sur site, ci-dessous.

Dessin au trait : une femme dépose un cube marqué d’un bouclier dans un cercle qui entoure une baie de serveurs ; un ordinateur portable lui envoie un document ; une page en ressort, et seule une flèche en tirets mène vers un nuage lointain.
L’endroit où tourne le contrôle est un choix d’architecture, le vôtre.

L’offre sur site

Le code source chez vous, et vos équipes pour le faire évoluer.

Pour une organisation qui veut DoNotLeak dans son propre système d’information, sans dépendre de Contee pour le faire vivre.

  • Le code source livré

    Pour l’usage interne de votre organisation : vos équipes le lisent, le construisent et le déploient dans votre périmètre.

  • Vos équipes formées

    À le maintenir, à l’améliorer et à l’étendre : les compétences se construisent chez vous, pas chez nous.

  • Le moins de dépendance possible

    Le code et le savoir-faire restent dans la maison ; le serveur ne joint que ce que vous configurez, jamais un service de Contee.

  • En une fois, pas en abonnement SaaS

Disponible dès aujourd’hui, sur demande, pour votre périmètre.

L’image headless

Le cœur d’analyse seul — signé, pour deux architectures.

Pas de page, pas de cookie, pas de code navigateur : l’API et le moteur, rien d’autre.

  • Le moteur de la page

    La page et l’API appellent la même fonction d’analyse : ce qu’une personne voit sur la page, un programme l’obtient.

    un cœur · deux portes

  • Petite, et fermée par défaut

    Une base distroless — ni shell, ni gestionnaire de paquets — et un utilisateur non root. Elle refuse de démarrer sans source d’identité, ou avec une configuration TLS à moitié faite.

    port 3000 · TLS et mTLS dans l’application, ou derrière votre proxy

  • Construite et signée comme l’image web

    La même chaîne la construit et l’analyse, puis la signe par empreinte avec la clé propre à DoNotLeak — l’image, sa nomenclature logicielle et sa provenance de build.

    amd64 + arm64 · cosign · SBOM SPDX · provenance SLSA · Trivy, Grype, Dockle, Dive

Exploitation

Ce que l’image demande à votre exploitation.

Un conteneur parmi les autres.

  • Sans état

    Ni base de données, ni volume à sauvegarder : chaque requête est traitée en mémoire, puis oubliée. Rien à restaurer.

    aucune base · aucun volume de données

  • Configurée par l’environnement

    Adresse d’écoute, certificats, autorité cliente, émetteur OIDC, fichier de politique, budgets : des variables, et des fichiers montés en lecture seule. Une configuration à moitié faite refuse de démarrer.

    LEPTOS_SITE_ADDR · TLS_CERT · TLS_CLIENT_CA · CASBIN_POLICY_FILE · SCAN_*

  • Supervisée par vos outils

    Les traces partent en OpenTelemetry vers votre collecteur, sinon sur la sortie standard ; les journaux ne contiennent jamais un texte analysé.

    OTEL_EXPORTER_OTLP_ENDPOINT

  • Mise à jour par empreinte

    Une version, c’est une image signée désignée par son empreinte : vérifier la signature, changer l’empreinte, redémarrer. Un certificat qui change : de nouveaux fichiers, puis un redémarrage.

    cosign verify · amd64 + arm64

Où qu’elle tourne

Trois choses qui ne changent pas.

  • Rien n’est conservé

    Chaque texte est analysé dans la mémoire de la requête qui le porte, sur le serveur, et disparaît avec elle : aucune copie, aucun journal de son contenu.

    Chaque pipeline fait passer un texte témoin par le serveur headless, et échoue si son journal le montre un jour.

  • Personne d’autre n’est appelé

    La détection repose sur des formats, des règles et des dictionnaires : aucun modèle de langage, aucun service tiers. Le serveur ne joint que ce que vous configurez — votre fournisseur d’identité, votre collecteur de télémétrie.

  • Chaque version vérifiable

    Chaque image est signée par empreinte, avec sa nomenclature logicielle et sa provenance ; la chaîne vérifie la signature avant toute publication.

Dessin au trait : des pages marquées d’orange passent sur un tapis dans une petite machine à engrenages munie d’un cadran, et ressortent avec des cases en tirets à la place des marques ; à côté, une grande machine qui affiche un cerveau reste débranchée, la prise pendante.
Des règles et des dictionnaires font le travail : aucun modèle de langage à appeler.

Essayez sur la page, puis écrivez à Contee.

La page répond avec le même moteur que l’API : collez-y un texte type de vos flux. La sécurité de l’image se vérifie contrôle par contrôle sur la page RSSI. Pour l’API hébergée ou l’offre sur site, écrivez à Contee.