IchBins237
Cadet 2nd Year
- Registriert
- Nov. 2006
- Beiträge
- 28
Hallo zusammen,
Ich hol mal ein kleines Bisschen aus bevor ich zu meiner eigentlichen Fragestellung komme, damit ihr mein Anliegen besser einordnen könnt. Für die schnelle Variante hab ich euch meine Fragen fett hervorgehoben.
Ganz wichtig: Ich bin kein Softwareentwickler und habe glaub ich auch nicht vor das zu werden. Ich kann ein klein wenig programmieren, das war es aber auch schon. Dieses "ein klein wenig programmieren" möchte ich zur persönlichen Horizonterweiterung auf "ein wenig programmieren" erweitern.
Nun wisst ihr schonmal etwas über meinen Background und könnt hoffentlich auch ganz grob einschätzen, was in scope und out of scope für mein Projekt ist.
Nähern wir uns meiner Fragestellung etwas weiter.
Nun meine Fragen:
Wie gestalte ich denn die Datenbanken, dass die Daten möglichst sicher verstaut sind?
Meine Ideen bisher:
1. Jedes registrierte Unternehmen bekommt eigene Datenbanken, nicht alles von jedem Unternehmen in eine Datenbank. Die Datentrennung kommt mir irgendwie richtig vor, ich weiß aber noch nicht wofür. Sinnvoll, zwingend erforderlich oder überflüssig?
2. Ich dachte im ersten Schritt, dass ich die Arbeitszeitdaten anonymisiert speichere mit Hilfe der uid von Firebase Auth. Für den einzelnen Nutzer der Gruppe Mitarbeiter wäre das ja ok. Der Mitarbeiter loggt sich ein und sieht und speichert seine Daten, dafür braucht es keine weiteren personenbezogenen Daten im App-Backend. Kommen die Datenbanken im Hintergrund in die falschen Hände, dann sehen die Bösewichte nur eine uid mit irgendwelchen Zeitdaten und werden es (hoffentlich) schwer haben das Personen zuzuordnen - Credentials mit Email Adresse liegen ja bei Firebase Auth und werden im eigentlichen App-Backend nicht verarbeitet.
Problem zu 2.:
Wie kann nun beispielsweise ein Abteilungsverantwortlicher Urlaub für einen Mitarbeiter eintragen?
Dazu müsste er einen Mitarbeiternamen, Personalnummer oder so was nutzen. Eine uid reicht nicht, damit kann derjenige ja nichts anfangen. Bringt es aus Datensicherheitssicht etwas z.B. die Arbeitszeitdaten nur uid's zuzuordnen und für die administrativen Themen einen zusätzlichen Service mit zusätzlicher Datenbank für Zuordnung uid zu Mitarbeiter-Namen, Abteilung etc. zu erstellen? Und wie lege ich dann sowas wie den Namen sicher in der Datenbank ab und gestalte den Service so, dass die Bösewichte nichts mit den Daten anfangen können, wenn sie in deren Hände gelangen?
Da das Projekt ja Open Source werden soll und jeder dadurch auch die Möglichkeit bekommt, eigene Server zu betreiben und den Service auf eigener Infrastruktur anzubieten wäre es dazu natürlich auch klasse, wenn der Serverbetreiber möglichst wenige Daten in Klartext bekommt. Gut, einen Unternehmens-Accountinhaber wird der Serverbetreiber kennen (müssen). Aber Namen der Mitarbeiter und deren Arbeitszeiten und weitere persönliche Daten gehen den Serverbetreiber nichts an.
Andererseits wäre es zukünftig aber von Vorteil, wenn verloren gegangene Daten auch wiederhergestellt werden könnten. Ein verloren gegangener Key des "Kunden", der zum Entschlüsseln von Daten dringend benötigt würde, stelle ich mir problematisch vor, da die Daten damit unbrauchbar werden könnten.
Ich möchte im Moment nicht die 100% Lösung entwickeln. Ich möchte aber natürlich den Grundstein so legen, dass das auch irgendwann mal skaliert, wenn ich Funktionen erweitere und die verschiedenen Benutzerrollen implementiere.
Mir reichen erstmal so grundsätzliche Anreize, wie so sensible Daten behandelt und sicher gespeichert werden können. Gibt's da Best Practices, gute Tutorials, die ich mir mal ansehen könnte oder Praxiserfahrungen von euch? Was sind die richtigen Begriffe, nach denen ich recherchieren muss? Im Zusammenhang mit serverseitigem Speichern von Passwörtern hab ich mal was von Hashen, Salt und Pepper gehört - sind das die Begrifflichkeiten mit denen ich mich für meinen Use Case auseinandersetzen muss?
Bevor ich mich ans programmieren mache möchte ich mich erstmal sortieren, wie und mit welchen Methoden ich das umsetzen möchte.
Wie gesagt möchte ich den Service nicht großartig selber selber ausrollen, sondern "nur" mal einem Freund/Bekannten/Verwandten zur Verfügung stellen. Trotzdem (oder gerade deswegen?) ist die Datensicherheit das a und o.
Und während ich das schreibe gefällt mir die Idee mit Zeiterfassungsdaten z.B nur mit uid in Verbindung bringen und später irgendwann mal Datenbanken und Services für Mitarbeiterdaten und Userrollen und so hinzuzufügen. Momentan ist der Bedarf nicht da, weitere persönliche Daten mit den Arbeitszeiten in Verbindung zu bringen, wenn ich nur ein, zwei Nutzer (inkl. mir selbst zum Testen) habe.
Danke euch für's Lesen meines Romans
Freue mich auf Anregungen und ihr braucht mir nicht im Roman antworten
Ich hol mal ein kleines Bisschen aus bevor ich zu meiner eigentlichen Fragestellung komme, damit ihr mein Anliegen besser einordnen könnt. Für die schnelle Variante hab ich euch meine Fragen fett hervorgehoben.
Ganz wichtig: Ich bin kein Softwareentwickler und habe glaub ich auch nicht vor das zu werden. Ich kann ein klein wenig programmieren, das war es aber auch schon. Dieses "ein klein wenig programmieren" möchte ich zur persönlichen Horizonterweiterung auf "ein wenig programmieren" erweitern.
Dazu erarbeite ich mir momentan als Freizeitprojekt eine Web App zur Arbeitszeiterfassung. Ich sehe es komplett als Hobbyprojekt und plane damit nicht, kommerziell erfolgreich zu werden. Gibt mehr als genug kommerzielle digitale Zeiterfassungen, da braucht's kein Produkt von einem Laienentwickler. Es ist auch nicht für den Einsatz bei meinem Arbeitgeber geplant und ich plane nicht den Service an mir Unbekannte oder Unternehmen selbst auszurollen.
Was ich aber plane ist, mein Projekt unter GNU AGPL der Öffentlichkeit zur Verfügung zu stellen. Vielleicht kann ja jemand später mal etwas damit anfangen.
Ich habe momentan einen konkreten Anwendungsfall für die Privatnutzung in meinem engeren Umfeld. Kann natürlich zügig obsolet werden, wenn das BAG Urteil zur Zeiterfassung einschlägt und auch jedes noch so kleine Unternehmen sich irgend eine bereits erhältliche Lösung kauft. Da es mir aber in erster Linie ums Lernen geht, mag das Projekt obsolet werden und "scheitern", das Gelernte bleibt mir ja aber erhalten.
Ich möchte das Thema einigermaßen vernünftig angehen, d.h. ich nutze bereits Gitlab mit unterschiedlichen Branches/Tags und hab mir für's Frontend bereits eine Pipeline gebaut, die mir mein Frontend beim Commit/Merge baut und auf unterschiedlichen Environments hostet um mal so meinen aktuellen Stand grob zu umreißen. Hab mich mit Lizenzen beschäftig und auch wenn ich keinen Service für Fremde anbieten möchte wird die Webseite am Ende im Internet für jeden erreichbar sein, daher muss ich mich zwangsläufig auch mit den nicht technischen Themen in dem Zusammenhang beschäftigen. Unit und Integration Test ist momentan auch noch out of Scope für mich, das folgt, wenn ich mal einen ersten Prototypen mit Frontend und Backend bereit hab, der mit erfasste Arbeitszeiten in eine Datenbank geschrieben hat. Ich brauche jetzt erstmal das "schnelle" Erfolgserlebnis und kann nicht alles auf einmal lernen
Für den Moment hab ich mein Flutter Frontend zumindest schonmal soweit, dass ich bestimmte Routen nur für via Firebase authentifizierte Nutzer freigebe, unauthorisiert sind erstmal nur die Login-Seite und Nutzungsbedingungen, Datenschutzerklärung, Impressum erreichbar. Eingeloggt gibts eine Zeiterfassungsseite, ganz simpel ein Button mit dem ich einstechen und ausstechen kann. Momentan ist das noch ein Klickdummy, hab also im Frontend umgesetzt, dass der die Startzeit beim ersten Klick aufnimmt, in den State working geht, den Button ändert, dass das erkenntlich ist und beim nächsten Klick die Endzeit aufnimmt und die Zeitdifferenz berechnet.
Hab auch schonmal zwei go-Microservices programmiert. Ein Service bekommt HTTP-Befehle und spricht über gRPC mit dem zweiten µ-Service um etwas in einer Postgres db zu speichern. Ganz primitiv erstmal und hat schonmal geklappt. Bin zuversichtlich, dass ich damit zurechtkomme.
Was ich aber plane ist, mein Projekt unter GNU AGPL der Öffentlichkeit zur Verfügung zu stellen. Vielleicht kann ja jemand später mal etwas damit anfangen.
Ich habe momentan einen konkreten Anwendungsfall für die Privatnutzung in meinem engeren Umfeld. Kann natürlich zügig obsolet werden, wenn das BAG Urteil zur Zeiterfassung einschlägt und auch jedes noch so kleine Unternehmen sich irgend eine bereits erhältliche Lösung kauft. Da es mir aber in erster Linie ums Lernen geht, mag das Projekt obsolet werden und "scheitern", das Gelernte bleibt mir ja aber erhalten.
Ich möchte das Thema einigermaßen vernünftig angehen, d.h. ich nutze bereits Gitlab mit unterschiedlichen Branches/Tags und hab mir für's Frontend bereits eine Pipeline gebaut, die mir mein Frontend beim Commit/Merge baut und auf unterschiedlichen Environments hostet um mal so meinen aktuellen Stand grob zu umreißen. Hab mich mit Lizenzen beschäftig und auch wenn ich keinen Service für Fremde anbieten möchte wird die Webseite am Ende im Internet für jeden erreichbar sein, daher muss ich mich zwangsläufig auch mit den nicht technischen Themen in dem Zusammenhang beschäftigen. Unit und Integration Test ist momentan auch noch out of Scope für mich, das folgt, wenn ich mal einen ersten Prototypen mit Frontend und Backend bereit hab, der mit erfasste Arbeitszeiten in eine Datenbank geschrieben hat. Ich brauche jetzt erstmal das "schnelle" Erfolgserlebnis und kann nicht alles auf einmal lernen
Für den Moment hab ich mein Flutter Frontend zumindest schonmal soweit, dass ich bestimmte Routen nur für via Firebase authentifizierte Nutzer freigebe, unauthorisiert sind erstmal nur die Login-Seite und Nutzungsbedingungen, Datenschutzerklärung, Impressum erreichbar. Eingeloggt gibts eine Zeiterfassungsseite, ganz simpel ein Button mit dem ich einstechen und ausstechen kann. Momentan ist das noch ein Klickdummy, hab also im Frontend umgesetzt, dass der die Startzeit beim ersten Klick aufnimmt, in den State working geht, den Button ändert, dass das erkenntlich ist und beim nächsten Klick die Endzeit aufnimmt und die Zeitdifferenz berechnet.
Hab auch schonmal zwei go-Microservices programmiert. Ein Service bekommt HTTP-Befehle und spricht über gRPC mit dem zweiten µ-Service um etwas in einer Postgres db zu speichern. Ganz primitiv erstmal und hat schonmal geklappt. Bin zuversichtlich, dass ich damit zurechtkomme.
Nun wisst ihr schonmal etwas über meinen Background und könnt hoffentlich auch ganz grob einschätzen, was in scope und out of scope für mein Projekt ist.
Nähern wir uns meiner Fragestellung etwas weiter.
Ich hab jetzt also meinen Ein- Ausstechen Button und die Authentifizierung. Die Arbeit und das Speichern soll nun also im Backend passieren, womit ich jetzt loslegen möchte.
Grobe Struktur: Ich hab ein API-Gateway. Im ersten Schritt möchte ich den Login des Users im Backend verifizieren mit übermittelten Firebase Token. Damit werden weitere geschützte Backend-Services freigeschaltet. Als erstes mal die Zeiterfassung selber, die mir eine Startzeit und Endzeit des Users in einer Datenbank speichert. Nächster Service ist für die Ermittlung der täglichen Arbeitszeit und des laufenden Saldos (=Flextime Konto) zuständig. Weitere Funktionen spare ich mir mal an dieser Stelle.
Später werde ich verschiedene Nutzergruppen benötigen. Grobe Idee:
Grobe Struktur: Ich hab ein API-Gateway. Im ersten Schritt möchte ich den Login des Users im Backend verifizieren mit übermittelten Firebase Token. Damit werden weitere geschützte Backend-Services freigeschaltet. Als erstes mal die Zeiterfassung selber, die mir eine Startzeit und Endzeit des Users in einer Datenbank speichert. Nächster Service ist für die Ermittlung der täglichen Arbeitszeit und des laufenden Saldos (=Flextime Konto) zuständig. Weitere Funktionen spare ich mir mal an dieser Stelle.
Später werde ich verschiedene Nutzergruppen benötigen. Grobe Idee:
- Mitarbeiter: Können ihre Zeit per "Stechuhr" erfassen und ihre eigenen Stundensalden sehen,
- Abteilungsverantwortliche: Können Arbeits-/Pausenzeitmodelle der MA ihrer Abteilungen festlegen, die AZ Daten der MA ihrer Abteilungen einsehen, fehlende Stechdaten und Abwesenheiten für die MA eintragen etc. und
- Admin: Mitarbeiter für's Unternehmen anlegen, Rollenzuordnung der Nutzer, KEIN Zugriff auf die Arbeitszeitdaten.
Nun meine Fragen:
Wie gestalte ich denn die Datenbanken, dass die Daten möglichst sicher verstaut sind?
Meine Ideen bisher:
1. Jedes registrierte Unternehmen bekommt eigene Datenbanken, nicht alles von jedem Unternehmen in eine Datenbank. Die Datentrennung kommt mir irgendwie richtig vor, ich weiß aber noch nicht wofür. Sinnvoll, zwingend erforderlich oder überflüssig?
2. Ich dachte im ersten Schritt, dass ich die Arbeitszeitdaten anonymisiert speichere mit Hilfe der uid von Firebase Auth. Für den einzelnen Nutzer der Gruppe Mitarbeiter wäre das ja ok. Der Mitarbeiter loggt sich ein und sieht und speichert seine Daten, dafür braucht es keine weiteren personenbezogenen Daten im App-Backend. Kommen die Datenbanken im Hintergrund in die falschen Hände, dann sehen die Bösewichte nur eine uid mit irgendwelchen Zeitdaten und werden es (hoffentlich) schwer haben das Personen zuzuordnen - Credentials mit Email Adresse liegen ja bei Firebase Auth und werden im eigentlichen App-Backend nicht verarbeitet.
Problem zu 2.:
Wie kann nun beispielsweise ein Abteilungsverantwortlicher Urlaub für einen Mitarbeiter eintragen?
Dazu müsste er einen Mitarbeiternamen, Personalnummer oder so was nutzen. Eine uid reicht nicht, damit kann derjenige ja nichts anfangen. Bringt es aus Datensicherheitssicht etwas z.B. die Arbeitszeitdaten nur uid's zuzuordnen und für die administrativen Themen einen zusätzlichen Service mit zusätzlicher Datenbank für Zuordnung uid zu Mitarbeiter-Namen, Abteilung etc. zu erstellen? Und wie lege ich dann sowas wie den Namen sicher in der Datenbank ab und gestalte den Service so, dass die Bösewichte nichts mit den Daten anfangen können, wenn sie in deren Hände gelangen?
Da das Projekt ja Open Source werden soll und jeder dadurch auch die Möglichkeit bekommt, eigene Server zu betreiben und den Service auf eigener Infrastruktur anzubieten wäre es dazu natürlich auch klasse, wenn der Serverbetreiber möglichst wenige Daten in Klartext bekommt. Gut, einen Unternehmens-Accountinhaber wird der Serverbetreiber kennen (müssen). Aber Namen der Mitarbeiter und deren Arbeitszeiten und weitere persönliche Daten gehen den Serverbetreiber nichts an.
Andererseits wäre es zukünftig aber von Vorteil, wenn verloren gegangene Daten auch wiederhergestellt werden könnten. Ein verloren gegangener Key des "Kunden", der zum Entschlüsseln von Daten dringend benötigt würde, stelle ich mir problematisch vor, da die Daten damit unbrauchbar werden könnten.
Ich möchte im Moment nicht die 100% Lösung entwickeln. Ich möchte aber natürlich den Grundstein so legen, dass das auch irgendwann mal skaliert, wenn ich Funktionen erweitere und die verschiedenen Benutzerrollen implementiere.
Mir reichen erstmal so grundsätzliche Anreize, wie so sensible Daten behandelt und sicher gespeichert werden können. Gibt's da Best Practices, gute Tutorials, die ich mir mal ansehen könnte oder Praxiserfahrungen von euch? Was sind die richtigen Begriffe, nach denen ich recherchieren muss? Im Zusammenhang mit serverseitigem Speichern von Passwörtern hab ich mal was von Hashen, Salt und Pepper gehört - sind das die Begrifflichkeiten mit denen ich mich für meinen Use Case auseinandersetzen muss?
Bevor ich mich ans programmieren mache möchte ich mich erstmal sortieren, wie und mit welchen Methoden ich das umsetzen möchte.
Wie gesagt möchte ich den Service nicht großartig selber selber ausrollen, sondern "nur" mal einem Freund/Bekannten/Verwandten zur Verfügung stellen. Trotzdem (oder gerade deswegen?) ist die Datensicherheit das a und o.
Und während ich das schreibe gefällt mir die Idee mit Zeiterfassungsdaten z.B nur mit uid in Verbindung bringen und später irgendwann mal Datenbanken und Services für Mitarbeiterdaten und Userrollen und so hinzuzufügen. Momentan ist der Bedarf nicht da, weitere persönliche Daten mit den Arbeitszeiten in Verbindung zu bringen, wenn ich nur ein, zwei Nutzer (inkl. mir selbst zum Testen) habe.
Danke euch für's Lesen meines Romans
Freue mich auf Anregungen und ihr braucht mir nicht im Roman antworten
Zuletzt bearbeitet: