Aller au contenu

Blog ·

Un export que l’on peut vérifier

Un export de données comme tâche durable : un fichier temporaire renommé, un sha256 dans le reçu, un jeton à usage unique et un dossier tenant deux rôles.

Par Provibr

L’article 20 du règlement européen sur la protection des données donne à une personne le droit de recevoir ses données. Sur une plateforme d’hébergement, ce n’est pas un petit fichier. Un export d’organisation lit environ soixante-dix sections, chacune plafonnée à vingt-cinq mille lignes, et cela prend des minutes et non des millisecondes.

Jusqu’à récemment, le nôtre se construisait dans une action serveur : une requête web assemblait l’ensemble en mémoire et le renvoyait sous forme d’une seule chaîne dans la réponse. Cela marche jusqu’au compte où cela cesse de marcher, et ce compte est précisément celui qui en a le plus besoin.

C’est une tâche, et il n’y a qu’un seul chemin

Un export est désormais une opération durable en quatre étapes : en file, collecte, mise en paquet, prêt. Un ouvrier dans la passerelle le prend toutes les trente secondes, verrouille une ligne, construit les sections, écrit le fichier et rend un jeton.

Quatre nombres tiennent l’ensemble, et chacun est une décision et non une valeur par défaut.

LimiteValeurPourquoi celle-là
Lignes par section25 000Au-delà, c’est un rapport et non une demande d’accès, et la coupure est nommée plutôt que cachée
Lien de téléchargement24 heuresAssez pour récupérer, assez peu pour qu’un vieux lien dans une boîte ne vaille rien
Le fichier sur disque7 joursC’est une copie complète de tout ce que nous détenons, cela ne doit pas devenir une archive
La trace de ce qui a été remis90 joursLa preuve qu’un droit a été exercé survit au fichier qu’elle a produit

L’ancien chemin synchrone n’a pas été conservé comme raccourci pour les petits comptes, et c’était une décision réfléchie et non de la paresse.

Deux chemins, ce sont deux vérités. Lequel des deux tourne dépendrait d’une estimation préalable, et l’estimation qui compte ici est ce compte est-il petit, ce que l’on ne peut justement pas savoir avant d’avoir compté les sections. Si elle se trompe, l’export tombe sur le chemin où il n’y a pas de filet.

Deux chemins, ce sont aussi deux sortes de preuve. La ligne d’audit, le reçu portant une somme de contrôle et la liste des sections tronquées n’existent que sur le chemin de la tâche. Un petit export serait livré en silence sans rien de tout cela, et la question qu’avons-nous remis en mars recevrait une réponse dépendant de la taille du compte à l’époque.

Le prix est un clic de plus, et ce clic allait de toute façon exister : le travail long a sa place dans le tiroir des tâches, et c’est là qu’il se trouve maintenant, avec une barre de progression au lieu d’un navigateur qui ne fait rien pendant deux minutes.

Où le code devait vivre

Les constructeurs ont déménagé de l’application web vers le paquet qui détient les accès à la base de données. Ce n’était pas du rangement. L’image de la passerelle copie la passerelle et les paquets partagés et ne copie pas le dossier web, si bien qu’un import atteignant web/lib compile en local et manque en production. C’est une frontière mesurée et non une question de style.

L’opération d’export porte en outre le type de ressource account, et c’est le premier sans module. Toute autre opération durable concerne un serveur, un agent, un matériel ou une automatisation, et chacun relève d’un module de droits qui décide qui peut la voir. Un export de compte ne relève de personne : l’ensemble de droits d’un membre porte des droits et non une identité. La visibilité se règle en demandant si la personne qui regarde est celle qui l’a demandé, et le canal en direct répond non pour tous les autres.

Un fichier temporaire, puis un renommage

Le fichier est écrit sous le nom <nom>.part puis renommé à sa place. Un renommage dans un même dossier est atomique, une lecture ne peut donc jamais obtenir la moitié d’un fichier, et un demi-fichier est pire que pas de fichier : il porte une somme de contrôle fausse et rien qui dise pourquoi.

La somme de contrôle est un sha256 des octets, et elle figure à côté de la taille dans le reçu. C’est ce qui rend l’export vérifiable et non simplement livré. Qui détient le fichier dans un an peut encore montrer qu’il s’agit bien du fichier que nous avons produit.

Le dossier est un point de montage accroché à deux conteneurs : en lecture et écriture dans la passerelle, qui écrit, et en lecture seule dans l’application web, qui sert. Deux processus, deux rôles, un dossier.

Ce montage s’oublie facilement, et l’oublier produit un tableau de panne très particulier et très déroutant. La tâche dit prêt. Le téléchargement répond 410. Rien dans le journal ne dit mauvais dossier, car du point de vue de chacun des deux processus tout a fonctionné. Le code avertit donc une fois, bruyamment, si le dossier n’est pas configuré, et le repli est un chemin à côté du dépôt et non le dossier temporaire du système : un fichier là-bas disparaît au redémarrage, et alors une ligne qui dit prêt à télécharger pointe vers rien.

Le jeton est à usage unique, et l’usage unique tient en une instruction

Le lien de téléchargement porte un jeton valable vingt-quatre heures, tandis que le fichier lui-même reste sept jours.

Les deux limites sont nécessaires. L’usage unique seul laisserait un jeton utilisable des mois tant que personne ne clique. La durée seule le rendrait réutilisable une journée par quiconque voit l’adresse : un journal de mandataire, un historique de navigation, une boîte partagée. Qui arrive trop tard demande un nouvel export, ce qui coûte une minute et donne une copie fraîche et exacte plutôt qu’un lien qui traîne une semaine dans une messagerie.

Le verrou qui impose réellement l’usage unique n’est pas l’horodatage. C’est une seule instruction conditionnelle : mets à jour la ligne, pose l’heure de téléchargement, là où l’heure de téléchargement est encore vide. Deux requêtes simultanées portant le même jeton touchent ensemble exactement une ligne, et la seconde en reçoit zéro. Vérifier puis écrire feraient deux instructions et donc deux occasions de s’intercaler.

Le jeton seul ne suffit pas non plus. L’appelant transmet la personne connectée, et ce doit être celle qui a demandé l’export, raison pour laquelle cette route tourne sous la règle de session et non sous la règle des jetons. Et le contrôle de propriété passe avant tout autre refus : qui ne devrait pas détenir le jeton ne doit pas non plus en apprendre si l’export est périmé ou déjà récupéré.

Sept jours pour le fichier, c’est court à dessein. Le fichier est une copie complète de tout ce que nous détenons sur une personne ou une organisation, et tant qu’il existe il est un second endroit où tout cela se trouve. Une sauvegarde l’emporte, et la liste blanche minutieuse qui décide de ce qui entre dans un export a fait son travail au moment de l’écriture et ne protège plus rien ensuite. Ce n’est expressément pas une durée de conservation des données elles-mêmes, qui vivent en base avec leurs propres règles. C’est la durée d’une copie.

La troncature est un contrôle ouvert, pas une note de bas de page

Chaque section s’arrête à vingt-cinq mille lignes. Une section qui a heurté ce plafond est nommée dans l’enveloppe et apparaît dans le reçu comme contrôle ouvert : quelque chose sur quoi la personne qui lit est censée agir, à côté du résultat et non enfoui dedans. Un export qui s’arrêterait en silence au plafond serait une réponse à une demande d’accès incomplète sans le dire, et c’est pire qu’un refus.

Mesuré avec un compte portant vingt-cinq mille cinq lignes dans une section : la section a été tronquée, le contrôle ouvert est apparu, et une seconde tentative sur le même lien a répondu 410.

Une table délibérément laissée dehors, avec la raison à côté

Tout n’entre pas, et la liste de ce qui reste dehors porte une justification écrite par table plutôt qu’une phrase de politique en tête.

L’exemple le plus clair est le grand livre de consommation de la supervision. Il y a là trois tables : les seaux horaires, la ligne de droits et la ligne par sonde envoyée en dessous. Les deux premières y vont, car ce qu’une demande d’accès veut savoir, c’est combien a été mesuré pour moi et ce que mon compte avait le droit d’avoir, et c’est exactement ce que disent ces deux-là. La troisième compte des centaines de milliers de lignes par mois avec les mêmes totaux, et c’est l’administration de notre envoi plutôt que quelque chose que la clientèle a saisi.

Ce raisonnement porte une date. Si ce grand livre devait un jour porter une ligne de facture, l’omission doit être repesée, car la ligne de preuve derrière une écriture n’est pas la même sorte de donnée qu’un journal d’envoi. L’écrire à côté de l’exception, c’est la différence entre une décision et une habitude.

Deux autres tables restent dehors pour la même raison : l’administration par tentative sous une mesure due, et les tics de planification eux-mêmes. Toutes deux disent quelque chose sur la façon dont nous avons exécuté et rien sur la personne qui demande.

Ce que cela donne vu de l’extérieur

Quelqu’un demande ses données. Une carte apparaît dans le tiroir des tâches avec une barre de progression. Quelques minutes plus tard, il y a une notification, un lien de téléchargement qui fonctionne une fois, et un reçu qui nomme la taille, la somme de contrôle et tout ce qui a été coupé. Sept jours après, le fichier a disparu, et la trace de ce qui a été remis reste quatre-vingt-dix jours.

Rien de tout cela n’est remarquable, et c’est bien le but. Ce qui est remarquable, c’est ce qui manque : aucun chemin où la même demande produit une autre sorte de preuve, aucun fichier lisible pendant qu’il est à moitié écrit, et aucun lien qui continue de marcher après usage.

Issu du travail de plateforme de Provibr. Pourquoi la vue des opérations lit des lignes existantes et n’y réécrit jamais se trouve dans projeter, jamais remplacer, et pourquoi une barre de progression refuse ici de prédire une fin se trouve dans une barre de progression qui refuse de deviner.

Commencez avec un hôte et un agent

Créez un compte, installez l’agent avec une seule commande et connectez votre premier hôte Proxmox. La période d’essai dure 14 jours et ne demande aucune coordonnée de paiement.