Lire un registre de changements enchaîné par hachage, et le revérifier soi-même
Un registre enchaîné vaut ce qu’une seconde personne peut vérifier seule. Ce qu’une ligne contient, ce que la chaîne prouve par elle-même, et ce qu’elle confie à d’autres contrôles. Puis comment un auditeur revérifie un export avec ses propres outils.
Un registre de changements mérite son nom en étant lisible par quelqu’un qui n’était pas dans la pièce. Chaque changement gouverné écrit une ligne. La ligne est délibérément ennuyeuse.
Quand, et qui
Un horodatage. L’adresse e-mail de la personne qui a agi. Le rôle qu’elle tenait à ce moment-là. Le rôle est écrit sur le moment, pas recherché plus tard. Les rôles changent, et ce registre parle du jour où c’est arrivé.
Où, et quoi
La surface sur laquelle le changement a été fait. L’action entreprise. La cible sur laquelle elle a agi. La couche sémantique, le relais, les clés de fournisseurs, les exécutions de scripts et la console d’administration écrivent tous ici.
L’état, sous forme de hachages
Une empreinte de contenu de l’état avant, et une de l’état après. Les valeurs elles-mêmes restent hors du registre. Un enregistrement de changement d’identifiant peut exister sans que l’identifiant soit nulle part à proximité.
Le lien
Le hachage de l’entrée précédente, et le propre hachage de cette entrée. Ces deux champs sont la chaîne.
Détails
Un petit dictionnaire de contexte. Il passe par le même nettoyeur que la piste d’audit de l’exploitant. Les clés ayant la forme d’un secret sont retirées avant que quoi que ce soit n’atteigne le fichier.
Il se tient à côté de la piste d’audit de l’exploitant plutôt que de la remplacer. Deux registres, deux lecteurs. La piste d’audit est l’historique de console qu’un administrateur parcourt pendant la semaine. Le registre est ce que quelqu’un lit un an plus tard, sans aucun souvenir de tout cela.
Ce que la chaîne prouve
Chaque hachage d’entrée est un SHA-256 sur deux choses jointes. D’abord, la forme canonique de l’entrée, son propre hachage retiré. Ensuite, le hachage de l’entrée précédente. Canonique signifie les clés triées dans un ordre fixe, sans espace superflu. La même entrée se sérialise alors toujours en les mêmes octets. La première entrée est liée à soixante-quatre zéros.
Ce que cette construction apporte mérite d’être énoncé précisément. Modifiez un caractère d’un champ enregistré, supprimez une ligne, ou échangez deux lignes. Chaque lien à partir de ce point cesse de correspondre. La vérification parcourt tout le fichier. Elle signale l’index de la première mauvaise ligne et la raison. Cette raison est l’une de trois : une ligne mal formée, un lien brisé, ou un hachage en désaccord avec son propre contenu.
Nommer la première mauvaise ligne fait l’essentiel de la valeur. Quelque chose ne va pas quelque part dans cinquante mille lignes est une alarme. Ligne 8 214, hachage divergent, est un point de départ. Cela borne aussi la question, parce que tout ce qui précède a été vérifié.
La fonction est du SHA-256 simple sans clé secrète. C’est un compromis délibéré. Une construction à clé prouverait que le registre vient de nous. Une construction sans clé laisse quiconque détient l’export le vérifier avec trente lignes de son propre script. Pour un auditeur, c’est de loin la propriété la plus utile.
Des questions pour d’autres contrôles
Une chaîne répond bien à une question, et pas du tout à plusieurs autres. Savoir laquelle est laquelle compte. Cela empêche de faire confiance à un contrôle pour un travail qu’il n’a jamais fait.
Si un changement a été enregistré du tout. Une chaîne ne dit rien d’une entrée qui n’a jamais été écrite. Les écritures sont sérialisées et en ajout seulement. Une écriture qui échoue le journalise bruyamment et ne renvoie rien, sans interrompre l’action de l’administrateur. C’est le bon compromis pour une console en service. Cela signifie que la complétude repose sur le chemin d’écriture, pas sur la chaîne. Demandez ce qui se passe quand une écriture échoue, et comment vous le sauriez.
Ce qu’était réellement le changement. Avant et après sont des empreintes de contenu. Le registre confirme que l’état a changé, et qu’il correspond à un état que vous détenez déjà. Relire une ancienne valeur à partir d’un hachage dépasse ce qu’un hachage peut faire. C’est exactement pourquoi les secrets peuvent être tenus entièrement hors du registre.
Si tout le fichier a été réécrit. Une chaîne sans clé détecte une modification partielle. Quiconque capable de réécrire chaque ligne pourrait recalculer chaque lien. Ce qui y répond, c’est le chemin d’écriture en ajout seulement et les permissions de fichier. Et surtout, ce sont les copies déjà détenues par quelqu’un d’autre.
Si la chaîne a redémarré. Si la fin ne peut pas être lue au démarrage, l’ajout reprend depuis le lien de genèse. La vérification signale la jonction et ne la lisse jamais. Un lien brisé à une frontière de redémarrage a généralement une explication banale. Il mérite quand même la question.
Un éditeur qui répond aux quatre de bon cœur est plus utile qu’un éditeur qui dit que la chaîne les couvre.
Revérifier un export soi-même
L’export arrive en JSON ou en CSV, pris depuis la console du registre. Il porte les filtres qui ont été appliqués. Pour la vérification, prenez le JSON. Le CSV aplatit la colonne des détails pour qu’une personne puisse la lire, et le hachage a été calculé sur une forme différente.
Commencez avec un hachage précédent de soixante-quatre zéros.
Pour chaque ligne dans l’ordre, copiez l’objet et retirez son champ de hachage d’entrée.
Sérialisez ce qui reste en JSON. Triez les clés, ne laissez aucun espace entre les jetons, et échappez les caractères non ASCII.
Ajoutez le hachage précédent à ce texte. Encodez le résultat en UTF-8. Prenez le condensé SHA-256 en hexadécimal minuscule.
Comparez-le au hachage d’entrée enregistré. Comparez le hachage précédent enregistré de la ligne avec celui que vous avez apporté. Puis reportez le propre hachage de cette ligne.
Arrêtez-vous à la première ligne où l’une des deux comparaisons échoue. Notez son index, et quelle comparaison a échoué.
Un recalcul qui diverge à chaque ligne pointe généralement vers le sérialiseur, pas vers le registre. Cela inclut la toute première ligne. L’ordre des clés, les espaces et l’échappement unicode changent chacun les octets hachés. Se tromper sur l’un d’eux donne une réponse uniforme, assurée et complètement fausse.
Gardez le script. Une vérification que vous pouvez relancer à la demande est un contrôle. Une vérification que quelqu’un a faite une fois, en réunion, est une anecdote.
Pourquoi l’export voyage plus loin
La console affiche un badge de vérification, calculé sur tout le fichier à chaque chargement de page. Une rupture apparaît la prochaine fois que quelqu’un regarde. C’est aussi, inévitablement, le rédacteur qui rend compte de lui-même.
L’écran est aussi une vue au sens ordinaire. Il est filtré par surface, par acteur et par plage de dates. Il est trié du plus récent au plus ancien et plafonné à un nombre de lignes praticable. L’export applique les mêmes filtres avec un plafond bien plus grand. Avant de tirer une conclusion d’un compte, sachez lequel des deux vous lisez.
Un export peut quitter le bâtiment, un écran non. Un export pris aujourd’hui et détenu par votre auditeur fige la chaîne à aujourd’hui. Tout désaccord ultérieur entre sa copie et la vôtre apparaît dans une simple comparaison. Cela ne demande de confiance en aucune des deux parties. C’est la propriété autour de laquelle il vaut la peine de concevoir toute la routine.
Un export gagne en valeur avec l’âge et la distance. Une copie, entre vos mains, sur la même machine, est une sauvegarde. Une série de copies est une preuve. Prenez-les selon un calendrier, et conservez-les là où le produit n’a aucun accès en écriture.
Une routine que vous pouvez répéter
À la fin de chaque période, exportez la plage complète en JSON. N’appliquez aucun filtre.
Vérifiez-la avec votre propre script, et gardez l’export et le script ensemble.
Comparez le nouvel export au précédent. Chaque ligne qu’ils partagent doit être identique, caractère pour caractère. C’est la vérification qui attrape une réécriture, que la chaîne seule laisse ouverte.
Contrôlez au hasard une poignée de lignes contre des changements dont quelqu’un se souvient. Vérifiez l’acteur et le rôle enregistré à côté.
Stockez chaque export là où le produit n’a aucun accès en écriture.
Notez qui l’a pris et quand, à côté du fichier, pas dans un système séparé.
La troisième étape transforme un fichier cohérent avec lui-même en fichier audité. Elle coûte une commande de comparaison. Tout le reste de cette page est une préparation à son exécution.
Une affirmation est une phrase. Une preuve est quelque chose qu’une seconde personne peut vérifier sans vous demander. Ce qu’une piste d’audit doit contenir, ce qu’un hachage prouve réellement, et ce qu’il faut exiger de tout outil qui prétend en produire une.
Quatre choses se font appeler gouvernance : la certification, la propriété, le contenu obsolète et le contrôle des changements. Ici, chacune est écrite comme une vérification que vous pouvez lancer, pas comme un objectif que vous pouvez énoncer. Il y est aussi question du seul changement qui passe une revue visuelle et reste faux.
La règle approuver pour exécuter, en mots simples. L’assistant lit, explique et propose, et une personne possède le chemin d’écriture. Ce que cela coûte, ce que cela rapporte, et trois questions à poser à toute fonctionnalité d’IA.