Kategorie: Notizen

  • Vier Prüfungen, die nichts geprüft haben

    Sieben Datenbanken einer Bauart, dazu drei einer anderen, die meisten ein bis
    zwei Hauptversionen zurück — alle noch im Wartungszeitraum, aber der Abstand wird
    von allein nicht kleiner. Bei zustandslosen Diensten heißt Aktualisieren: Etikett
    hochsetzen, neu starten, fertig. Für Datenbanken stand von vornherein etwas
    anderes im Plan.

    Ein Datenverzeichnis gehört zu der Fassung, die es angelegt hat; die neue liest
    es nicht. Es braucht je Instanz einen Abzug, der vor dem Leeren der alten Ablage
    geprüft wird, eine frisch aufgesetzte Fassung und ein Zurückspielen. Acht Mal.

    Eine Falle steckte in der Wanderung selbst: Die neue Hauptversion hat den
    Einhängepunkt eine Ebene nach oben verlegt. Wer den alten Pfad einhängt, gibt der
    neuen Fassung ein leeres Verzeichnis und legt den echten Bestand daneben. Der
    Container schreibt das hin, es klingt nur nach Randnotiz.

    Prüfen lässt es sich vor dem ersten Start: sich vom Abbild ausgeben lassen,
    welchen Pfad es als Ablage führt, und ihn gegen den halten, den die Stapeldatei
    einhängt. Die übrigen vier Fallen steckten im Prüfen selbst.

    Der Abzug enthielt zu wenig

    Für den Abzug gibt es zwei Werkzeuge: eines für den ganzen Verbund samt
    Kennungen, eines für eine einzelne Datenbank. Das erste brachte bei einer Instanz
    die Systemdatenbank der alten Fassung mit und ließ das Zurückspielen scheitern.
    Also nahm ich das zweite.

    Fünf der sieben gingen glatt. Bei der sechsten meldete der Dienst, die
    Anmeldung sei gescheitert. Er meldet sich nämlich nicht mit der Kennung an, die
    der Erstlauf anlegt, sondern mit einer zweiten, die nur in seiner eigenen
    Konfiguration steht. Kennungen gelten für den ganzen Verbund und gehören zu
    keiner einzelnen Datenbank — im Abzug stand sie deshalb nicht.

    Fünf Minuten Ausfall, dann war die Kennung neu angelegt und der Besitz an
    sämtlichen Tabellen übertragen. Bei den übrigen sah ich vorher nach, welche
    Kennungen es gibt und mit welcher der Dienst sich wirklich anmeldet. Nur bei
    einer von sieben wich beides voneinander ab.

    Zählen, was man zu zählen glaubt

    Nach jedem Abzug wollte ich wissen, ob er vollständig ist. Naheliegend: die
    Zeilen zählen, die eine Tabelle anlegen. Bei einer Instanz kam ich so auf 239
    Tabellen, in der Datenbank waren es 40.

    Der Unterschied stammt aus gespeicherten Prozeduren: Deren Quelltext steht als
    Text im Abzug, und darin kommt dieselbe Anweisung dutzendfach vor. In die andere
    Richtung geht es genauso schief — ein Abzug, der mitten im Schreiben abbricht,
    hat trotzdem plausibel viele Treffer.

    Verlässlich ist die Marke, die das Werkzeug ans Ende eines vollständigen
    Abzugs setzt, und nach dem Einspielen die Auskunftstabellen der Datenbank selbst.
    Beides fragt die Wirklichkeit statt eine Zeichenkette.

    Von innen prüft man nichts

    Zum Abschluss war ein Datenbankkennwort zu wechseln. Der Wechsel ist eine
    Zeile. Die Prüfung danach lautete: Nimmt die Datenbank das neue Kennwort an, und
    weist sie das alte ab?

    Sie nahm beide an. Auch einen Fantasiewert. Für einen unangenehmen Moment sah
    es aus, als stünde die Datenbank ohne jede Prüfung offen. Stand sie nicht.

    Verbindungen von innerhalb des Containers gelten als vertrauenswürdig und
    brauchen kein Kennwort — die Vorgabe, mit der so ein Verbund eingerichtet wird,
    keine Aufweichung meinerseits. Erst für alles Übrige greift das Verfahren mit
    Kennwort.

    Ich hatte mich per Kommandoausführung in den Container gesetzt und von dort auf
    die Rückschleife verbunden, also genau den Weg genommen, auf dem nichts geprüft
    wird. Von außen war die Antwort eindeutig: neuer Wert angenommen, alter
    abgewiesen, Fantasiewert abgewiesen.

    Ein Etikett, das nur in der Datei stand

    Nach jeder Wanderung wollte ich die Fassung punktgenau festschreiben. Bei vier
    Stapeln blieb das wirkungslos: Dort steht sie nicht in der Stapeldatei, sondern
    in der Umgebungsdatei daneben, und die Stapeldatei holt sie sich von dort —
    mitsamt einem Vorgabewert für den Fall, dass sie fehlt.

    Eine Ersetzung in der Stapeldatei findet dann nichts, ändert nichts und meldet
    nichts. Der Container lief weiter mit dem alten Abbild, in der Datei stand
    unverändert die Variable, die ich für dessen Namen gehalten hatte. Aufgefallen
    ist es, weil ich den laufenden Container gefragt habe.

    Was die vier gemeinsam hatten

    Jedes Mal hatte ich etwas geprüft, das dem Ziel ähnlich sah, aber einen anderen
    Weg nahm als der Betrieb. Eine Prüfung, die nicht den Weg des Nutzers nimmt,
    prüft etwas anderes — und sie sagt einem nicht, was.

  • Wenn der Container-Dienst das Hausnetz kapert

    Wenn der Container-Dienst das Hausnetz kapert

    Es fing damit an, dass ich einen neuen Dienst hochzog — zwei Container, eine
    Datenbank, nichts Besonderes. Danach war die Fernwartung tot. Nicht langsam,
    nicht fehlerhaft: keine Antwort mehr, als gäbe es den Rechner nicht.

    Das Verwirrende war, dass alles andere weiterlief. Sämtliche Dienste waren
    von außen erreichbar, die Überwachung meldete durchgehend grün. Nur der direkte
    Weg aus dem eigenen Netz war weg.

    Was passiert war

    Container-Netze brauchen Adressbereiche, und der Dienst vergibt sie selbst,
    wenn man ihm keine vorgibt. Er arbeitet dabei eine Liste ab. Ganz oben stehen
    die üblichen Verdächtigen im 172er-Bereich. Sind die aufgebraucht — und mit
    fünfzehn Stapeln ist man da schneller, als man denkt —, geht es weiter mit
    192.168.0.0/16, aufgeteilt in Blöcke zu je 4096 Adressen.

    Der erste dieser Blöcke deckt alles von 192.168.0.0 bis
    192.168.15.255 ab. Wer sein Hausnetz in diesem Bereich betreibt,
    hat ein Problem: Der Rechner hat plötzlich zwei Wege zu denselben Adressen und
    nimmt den spezielleren — die Brücke. Antworten an das eigene Netz landen ab
    sofort im Container-Netz und verschwinden.

    Warum es so schwer zu sehen ist

    Die Dienste liefen weiter, weil eingehende Verbindungen von außen kommen und
    über einen vorgelagerten Proxy hereingereicht werden. Dieser Weg berührt die
    kaputte Route nie. Kaputt war nur die Gegenrichtung ins eigene Netz — und die
    benutzt im Alltag fast nur die Fernwartung.

    Wer in dieser Lage die Dienste prüft, bekommt Entwarnung und sucht an der
    falschen Stelle. Die eine Frage, die es entscheidet, lautet: Welchen Weg nimmt
    der Rechner zu einer Adresse in meinem Netz? Zeigt die Antwort einen
    Brückennamen statt der Netzwerkkarte, ist der Fall klar.

    Herauskommen ohne Fernwartung

    Genau dafür ist der Gastagent der Virtualisierung da. Über ihn lassen sich
    Befehle in der Maschine ausführen, ohne eine Netzverbindung zu ihr zu haben —
    der Weg führt über den Wirt. Stapel herunterfahren, Netz verschwindet, Route
    kommt zurück. Bei mir war es damit in unter einer Minute erledigt.

    Wer das nicht hat, muss an die Konsole. Es lohnt sich, vorher zu wissen,
    welchen Weg man in dieser Lage hätte.

    Damit es nicht wieder passiert

    Zwei Ebenen. Erstens: Jedem Stapel den Adressbereich fest vorgeben statt ihn
    zuteilen zu lassen. Das ist eine Zeile in der Stapeldatei und beendet die
    Zufälligkeit sofort.

    Zweitens, gründlicher: dem Dienst insgesamt vorschreiben, aus welchem Vorrat
    er vergeben darf. Das steht in seiner Konfigurationsdatei und wirkt für alle
    künftigen Netze. Bestehende behalten ihre Bereiche, nur das Standardnetz wird
    neu vergeben.

    Bei der Wahl des Vorrats gibt es eine Falle, in die ich prompt getappt bin:
    Ich nahm zusätzlich einen Bereich aus 10.0.0.0/8 — und dieser
    Bereich stand in einer Zugriffsliste meines Proxys, die interne Netze
    freigibt. Das Standardnetz landete darin, und damit war die Brücke plötzlich
    freigegeben. Zurückgenommen und auf einen Bereich beschränkt, der in keiner
    meiner Listen vorkommt.

    Und ein selbstverschuldeter Ausfall obendrauf

    Beim Korrigieren schrieb ich einen erklärenden Kommentar in die
    Konfigurationsdatei — als zusätzlicher Schlüssel, weil das Format keine
    Kommentare kennt. Die Prüfung sagte mir das auch. Ich spielte die Datei
    trotzdem ein, weil Prüfung und Einspielen bei mir zwei getrennte Schritte
    waren und ich das Ergebnis der ersten nicht ausgewertet hatte.

    Der Dienst startete nicht mehr. Alle Container standen, gut eine Minute
    lang. Die Lehre ist banal und trotzdem teuer: Wenn ein Werkzeug eine Prüfung
    anbietet, muss das Einspielen von deren Ergebnis abhängen — nicht danebenstehen.

  • Reichweitenmessung ohne Cookiebanner

    Reichweitenmessung ohne Cookiebanner

    Ich wollte wissen, ob meine Seiten überhaupt jemand aufruft. Was ich nicht
    wollte: ein Zustimmungsfenster, das jeden Besucher zuerst mit einer Frage
    begrüßt, die er nicht gestellt hat.

    Beides geht zusammen — wenn man die Messung an einer anderen Stelle
    ansetzt.

    Zwei Wege, dasselbe zu zählen

    Der übliche Weg ist ein Skript in der Seite. Es läuft im Browser, legt eine
    Kennung ab, damit es denselben Besucher beim nächsten Aufruf wiedererkennt, und
    meldet nebenbei Bildschirmgröße, Verweildauer und einiges mehr.

    Der andere Weg sitzt im Proxy, durch den ohnehin jede Anfrage läuft. Er meldet
    sie an die Auswertung weiter — im Hintergrund, ohne dass der Browser davon
    erfährt. Kein Skript, keine Ablage auf dem Gerät.

    Was der zweite Weg kostet

    Ehrlichkeit gehört dazu: Man verliert echte Angaben. Bildschirmgröße und
    Verweildauer sind nicht messbar, denn niemand meldet sie. „Eindeutige Besucher“
    wird zur Schätzung, weil sie nur noch über Adresse und Browserkennung
    zusammengefasst werden — zwei Personen im selben Anschluss mit demselben Browser
    sind eine.

    Für die Frage „liest das jemand“ reicht das. Für Werbevermarktung nicht. Man
    sollte wissen, was man tauscht.

    Und was er zusätzlich kann

    Er erfasst alles, was durch den Proxy läuft — auch Dienste, in die man kein
    Skript bekommt. Und er sieht Besucher, die Skripte blockieren; das ist je nach
    Publikum ein erheblicher Teil.

    Der Haken: Er sieht auch alles andere. Suchmaschinen, Sicherheitsscanner, die
    eigene Überwachung, Datenabgleiche zwischen den eigenen Geräten. Ungefiltert
    sind die Zahlen wertlos. Bei mir stammten in einer Stichprobe rund vierzig
    Prozent des Verkehrs von einer Datenübertragung zwischen zwei eigenen Systemen.
    Ausschlusslisten für interne Adressen und für Dateipfade, die keine Seitenaufrufe
    sind, waren keine Feinarbeit, sondern Voraussetzung.

    Die rechtliche Überlegung

    Ich bin kein Jurist. Was folgt, ist meine Abwägung als Betreiber, keine
    Rechtsberatung. Wer es genau wissen muss, fragt jemanden, der dafür haftet.

    Der Punkt, an dem die Zustimmungspflicht hängt, ist enger, als viele denken.
    Sie knüpft nicht daran an, dass gemessen wird, sondern daran, dass
    auf dem Endgerät gespeichert oder ausgelesen wird
    . Das ist der Kern der
    einschlägigen Vorschrift. Ein Cookie ist der bekannteste Fall, aber jede Ablage
    im Browser zählt — auch solche, die man nicht Cookie nennt.

    Wird nichts abgelegt und nichts ausgelesen, greift diese Vorschrift nicht.
    Damit entfällt der Anlass für das Zustimmungsfenster.

    Erledigt ist es damit nicht. Es werden weiterhin personenbezogene Daten
    verarbeitet — die Adresse des Besuchers ist eine. Dafür braucht es eine
    Rechtsgrundlage. In Frage kommt das berechtigte Interesse: Ich will wissen, ob
    und wie mein Angebot genutzt wird. Diese Grundlage verlangt eine Abwägung gegen
    die Interessen des Besuchers, und die fällt umso leichter aus, je weniger man
    tut. Deshalb ist beides sinnvoll und nicht nur Kosmetik:

    • Die Adresse wird vor dem Speichern gekürzt, sodass sie keiner Person mehr
      zuzuordnen ist.
    • Die Rohdaten werden nach einer festen Frist gelöscht, nicht auf Vorrat
      gehalten.
    • Die Einstellung „Nicht verfolgen“ des Browsers wird beachtet, obwohl sie
      rechtlich nicht bindend ist.
    • Die Daten verlassen die eigene Technik nicht.

    Was bleibt, ist die Auskunftspflicht: In der Datenschutzerklärung muss stehen,
    was gemessen wird, auf welcher Grundlage, wie lange es bleibt und wie man
    widerspricht. Wer den Banner spart, spart nicht die Erklärung.

    Der Einwand, den man kennen sollte

    Es gibt die Auffassung, jede Form der Reichweitenmessung brauche Zustimmung.
    Sie stützt sich meist darauf, dass am Ende doch ein Personenbezug entstehe. Das
    ist kein abwegiger Gedanke — er trifft nur einen anderen Punkt: die Frage der
    Rechtsgrundlage, nicht die der Zustimmung nach der Endgeräte-Vorschrift. Wer
    kürzt, löscht und nichts weitergibt, steht in dieser Abwägung gut da.

    Verlassen sollte man sich darauf nicht blind. Meine Abwägung ist die eines
    kleinen, privaten Angebots ohne Werbung und ohne Weitergabe. Bei einem
    kommerziellen Auftritt mit Reichweitenvermarktung sähe sie anders aus.

    Wann der Banner zurückkommt

    Sofort, sobald etwas eingebaut wird, das im Browser ablegt oder ausliest. Eine
    eingebettete Karte, ein Video von einem fremden Anbieter, eine nachgeladene
    Schriftart, ein Formular mit Spamschutz eines Dritten — jedes davon holt die
    Zustimmungspflicht zurück, und zwar für den ganzen Vorgang.

    Das ist der eigentliche Grund, warum ich Schriften mitliefere statt sie
    nachzuladen: nicht Ladezeit, sondern ein Absatz weniger, über den man
    nachdenken muss.

  • Warum ein Mailport kein PROXY-Protokoll verträgt

    Warum ein Mailport kein PROXY-Protokoll verträgt

    Wer seine Dienste hinter einem vorgelagerten Server betreibt, kennt das
    Problem: Der eigentliche Dienst sieht als Absender nur noch den Proxy. Für
    Protokolle im Netz ist das ein Problem, denn Sperrlisten, Begrenzungen und
    Auswertungen brauchen die echte Adresse.

    Bei Web-Verkehr löst man das mit einem zusätzlichen Kopf in der Anfrage. Bei
    reinem TCP geht das nicht — dort gibt es keine Köpfe. Die Antwort darauf ist das
    PROXY-Protokoll: Der Proxy schickt vor allen Nutzdaten eine kurze Zeile, in der
    steht, von wem die Verbindung ursprünglich kam. Der Dienst liest diese Zeile
    zuerst und behandelt alles Weitere als normalen Verkehr.

    Die stillschweigende Voraussetzung

    Das funktioniert, solange der Client zuerst spricht. Bei
    verschlüsseltem Web-Verkehr ist das so: Der Browser eröffnet mit seinem
    Aushandlungspaket. Der Proxy stellt seine Zeile davor, der Dienst liest sie und
    findet dahinter die erwarteten Daten.

    Es gibt aber Protokolle, bei denen der Server zuerst spricht.
    Klassisch ist der Mailversand über den Port, der mit unverschlüsselter Verbindung
    beginnt und erst auf Zuruf umschaltet. Dort meldet sich der Server mit einer
    Begrüßungszeile, und der Client wartet auf sie, bevor er irgendetwas sendet.

    Der Stillstand

    Setzt man das PROXY-Protokoll auf so einen Port, entsteht eine Umklammerung.
    Der Dienst wartet auf die Kopfzeile des Proxys, bevor er den Begrüßungstext
    schickt. Der Client wartet auf den Begrüßungstext, bevor er etwas sendet. Kommt
    die Verbindung von einem Client, der die Kopfzeile nicht kennt — jedes normale
    Mailprogramm —, warten beide, bis eine Zeitüberschreitung die Sache beendet.

    Das Tückische daran: Es sieht nicht nach einem Konfigurationsfehler aus,
    sondern nach einem Netzproblem. Keine Fehlermeldung, kein abgelehnter
    Verbindungsaufbau. Die Verbindung steht, es passiert nur nichts. Wer an dieser
    Stelle die Firewall prüft, sucht lange.

    Was ich daraus gemacht habe

    Der Port mit sofortiger Verschlüsselung ist der primäre Sendeweg. Dort
    spricht der Client zuerst, dort funktioniert das PROXY-Protokoll, dort kommt die
    echte Absenderadresse an.

    Der Port mit nachträglicher Umschaltung läuft bewusst ohne. Er bleibt
    erreichbar, der Dienst sieht dort eben nur den Proxy. Das ist verschmerzbar,
    solange die Auswertung am anderen Port hängt.

    Wichtig ist, dass beide Seiten dieselbe Annahme haben. Schickt der Proxy die
    Kopfzeile, obwohl der Dienst sie nicht erwartet, landet sie als Müll im
    Protokollverkehr — und die Fehlersuche beginnt von vorn, nur mit umgekehrten
    Vorzeichen.

    Die allgemeine Regel

    Bevor man einem Port ein Vorspann-Protokoll verpasst, lohnt eine einzige
    Frage: Wer spricht zuerst? Spricht der Client, kann man ihm
    etwas voranstellen. Spricht der Server, kann man es nicht — jedenfalls nicht,
    ohne dass beide Seiten es wissen.

    Dieselbe Frage erklärt eine ganze Familie von Fehlern, bei denen eine
    Verbindung steht und trotzdem nichts geschieht.