Blog ·
Ein Export, den man nachprüfen kann
Eine Datenauskunft als dauerhafte Aufgabe: eine Zwischendatei, die umbenannt wird, eine sha256 im Beleg, ein Einmaltoken und ein Verzeichnis in zwei Rollen.
Von Provibr
Artikel 20 der Datenschutzgrundverordnung gibt einer Person das Recht, ihre Daten zu erhalten. Auf einer Hostingplattform ist das keine kleine Datei. Ein Organisationsexport liest rund siebzig Abschnitte, jeder auf fünfundzwanzigtausend Zeilen begrenzt, und das dauert Minuten statt Millisekunden.
Bis vor Kurzem wurde unserer in einer Serveraktion gebaut: eine Webanfrage stellte das Ganze im Speicher zusammen und gab es als eine Zeichenkette in der Antwort zurück. Das funktioniert bis zu dem Konto, bei dem es nicht mehr funktioniert, und genau dieses Konto braucht den Export am dringendsten.
Es ist eine Aufgabe, und es gibt nur einen Weg hindurch
Ein Export ist jetzt ein dauerhafter Vorgang mit vier Stufen: eingereiht, sammeln, verpacken, fertig. Ein Arbeiter im Tor greift ihn alle dreißig Sekunden auf, sperrt eine Zeile, baut die Abschnitte, schreibt die Datei und gibt ein Token zurück.
Vier Zahlen halten das Ganze zusammen, und jede davon ist eine Entscheidung und kein Vorgabewert.
| Grenze | Wert | Warum gerade die |
|---|---|---|
| Zeilen je Abschnitt | 25.000 | Alles darüber ist ein Bericht und keine Betroffenenanfrage, und der Schnitt wird benannt statt versteckt |
| Downloadlink | 24 Stunden | Lang genug zum Abholen, kurz genug, dass ein alter Link im Postfach wertlos ist |
| Die Datei auf der Platte | 7 Tage | Sie ist eine vollständige Kopie von allem, was wir halten, und soll kein Archiv werden |
| Der Nachweis des Herausgegebenen | 90 Tage | Der Beleg, dass ein Recht ausgeübt wurde, überlebt die Datei, die daraus entstand |
Der alte gleichzeitige Weg ist nicht als Abkürzung für kleine Konten stehen geblieben, und das war eine bewusste Entscheidung und keine Faulheit.
Zwei Wege sind zwei Wahrheiten. Welcher der beiden läuft, hinge von einer Schätzung im Voraus ab, und die Schätzung, auf die es hier ankommt, lautet ist dieses Konto klein, und genau das lässt sich nicht wissen, bevor die Abschnitte gezählt sind. Liegt sie daneben, fällt der Export auf dem Weg um, auf dem es kein Netz gibt.
Zwei Wege sind auch zwei Arten von Nachweis. Die Prüfzeile, der Beleg mit einer Prüfsumme darin und die Liste abgeschnittener Abschnitte gibt es nur auf dem Aufgabenweg. Ein kleiner Export würde still ohne all das geliefert, und die Frage was haben wir im März herausgegeben bekäme eine Antwort, die davon abhängt, wie groß das Konto damals war.
Der Preis ist ein Klick mehr, und diesen Klick hätte es ohnehin gegeben: langlaufende Arbeit gehört in die Aufgabenlade, und dort steht sie nun, mit einer Fortschrittsanzeige statt eines Browsers, der zwei Minuten lang nichts tut.
Wo der Code hinmusste
Die Erbauer sind aus der Webanwendung in das Paket umgezogen, dem die Datenbankzugriffe gehören. Das war kein Aufräumen. Das Torabbild kopiert das Tor und die geteilten Pakete und kopiert das Webverzeichnis nicht, also übersetzt ein Import, der nach web/lib greift, lokal und fehlt in der Produktion. Es ist eine gemessene Grenze und keine Stilfrage.
Der Exportvorgang hat außerdem die Ressourcenart account, und es ist die erste Art ohne Modul. Jeder andere dauerhafte Vorgang betrifft einen Server, eine Agentin, ein Stück Hardware oder eine Automatisierung, und jedes davon fällt unter ein Rechtemodul, das entscheidet, wer ihn sehen darf. Ein Kontoexport fällt unter niemanden: die Rechtemenge eines Mitglieds trägt Rechte und keine Identität. Sichtbarkeit wird beantwortet, indem gefragt wird, ob die betrachtende Person diejenige ist, die ihn angefordert hat, und der Live-Kanal antwortet für alle anderen mit nein.
Eine Zwischendatei, dann ein Umbenennen
Die Datei wird als <name>.part geschrieben und dann an ihren Platz umbenannt. Ein Umbenennen innerhalb eines Verzeichnisses ist unteilbar, eine lesende Seite kann also nie eine halbe Datei bekommen, und eine halbe Datei ist schlimmer als gar keine: sie hat eine Prüfsumme, die nicht stimmt, und nichts, das sagt warum.
Die Prüfsumme ist eine sha256 der Bytes, und sie steht neben der Größe im Beleg. Das macht den Export nachprüfbar statt bloß ausgeliefert. Wer die Datei in einem Jahr noch hat, kann weiterhin zeigen, dass es die Datei ist, die wir erzeugt haben.
Das Verzeichnis ist eine Einhängung, die in zwei Containern hängt: schreibend im Tor, das schreibt, und nur lesend in der Webanwendung, die ausliefert. Zwei Prozesse, zwei Rollen, ein Verzeichnis.
Diese Einhängung vergisst man leicht, und das Vergessen erzeugt ein sehr eigenes und sehr verwirrendes Fehlerbild. Die Aufgabe sagt fertig. Der Download antwortet mit 410. Nichts im Protokoll sagt falsches Verzeichnis, denn aus Sicht jedes der beiden Prozesse hat alles geklappt. Der Code warnt deshalb einmal, laut, wenn das Verzeichnis nicht eingestellt ist, und der Rückfall ist ein Pfad neben dem Projektverzeichnis und nicht das Systemverzeichnis für Flüchtiges: eine Datei dort verschwindet bei einem Neustart, und dann zeigt eine Zeile, die bereit zum Download sagt, auf nichts.
Das Token ist einmalig, und einmalig ist eine einzige Anweisung
Der Downloadlink trägt ein Token, das vierundzwanzig Stunden gilt, während die Datei selbst sieben Tage bleibt.
Beide Grenzen werden gebraucht. Nur einmalig ergäbe ein Token, das monatelang brauchbar bleibt, solange niemand darauf klickt. Nur zeitlich begrenzt machte es einen Tag lang wiederverwendbar für alle, die die Adresse sehen: ein Vermittlungsprotokoll, ein Browserverlauf, ein geteiltes Postfach. Wer zu spät kommt, fordert einen neuen Export an, und das kostet eine Minute und ergibt eine frische, richtige Kopie statt eines Links, der eine Woche lang in einem Postfach herumliegt.
Die Sperre, die Einmaligkeit wirklich durchsetzt, ist nicht der Zeitstempel. Es ist eine bedingte Anweisung: aktualisiere die Zeile, setze den Abholzeitpunkt, dort wo der Abholzeitpunkt noch leer ist. Zwei gleichzeitige Anfragen mit demselben Token treffen zusammen genau eine Zeile, und die zweite bekommt null zurück. Prüfen und dann schreiben wären zwei Anweisungen und damit zwei Gelegenheiten, dazwischenzukommen.
Das Token allein genügt auch nicht. Die aufrufende Seite reicht die angemeldete Person mit, und die muss die anfordernde sein, weshalb diese Route unter der Sitzungsregel und nicht unter der Tokenregel läuft. Und die Eigentumsprüfung geht jeder anderen Zurückweisung voraus: wer das Token nicht haben sollte, soll daraus nicht lernen, ob der Export abgelaufen oder schon abgeholt ist.
Sieben Tage für die Datei sind mit Absicht kurz. Die Datei ist eine vollständige Kopie von allem, was wir über eine Person oder eine Organisation halten, und solange sie existiert, ist sie ein zweiter Ort, an dem all das liegt. Eine Sicherung nimmt sie mit, und die sorgfältige Erlaubnisliste, die entscheidet, was in einen Export kommt, hat ihre Arbeit in dem Moment getan, als die Datei geschrieben wurde, und schützt danach nichts mehr. Es ist ausdrücklich keine Aufbewahrungsfrist für die Daten selbst, die in der Datenbank unter eigenen Regeln liegen. Es ist die Frist einer Abschrift.
Abschneiden ist eine offene Prüfung und keine Fußnote
Jeder Abschnitt hört bei fünfundzwanzigtausend Zeilen auf. Ein Abschnitt, der an diese Decke stieß, wird im Umschlag benannt und erscheint im Beleg als offene Prüfung: etwas, worauf die lesende Person reagieren soll, neben dem Ergebnis und nicht darin vergraben. Ein Export, der still an der Decke aufhörte, wäre eine Antwort auf eine Betroffenenanfrage, die unvollständig ist, ohne das zu sagen, und das ist schlimmer als eine Zurückweisung.
Gemessen mit einem Konto, das fünfundzwanzigtausendfünf Zeilen in einem Abschnitt trug: der Abschnitt wurde abgeschnitten, die offene Prüfung erschien, und ein zweiter Versuch mit demselben Downloadlink antwortete mit 410.
Eine Tabelle bewusst ausgelassen, mit dem Grund daneben
Nicht alles kommt hinein, und die Liste dessen, was draußen bleibt, trägt eine geschriebene Begründung je Tabelle statt eines Grundsatzsatzes obenan.
Das deutlichste Beispiel ist das Verbrauchsbuch der Überwachung. Dort stehen drei Tabellen: die Stundeneimer, die Grenzenzeile und die Zeile je verschickter Prüfung darunter. Die ersten beiden kommen mit, denn was eine Betroffenenanfrage wissen will, ist, wie viel für mich gemessen wurde und was mein Konto durfte, und genau das steht in diesen beiden. Die dritte sind hunderttausende Zeilen im Monat mit denselben Summen, und sie ist die Verwaltung unseres Versands statt etwas, das die Kundschaft eingetragen hat.
Diese Begründung trägt ein Datum. Sollte dieses Buch je eine Rechnungszeile tragen, gehört die Auslassung neu abgewogen, denn die Belegzeile hinter einer Buchung ist eine andere Art Angabe als ein Versandprotokoll. Das neben die Ausnahme zu schreiben ist der Unterschied zwischen einer Entscheidung und einer Gewohnheit.
Zwei weitere Tabellen bleiben aus demselben Grund draußen: die Verwaltung je Versuch unter einer geschuldeten Messung und die Planungsticks selbst. Beide sagen etwas darüber, wie wir es ausgeführt haben, und nichts über die fragende Person.
Wie es von außen aussieht
Jemand fordert seine Daten an. In der Aufgabenlade erscheint eine Karte mit einer Fortschrittsanzeige. Ein paar Minuten später gibt es eine Benachrichtigung, einen Downloadlink, der einmal funktioniert, und einen Beleg, der Größe, Prüfsumme und alles Abgeschnittene benennt. Sieben Tage später ist die Datei weg, und der Nachweis des Herausgegebenen bleibt neunzig Tage.
Nichts davon ist bemerkenswert, und darum geht es. Bemerkenswert ist, was fehlt: kein Weg, auf dem dieselbe Anfrage eine andere Art Nachweis erzeugt, keine Datei, die sich lesen lässt, während sie halb geschrieben ist, und kein Link, der nach dem Gebrauch weiter funktioniert.
Aus der Plattformarbeit von Provibr. Warum die Vorgangsansicht vorhandene Zeilen liest und nie zurückschreibt, steht in projizieren, niemals ersetzen, und warum eine Fortschrittsanzeige hier keine Endzeit vorhersagt, steht in eine Fortschrittsanzeige, die sich weigert zu raten.