Technische Architektur der für Signal benötigten Komponenten
Einführung
Komponenten
Diese prototypische Realisierung beschreibt den Entwurf und die Konzeption eines vollständigen Secure-Messaging-Systems, wobei die Authentizität der Kommunikationspartner mithilfe der elektronischen Gesundheitskarte (eGK) und des Heilberufsausweises (HBA) sichergestellt wird und die Kommunikationsinhalte verschlüsselt übertragen werden. Dieses System ermöglicht es Patienten, direkt per Chat mit einem Arzt zu kommunizieren und/oder Dokumente und Daten auszutauschen. Erforderlich sind ein Internetzugang und eine ununterbrochene Online-Verfügbarkeit aller Teilnehmer während der Kommunikation.
Alle Bausteine der prototypischen Realisierung werden in Form von docker Containern realisiert. Dieser Ansatz ermöglicht ein einfaches Deployment in verschiedenen Betriebsumgebungen, angefangen von Entwicklerarbeitsplätzen, über klassische Server im Rechenzentrum bis hin zu modernen Cloudinfrastrukturen. Weiterführende Informationen zu docker finden sich unter https://www.docker.com/. Für die Orchestrierung der verschiedenen Container wird docker-compose genutzt.
Der Quelltext der entwickelten Komponenten sowie alle weiteren Artefakte, die für den Aufbau einer lauffähigen Umgebung benötigt werden (Beispielkonfiguration, build und deployment Skripte für docker etc.) sind nach Projektabschluss im git-Repository des Fraunhofer FOKUS zu finden. Eine Übersicht aller verfügbaren Artefakte findet sich hier.
Die nachfolgenden Abschnitte beschreiben die konkrete Realisierung der durch die technische Architektur vorgegebenen Lösungskomponenten. Die Abbildung der jeweiligen Komponenten bzw. deren funktionaler Bestandteile erfolgt dabei über separate Lösungsbausteine, die als individuelle docker-Container realisiert werden.
Die folgende Abbildung bietet einen Überblick über die für die prototypische Realisierung genutzten Lösungsbausteine:
Jedes Rechteck repräsentiert einen docker Container und besteht aus Angaben zum Containernamen, zur genutzten Software (Angabe in eckigen Klammern), zum Port, über den Dienste für andere Container im selben logischen Netz bereitgestellt werden sowie zum Port über den der entsprechende Dienst über das Netzwerkinterface des Hosts erreicht werden kann (fett gedruckt). Die einzelnen Containern sind dabei verschiedenen logischen Schichten zugeordnet:
Frontend Services: Dienste die von den Clientsystemenen direkt genutzt werden. Dies schließt Dienste mit ein, die über einen Reverse Proxy zugänglich gemacht werden. Backend Services: Dienste die von anderen Diensten der Infrastruktur (aber niemals direkt von den Clients) genutzt werden. Data Layer: Die Data Layer umfasst Dienste, die die Persistierung von Daten der Backend- oder Frontend-Services umsetzen. Da es sich beim Deployment lediglich um eine prototypische Realisierung handelt, wurde davon abgesehen entsprechende Dienste umzusetzen. Es wird jeweils eine in die jeweiligen Lösungen (keycloak, hapi-fhir ) integrierte Lösung zur Speicherung verwendet, die im selben Container läuft.
Der Signal-Server ist der Kern des Secure-Messaging-Systems. Er basiert auf der Implementierung des non-profit und open-source Signal, wurde jedoch an die Anforderungen des aktuellen Projekts angepasst. Der Singal-Server bietet Patienten und Ärzten die Möglichkeit an, sicher miteinander zu kommunizieren und der Identität ihres Kommunikationspartners zu vertrauen.
Die Hauptfunktionen des Servers bestehen darin, die Nachrichten der Nutzer zu verteilen, die Benutzerprofile zu verwalten, und den Datenverkehr zur Registrierung und Authentifizierung an den Identity Provider weiterzuleiten und somit die Identitäten der Benutzer zu verifizieren.
Das Projekt bietet die Möglichkeit wesentliche Parameter des Signal-Servers über die Umgebungsvariablen des Docker Conatainers zu steuern. Dazu gehören
ADMIN_SERVER_TYPE: Protokoll mit dessen Hilfe der Administrator mit dem Server kommunizieren kann
APN_PUSH_KEY: wird dazu benutzt um Push-Nachrichten an Apple Geräte zu senden. APN (Apple Push Notification)
APP_SERVER_TYPE: Protokoll mit dessen Hilfe eine Kommunikation mit dem Server stattfindet -> http
FCM_SENDER_ID: Ein eindeutiger numerischer Wert, der bei der Erstellung eines Firebase-Projekts erstellt wird
MINIO_PROFILES_SECRET: Geheimer Zugriffsschlüssel im wesentlichen ein Passwort
OIDC_JWT_ISSUER: Identifiziert den OpenID Provider -> ‘https://movi-keycloak.apps.osc.fokus.fraunhofer.de/auth/realms/MOVI’
POSTGRES_MESSAGE_STORE_USER: Benutzername für Postgress Message Store Datenbank -> postgres
PUSH_QUEUE_SIZE: Größe mit der Push Events gequeuet werden-> ‘1024’
MinIO ist ein mit Amazon S3 kompatibler Cloud-Storage-Server. Als Objektspeicher kann MinIO unstrukturierte Daten wie Fotos, Videos, Log-Dateien, Backups und Container-Bilder speichern und ist gleichzeitig performant, skalierbar und leichtgewichtig.
Die Funktion von MinIO besteht darin, Benutzerprofilinformationen (wie Name, Profilbild usw.) und die zwischen den Benutzern versandten Dokumente (verschlüsselt) zu speichern.
Postgres ist ein relationales Open-Source Datenbank-Managementsystem, bei dem die Erweiterbarkeit und die Einhaltung technischer Standards im Vordergrund stehen. Es ist für eine Reihe von Workloads ausgelegt, von einzelnen Computern bis hin zu Data Warehouses oder Webdiensten mit vielen gleichzeitigen Nutzern.
Im Signal-Server speichert die Postgres-Datenbank die Benutzernamen und die Geschichte der Benutzernachrichten.
Redis (Remote Dictionary Server) ist ein Open-Source Datenbank-Verwaltungssystem, das mit NoSQL-Datenbanken arbeitet und Datenstrukturen vom Typ “key-value” verwendet. Das System kann gleichzeitig als Speicher und Cache betrachtet werden, was Redis sehr mächtig und effizient macht. Das bedeutet, Daten werden immer aus dem Hauptspeicher des Computers gelesen und modifiziert, aber gleichzeitig in einem ungeeigneten Format für den Zugriff von „random access“ Daten auf der Festplatte gespeichert. Dies ermöglicht es, die Daten nach dem Neustart des Systems im Speicher wiederherzustellen.
Im Signal-Server wird Redis zum Zweck der Datenbankverwaltung, aber hauptsächlich für das Caching der Nachrichten verwendet. Aufgrund der Art des Datenbankdesigns passt Redis am besten für Nachrichtenwarteschlangen-Anwendungen wie Signal.
Firebase Cloud Messaging (FCM) ist ein plattformübergreifendes Messaging-System, mit dem man Nachrichten zuverlässig und bis zu einer bestimmten Nachrichtenmenge pro Monat kostenlos übermitteln kann. Beispielsweise kann man eine Client-App benachrichtigen, dass neue E-Mails oder andere Daten zur Synchronisierung verfügbar sind.
Im Signal Server wird FCM verwendet, um Push-Nachrichten zu versenden. Die Push-Nachrichten werden sofort auf dem Smartphonebildschirm angezeigt und dienen zur Information über ein Ereignis, z.B. den Erhalt einer neuen Nachricht.
Der Reverse Proxy leitet Anfragen von beliebigen Clients an die jeweiligen Dienste im Backend weiter. In diesem Zusammenhang kann er eine Reihe von weiteren Aufgaben übernehmen: