Aller au contenu

Sécuriser la télémétrie et les données d’usage produit

Sécuriser la télémétrie et les données d’usage produit

Section intitulée « Sécuriser la télémétrie et les données d’usage produit »

La télémétrie produit répond à une question légitime : comprendre ce qui fonctionne, ce qui casse et ce qui reste inutilisé. Elle devient un problème de sécurité dès qu’un événement relie durablement une action à une personne, un terminal, un compte ou un contexte métier.

→ Lire l’explication complète de la marmotte

Le compromis central est brutal : plus les événements sont détaillés et conservés longtemps, plus l’analyse produit est commode, mais plus l’exposition en cas de fuite, d’accès abusif ou de réquisition augmente. La recommandation est de collecter des événements agrégables et pseudonymes par défaut, avec consentement explicite pour tout usage non nécessaire au fonctionnement, et de réserver l’identification directe à des diagnostics bornés dans le temps.

Le consentement n’est pas une case décorative placée après trois écrans d’interface. Il doit être libre, spécifique, éclairé et révocable. Pour une application, cela impose de séparer au moins trois finalités :

  1. la télémétrie technique nécessaire au service, par exemple taux d’échec, latence, version cliente et classe d’erreur ;
  2. la mesure d’usage produit, par exemple activation d’une fonction ou abandon d’un parcours ;
  3. l’analyse comportementale, le profilage ou le partage avec un tiers.

La première peut parfois reposer sur une autre base légale que le consentement, sous réserve de l’analyse applicable au traitement. La deuxième et la troisième ne doivent jamais être fusionnées dans un libellé du genre « améliorer l’expérience ». Cette formule produit surtout des audits irrités et des exports de données impossibles à défendre. La gouvernance des données doit attribuer une finalité, un responsable et une durée à chaque famille d’événements.

Un choix de consentement doit voyager avec l’événement ou être appliqué avant son émission. Filtrer après ingestion est insuffisant : le collecteur a déjà reçu ce qui ne devait pas partir. Le client doit donc disposer d’un état local signé ou lié à la session, mis à jour immédiatement lors de la révocation. Côté serveur, une liste de refus par identifiant pseudonyme complète ce mécanisme pour couvrir les versions anciennes, les files de reprise et les envois retardés.

La révocation ne retire pas rétroactivement les données déjà agrégées de façon irréversible. Elle doit en revanche arrêter les flux futurs, déclencher la suppression des événements encore identifiables et produire une preuve d’exécution. Promettre l’effacement d’une statistique déjà fusionnée à des milliers d’autres relève de la magie administrative, discipline réputée mais peu interopérable.

Un schéma de télémétrie doit être traité comme une interface de sécurité. Toute propriété libre, tout champ arbitraire et toute charge utile brute finissent par recevoir un jeton d’accès, une adresse électronique, un document ou un message d’erreur bavard. Les kits de suivi qui acceptent n’importe quel objet JavaScript Object Notation (JSON) sont pratiques jusqu’au jour où ils deviennent une benne à données.

Définir un catalogue versionné : nom d’événement, finalité, champs autorisés, type, cardinalité attendue, sensibilité, durée de rétention et destination. Le pipeline rejette les champs inconnus, tronque les chaînes selon une limite définie et bloque les motifs interdits, notamment adresses électroniques, numéros de téléphone, jetons Bearer, cookies et paramètres d’URL. Un rejet doit être compté sans journaliser la valeur rejetée. Enregistrer le secret trouvé pour prouver qu’on l’a trouvé reste une forme assez élaborée de fuite.

Éviter les identifiants stables lorsqu’un identifiant de période suffit. Un identifiant d’installation renouvelé tous les 30 jours permet de compter les utilisateurs actifs sur une période, mais ne permet pas de reconstruire un historique annuel par défaut. Pour limiter les doublons entre appareils, utiliser une table de correspondance séparée, chiffrée et accessible uniquement à un service de rapprochement dédié. Cette table est le vrai actif sensible, pas le tableau de bord aux couleurs rassurantes.

Le hachage seul ne pseudonymise pas correctement une adresse électronique. Une adresse a une faible entropie et se réidentifie par dictionnaire. Utiliser un Message Authentication Code (MAC) fondé sur Hash-based Message Authentication Code (HMAC), avec une clé secrète distincte par finalité et une rotation planifiée. La clé ne doit pas être dans le code client, ni dans une variable de construction récupérable par le premier artefact de livraison venu.

La cryptographie appliquée donne les primitives, pas la finalité métier. Un identifiant parfaitement chiffré reste une donnée personnelle s’il peut être relié à une personne par un composant autorisé. Le chiffrement réduit l’impact d’un accès non autorisé, il n’autorise pas une collecte excessive.

Pipeline de télémétrie et cloisonnement des accès

Section intitulée « Pipeline de télémétrie et cloisonnement des accès »

Le chemin recommandé comporte quatre zones distinctes : émission cliente, point de collecte, stockage brut à durée courte, puis agrégation. Le stockage brut ne doit pas servir directement aux outils de visualisation. Les tableaux de bord interrogent des agrégats ou des vues filtrées, jamais la file d’événements telle qu’elle arrive. Cette séparation limite les erreurs d’analyse, qui constituent une menace interne bien plus banale qu’une attaque de cinéma.

Protéger le transport par Transport Layer Security (TLS) avec validation stricte du certificat côté client. L’authentification de l’émetteur dépend du risque : un jeton public d’application identifie un produit, pas un utilisateur ni une installation. Il ne protège donc pas contre l’injection d’événements fabriqués. Pour les données ayant un effet sur une décision, signer les lots côté serveur ou utiliser une attestation de terminal lorsqu’elle est disponible, en acceptant ses limites de couverture.

Les accès d’analyse doivent passer par une fédération d’identité avec authentification multifacteur et rôles séparés : opérateur de pipeline, analyste agrégat, enquêteur habilité aux données brutes. Aucun rôle ne doit cumuler administration de la collecte, lecture des identifiants et export externe. La gestion des privilèges appartient au domaine des identités, pas à un groupe partagé nommé analytics-admin-final-v2.

Chiffrer les stockages avec une clé de chiffrement de données, puis protéger cette clé par une clé de chiffrement de clés. Une Key Encryption Key (KEK) réside idéalement dans un Hardware Security Module (HSM) ou dans un service de gestion de clés ayant des journaux d’audit et une séparation des rôles. La rotation des clés doit préserver la capacité à lire les données non expirées, puis rendre les anciennes clés indisponibles après purge confirmée.

Le mécanisme ne garantit pas l’intégrité sémantique des événements. TLS protège le trajet, pas la véracité d’un clic déclaré par un client modifié. Les données d’usage ne doivent donc jamais, seules, déclencher une sanction, une facturation, une décision d’accès ou une détection de fraude. Pour ces usages, il faut des sources serveur corrélées, des contrôles d’intégrité et une politique d’investigation.

Le contrat suivant illustre une émission côté serveur. L’adresse électronique n’est jamais placée dans l’événement : un identifiant de période est calculé dans un service séparé. La liste blanche est appliquée avant l’envoi, pas dans un entrepôt de données où les regrets prennent beaucoup de place.

# Python 3.11+, variable TELEMETRY_HMAC_KEY fournie par un gestionnaire de secrets.
# La clé est spécifique à cette finalité et ne doit jamais être exposée au client.
import base64
import hashlib
import hmac
import os
from datetime import datetime, timezone
def period_identifier(account_id: str, month: str) -> str:
key = os.environ["TELEMETRY_HMAC_KEY"].encode()
material = f"{month}:{account_id}".encode()
digest = hmac.new(key, material, hashlib.sha256).digest()
return base64.urlsafe_b64encode(digest[:18]).decode().rstrip("=")
event = {
"name": "feature_activated",
"schema_version": 1,
"occurred_at": datetime.now(timezone.utc).isoformat(),
"period_id": period_identifier("account-123", "2026-09"),
"feature": "export_pdf", # Valeur issue d'une énumération contrôlée.
"client_version": "4.8.2",
}
# Refuser toute propriété hors contrat avant transmission.
allowed = {"name", "schema_version", "occurred_at", "period_id", "feature", "client_version"}
assert set(event) <= allowed

La rotation mensuelle de l’identifiant rend les comparaisons intermensuelles impossibles sans couche de rapprochement. C’est volontaire. Si le besoin métier exige une cohorte sur douze mois, conserver un identifiant annuel distinct dans un espace à accès plus restreint, avec une finalité documentée. Le choix dépend d’une question précise : faut-il mesurer une tendance agrégée ou suivre un même compte ? Les deux exigences ne justifient pas le même niveau d’exposition.

La durée de rétention doit être appliquée par le stockage, pas seulement écrite dans une politique. Configurer une expiration automatique au niveau des partitions ou des objets, puis vérifier chaque jour que les suppressions attendues ont eu lieu. Les événements bruts ont rarement une raison de dépasser 30 à 90 jours. Les agrégats non identifiants peuvent vivre davantage si la réidentification est techniquement exclue et si les dimensions rares sont supprimées.

Une rétention par date d’ingestion est insuffisante pour les files de reprise. Un événement créé avant la limite, puis livré tardivement, doit expirer selon sa date de survenue, avec une fenêtre de tolérance explicitement définie. Rejeter les événements trop anciens évite qu’un terminal hors ligne restaure une collection oubliée. Les applications mobiles adorent les files locales : elles les aiment surtout après une longue absence réseau, quand plus personne ne les surveille.

Les sauvegardes constituent l’exception la plus souvent oubliée. Une suppression opérationnelle n’efface pas immédiatement les copies chiffrées. Documenter leur délai maximal de purge, limiter leur durée, et empêcher toute restauration globale qui réintroduirait des données expirées dans le système actif. Une restauration doit rejouer les règles de rétention avant toute remise à disposition.

Superviser quatre signaux : hausse des rejets de schéma, volume par événement et version cliente, échecs de purge, exports de données brutes. Ajouter des alertes sur les valeurs à cardinalité anormale, qui signalent souvent un identifiant injecté dans un champ censé contenir une énumération. Les journaux d’accès aux données brutes doivent être immuables, horodatés et revus. Une journalisation non consultée est une alarme incendie installée derrière une armoire.

Sans cette discipline, l’entrepôt de télémétrie devient une cartographie exploitable : un accès en lecture, même limité, suffit à relier chaque compte à sa version cliente et à repérer ceux qui exécutent encore une version vulnérable, donc à cibler une attaque. Des séquences d’événements rattachées à un identifiant stable se réidentifient sans nom ni adresse, par simple combinaison de fuseau horaire, de modèle de terminal et de fonctions rarement utilisées. En cas d’incident, l’absence de rétention appliquée et de catalogue empêche de circonscrire le périmètre touché : la notification doit alors couvrir tout l’historique collecté, faute de pouvoir prouver ce qui avait déjà disparu. Enfin, une demande d’accès ou d’effacement ne peut recevoir de réponse exhaustive, puisque personne ne sait quels champs ont réellement transporté des données personnelles.

Une application peut envoyer des informations sur son fonctionnement : une fonction a été ouverte, une erreur est arrivée, une version est utilisée. Avant l’envoi, elle doit décider quelles informations sont nécessaires. Elle retire les noms, les messages saisis et tout élément qui permet de reconnaître directement une personne. Si elle doit compter des usages, elle crée un identifiant qui change régulièrement, afin de ne pas suivre la même personne trop longtemps.

Certaines collectes demandent un accord explicite. Cet accord est enregistré avant l’envoi. Si la personne le retire, les envois futurs s’arrêtent et les données encore liées à elle sont supprimées selon les règles prévues. Les données passent par une connexion chiffrée vers un service de réception. Ce service refuse les champs non prévus, les textes trop longs et les contenus qui ressemblent à des secrets.

Les événements récents sont conservés peu de temps pour rechercher un problème. Ensuite, ils sont supprimés ou transformés en statistiques, par exemple un total d’utilisations par version. Les personnes qui analysent ces statistiques ne doivent pas accéder aux données brutes sans autorisation particulière. Des contrôles vérifient aussi que les suppressions fonctionnent, y compris après la restauration d’une sauvegarde. Si un téléphone envoie des données trop anciennes ou interdites, le serveur les refuse.

À lire aussi

Pages voisines

: les deux pages se citent l’une l’autre.