Hallöchen 👋
In Woche 5 haben wir uns etwas mit der eigentlichen Implementierung unseres Incident Archivs befasst. Dabei
Zudem haben wir unsere Software Requirements Specification dem Feedback nach angepasst.
Die Aufwandsschätzung in Story-Points entspricht nun der im Dokument Eingangs erwähnten Skala.
Das Backend hat in der letzten Woche weitere Implementierungen
in Form von Middlewares, Utility-Funktionen, Templates und Tests erhalten,
die eine reibungslose und strukturierte Weiterentwicklung begünstigen sollen.
Die erste API-Version v1
bleibt bislang jedoch aus,
da zuerst das weitere Vorgehen in einer Gruppenbesprechung besprochen werden muss.
Ob und wie wir DSGVO-Konform weiterarbeiten werden..
Des Weiteren hat es Entwicklungen im Bereich der API-Request-/-Response-Objekte gegeben,
die wir mit der Zod-Notation definieren, um während der Laufzeit Schema-Validierungen zu erhalten.
So gibt es mittlerweile für die Organisations-/ und Vorfalls-Anlage einsatzbereite Zod-Schemata,
die nach Bedarf abgeändert werden können.
Ein weiteres ist das Thema Sicherheit.
Wir möchten unseren Kunden eine maximal sichere Umgebung für personenbezogene
und demnach DSGVO-Geschützte Daten anbieten.
Hierbei setzen wir dem Plan nach auf das Kyber-Kryptoverfahren,
wofür es bereits Implementierungen in TypeScript gibt.
In Kombination mit einem klassischen kryptographie Verfahren (da offiziell empfohlen) werden wir uns voraussichtlich in der nächsten Woche für eine Implementierungs-Art entscheiden.
Bislang stehen uns drei Varianten zur Wahl,
zumal nur zwei davon eine tatsächliche E2EE ermöglichen.
In jedem Fall wird die Basis durch eine asymmetrische Verschlüsselung abgebildet,
da es zu Kyber-90s (symmetrisches Verfahren) bislang kein TypeScript-Modul gibt.
Eine alternative Lösung wäre ein Port der Implementierung des pqc_kyber crates, was aktuell jedoch den Rahmen sprängen würde.
Hier haben wir uns beim Konzeptionieren nach dem oWASP Key-Management Cheat-Sheet gerichtet,
um mögliche Fehler mit diesem kritischen Thema zu vermeiden.
Wenn wir uns in der Team-Abstimmung dafür entscheiten,
sieht der zukünftige Prozess voraussichtlich folgendermaßen aus..
sequenceDiagram
User->>+ReactApp: Initialisiert Organisations-Registrierung
ReactApp->>ReactApp: Erzeugt und speichert <br>Organisations-Priv-/Pub-Key
ReactApp->>ReactApp: Erzeugt und speichert <br>persönlichen Priv-/Pub-Key
ReactApp->>+Server: Erzeuge Organisation mit `rw_all` Stammadmin
Note right of Server: Überträgt Persönlichen <br/> und Organisations-Pub-Key
Server->>Server: Initialisiere Organisation & Key-Tabelle
Server->>-ReactApp: Übertrage neu angelegte Organisation
opt Backup Organization Priv-Key to prevent lockout
ReactApp->>+Server: Fragt General-Pub-Key an
Server->>ReactApp: Übertrage General-Pub-Key
ReactApp->>ReactApp: Verschlüsselt Organisations-Priv-Key<br/> mit General Pub-Key
ReactApp->>Server: Überträgt verschlüsselten Organisations-Priv-Key
Server->>DB: Speichert Backup-Key in privater Meta-Schlüssel-Tabelle
DB->>Server: Ablage-Bestätigung
Server->>-ReactApp: Backup-Bestätigung
end
deactivate ReactApp
Ähnlich zu einem Schlüsselserver wird voraussichtlich für jede Organisation eine Liste aller öffentlichen Schlüssel angelegt,
auf die alle Mitglieder der Organisation zugreifen können,
um die Incidents für ein jeweils anderes Mitglied der Organisation zugänglich zu machen.
Die eigentliche Anlage eines Vorfalls sieht danach wie folgt aus..
Basierend auf intermediären Schlüsseln, die mit allen berechtigten Benutzern geteilt werden (Key-Chain),
erhält jeder Vorfall ein eigenes Schlüsselset, wobei dieses mit den Pub-Keys der Organisation(-smitglieder) auf der Client-Seite verpackt wird,
um keine privaten Schlüssel an der API/im Backend zu bearbeiten.
Der zugehörige Ablauf wird im Fall das folgende Ablaufs-Schema abhandeln..
sequenceDiagram
User->>+ReactApp: Initialisiert Vorfall
ReactApp->>ReactApp: Erzeugt intermediären<br> Vorfalls-Priv-/Pub-Key
ReactApp->>+Server: Fragt Schlüsselset für Organisation an
Server->>DB: Holt Schlüsseltabelle der Organisation
Note right of DB: Enthält nur Pub-Keys<br>aller User & der Organisation
DB->>Server: Überträgt Schlüsseltabelle der Organisation
Server->>Server: Selektiert relevante<br> Pub-Schlüssel für Kontext
Server->>-ReactApp: Sendet relevante Pub-Schlüssel für Kontext
ReactApp->>ReactApp: Verpackt intermediären<br> Vorfalls-Priv-Key in erhaltenen <br>Pub-Schlüsseln der Organisation
ReactApp->>ReactApp: Verschlüsselt Vorfall <br>mit Vorfalls-Pub-Key
ReactApp->>+Server: Überträgt verschlüsselten Vorfall &<br> verschlüsselte intermediäre Priv-Keys zur Archivierung
Note right of Server: Enthält u.a. Relation zu Schlüsseltabelle<br>der Organisation
Server->>DB: Legt Vorfall in Incident-Tabelle <br>nebst intermediärem Schlüssel-Set ab
Note right of DB: Andere Mitglieder fragen mit eigenem Pub-key an, <br> um les-/bearbeitbare Einträge zu erhalten.
DB->>Server: Erfolgreich abgelegt.
Server->>-ReactApp: Überträgt Speicherort (URL) des abgelegten Vorfalls.
ReactApp->>ReactApp: Cache Inciden-Location
deactivate ReactApp
Beim Editieren eines Incidents kann jeder berechtigte Benutzer mit dem lokal abgespeicherten,
privaten Schlüssel den Vorfall entschlüsseln,
bearbeiten und mit demselben intermediären Vorfalls-Schlüssel wie beim Erstellen absichern.
Hierbei muss nun ein neuer intermediärer Schlüssel angelegt werden,
da der zu löschende Benutzer zuvor Zugriff auf den intermediären Vorfalls-Schlüssel gehabt hat.
sequenceDiagram
User->>+ReactApp: Entferne Benutzer
activate ReactApp
Note left of User: Berechtigter Benutzer
activate Server
ReactApp->>+Server: Lösche Benutzer
Server->>+DB: Prüfe Berechtigung zu Lösch-Vorgang
DB->>-Server: Rückmeldung über Berechtigung
Note left of DB: Rückmeldung enthält <br>Pub-Keys von bisherig Berechtigten
alt
Server->>-ReactApp: Übertrage Pub-Keys zur erneuten Verschlüsselung
ReactApp->>+Server: Frage alle betroffenen Vorfälle an
Server->>+DB: Frage alle betroffenen Vorfälle an
DB->>-Server: Gebe alle betroffenen Vorfälle zurück
Server->>-ReactApp: Gebe alle betroffenen Vorfälle zurück
loop Verschlüssel alle Vorfälle mit neuem intermediären Schlüssel
ReactApp->>ReactApp: Erzeuge neuen <br> intermediären Vorfalls-Schlüssel
loop
ReactApp->>ReactApp: Verschlüssel neuen <br>intermediären Vorfalls-Schlüssel<br> mit Pub-Key der Organisation
end
ReactApp->>ReactApp: Verschlüssel Vorfall mit <br>neuem intermediären Schlüssel
end
ReactApp->>+Server: Übertrage erneut verschüsselte Vorfälle <br>mit zugehörigen intermediären Schlüsseln
Server->>+DB: Speichere aktualisierte Vorfälle ab
DB->>-Server: Alle aktualisierten Vorfälle abgespeichert
Server->>-ReactApp: Gib Lokationen der aktualisierten Vorfälle zurück
else
Server->>-ReactApp: Nicht berechtigte Anfrage
ReactApp->>User: Fehler
%%activate ReactApp
%%deactivate ReactApp
end
deactivate ReactApp
An der eigentlichen Benutzerschnittstelle hat es Fortschritte im Bereich des Routing gegeben
und erste Screens stehen bereits zur Verfügung..
Neben der eigentlichen Erstellung von Atomen > Molekülen > Organismen > Templates > Pages (nach dem Atomic-Schema) im Frontend,
stellt sich aktuell vor allem die Herausforderung von Authentifizierten-Routen.
Hier gibt es bislang keine einfache Lösung, wir bleiben allerdings dran hier weiterzumachen..
Im Backend stellt vor allem die Unklarheit über die Ziel-Infrastruktur einen Blocker dar,
zumal es dennoch möglich ist an anderen Stellen, wie der Resilienz des Service oder einer verbesserten Entwickler-Erfahrung weiterzuarbeiten.
Es bleibt spannend wie die kommenden Wochen den Kurs des Projekts beeinflussen werden,
in jedem Fall geht es voran und das ist doch nie etwas schlechtes. :D
Letzte Woche: Vierter Post (KW45)
Nächste Woche: Sechster Post (KW47)