Corona Kontakterfassung für Universum e.V.
Dies ist ein schnell gehacktes Tool als Alternative zu zentralen Contact-Tracing-Apps für einen kleinen Verein.
Das Ziel war es, die Kontaktdaten der Besucher ohne die Notwendigkeit einer App-Installation digital erfassen zu können, wie es gemäß der aktuellen Version der niedersächsischen Corona-Verordnung vorgeschrieben ist. Der Aufruf der Seite kann per QR-Code erfolgen. Zur Verbesserung des Komforts können die Eingabedaten durch den Benutzer gespeichert werden, dies erfolgt jedoch ausschließlich im localStorage des Browser.
Es werden nur die notwendigen Daten erfasst und tageweise mit einem Zeitstempel versehen in eine CSV-Datei gespeichert, wobei zuvor jede Zeile separat per GnuPG asymetrisch verschlüsselt wird. Sofern der private Schlüssel ordnungsgemäß geheim gehalten wird, ist es also selbst für einen Angreifer mit Lese-Zugriff auf den Server nicht möglich, die Daten auszulesen.
Für die Entschlüsselung der Daten steht ein kleines JavaScript-Tool zur Verfügung (decrypt.html), welches jedoch komplett lokal arbeitet.
Wie bei anderen zentralen Kontakterfassungs-Apps ist es auch hier möglich, die Veranstaltung mit falschen Kontaktdaten zu fluten, dies ist bei zentralen Kontakterfassungstools ein grundsätzliches Problem. Um dieses Problem ein wenig zu mitigieren besteht die Option, jeder Veranstaltung ein individuelles "token" als Query-Parameter mitzugeben. Dies wird mit in die CSV-Datei geschrieben, so dass hinter eine Filterung möglich ist.
- Layout und Text anpassen
- Ein GnuPG-Schlüsselpaar erzeugen, falls noch nicht vorhanden. Den öffentlichen Schlüssel exportieren.
- Den öffentlichen Schlüssel in die lokale Konfigurationsdatei importieren:
gpg --homedir=covid19.gnupg --import -a < public-key.txt
- Die ID des importieren Schlüssels in 'encrypt.php' eintragen. Bei der Gelegenheit auch gleich die Pfade zu "covid19.data" und "covid19.gnupg" prüfen.
- Das ganze auf einen entsprechenden Webserver kopieren, auf dem PHP und GnuPG zur Verfügung stehen.
- Einen Cronjob einrichten, der täglich das Programm "cleanup.php" aufruft, um die abgelaufenen Daten zu beseitigen.
GnuPG kann nicht mehrere verschlüsselte Blöcke innerhalb der selben Datei entschlüsseln, daher ist die Nutzung eines kleinen Tools erforderlich. Dieses Projekt stellt dafür das JavaScript 'decrypt.html' zur Verfügung.
Vorgehen:
- Den privaten GnuPG-Schlüssel im ASCII-Format exportieren:
gpg -a --export-secret-keys KEYID
-
Die verschlüsselte Datei des vom Gesundheitsamt angeforderten Tages per (S)FTP herunterladen
-
Den Seite "decrypt.html" aufrufen
-
Den Inhalt der verschlüsselten Datei sowie den privaten Schlüssel in die jeweiligen Textboxen kopieren
-
Das Passwort des privaten Schlüssels eingeben und bestätigen
-
Den entschlüsselten Inhalt der Datei ggfs. nach Zeitraum und Token filtern und an das Gesundheitsamt weitergeben.
Ich empfehle, für das Tool ein individuelles Schlüsselpaar zu erzeugen und den privaten Schlüssel sowie das dazu notwendige Passphrase an unterschiedliche Personen aushändigen, so dass immer mindestens zwei Personen erforderlich sind, um auf die Daten zugreifen zu können.
Das Entschlüsselungstool komfortabler machen. Das Projekt gehe ich an, sobald das Gesundheitsamt mehr als zwei mal angeklopft hat. Im besten Fall wird es sowieso nie gebraucht...
Das Tool steht unter der GPL 3.0.
Die Entschlüsselungskomponente verwendet das OpenPGP.js-Framework.