Datenschutz & Datensicherheit
Aus dem aktuellen Programmcode und Datenbankschema abgeleitet – für die Prüfung durch die Rechtsabteilung. Rechtliche Einordnungen sind Vorschläge und als zur Prüfung markiert.
100 von 100 Aufträgen
1 · Datenkategorien
Tatsächlich vorhandene Felder laut Datenbankschema (Anzahl Datensätze aktuell).
| Betroffene | Daten (Felder) | Tabelle | Datensätze |
|---|---|---|---|
| Kunden | Name, Kundennummer, Anschrift (Straße, PLZ, Ort, Geokoordinaten), Telefon, Rückrufnummer, Auftragsbeschreibung, Wunsch-/Zeitfenster, Termin, Absage/Stornogrund, Rückmeldung/Bericht des Handwerkers, Fotos zum Auftrag | orders, photos, comments | 100 |
| Kunden – SMS/Termin | Mobilnummer, SMS-Text, Zeitpunkte Versand/Antwort, Termin-Link-Token (befristet), Terminbestätigung/-umbuchung über öffentliche Terminseite | sms_log, orders.sms_* | 0 |
| Kunden – Archiv | PDF-Auftragsbericht mit Name, Kundennr., Adresse, Freitext (bei Erledigt/Storniert) | pdf_archive + Dateien | 0 |
| Handwerker / Fahrzeuge | Name, Telefon, Fähigkeiten, PLZ-Gebiete, Arbeitszeiten, Heimatadresse (Start der Route, inkl. Koordinaten), Microsoft-365-Kennung (UPN), Abwesenheiten (Art, Notiz), Kalender-Blocker | resources, resource_hours, absences, m365_blockers | 11 |
| Dienstleister | Firma, Ansprechpartner, Telefon, E-Mail | providers | 2 |
| Benutzer | Benutzername, Anzeigename, E-Mail (optional, nur für „Passwort vergessen“), Rolle, Passwort-Hash, Theme, letzter Login, Anzahl Logins; Reset-Tokens nur als Hash (1 Std.) und Rate-Limit-Zähler (24 Std.) | users, pw_tokens, pw_rl | 11 |
| Mitarbeitende | Geburtstage (Name, Tag/Monat, optional Jahr) für Gratulation | birthdays | 0 |
| Protokolle | Wer hat wann was am Auftrag geändert (Benutzername), Ereignisse, Benachrichtigungen, Team-Feedback (Name, Rolle), Admin-Audit (Name, IP-Adresse), Schnittstellen-Postausgang (Payload mit Auftragsdaten), M365-Protokoll, Rate-Limit der Terminseite (IP, Zeit, kurzlebig) | order_log, order_events, notifications, team_fb, admin_audit, integ_outbox, m365_log, pub_hits | 178 |
Keine besonderen Kategorien (Art. 9 DSGVO) vorgesehen. Freitextfelder (Beschreibung, Notizen, Bericht) könnten sie unbeabsichtigt enthalten → Hinweis/Schulung, siehe offene Punkte.
2 · Zweck & Rechtsgrundlage zur Prüfung durch Rechtsabteilung
| Zweck | Daten | Vorschlag Rechtsgrundlage |
|---|---|---|
| Planung und Durchführung des Handwerkereinsatzes (Terminauftrag, Störung, Service) | Kundendaten, Termin, Adresse | Art. 6 Abs. 1 lit. b DSGVO (Vertragserfüllung Auftrag/Service) |
| Terminabstimmung per SMS / Terminseite | Mobilnummer, Termin | Art. 6 Abs. 1 lit. b DSGVO; ggf. Einwilligung/Widerspruchsmöglichkeit prüfen |
| Disposition und Einsatzsteuerung der Mitarbeitenden | Handwerker-, Arbeitszeit-, Abwesenheits-, Kalenderdaten, Heimatadresse | § 26 BDSG / Art. 88 DSGVO (Beschäftigtendaten); Mitbestimmung Betriebsrat prüfen |
| Nachvollziehbarkeit, Qualitätssicherung, Abrechnung Dienstleister | Protokolle, Rückmeldungen, PDF-Archiv | Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse) bzw. lit. c (Aufbewahrungspflichten) |
| IT-Sicherheit (Audit, Rate-Limit) | IP-Adressen, Admin-Aktionen | Art. 6 Abs. 1 lit. f DSGVO |
| Geburtstagsgruß im Team | Name, Geburtstag | Einwilligung (Art. 6 Abs. 1 lit. a) empfohlen |
3 · Rollen & Zugriffsrechte vorhanden
Live aus der Rechte-Matrix (Admin › Rollen & Menü) – serverseitig erzwungen, nicht nur ausgeblendet. ✔ = Zugriff.
| Bereich | Admin | Disponent | Handwerker (intern) | Dienstleister (extern) | Artikelpflege | Agent (Kundenservice) | Chef (Statistik, nur lesen) | Archiv (nur Archiv-Suche) |
|---|---|---|---|---|---|---|---|---|
| Kalender (Dienstleister) | ✔ | ✔ | · | ✔ | · | · | · | · |
| Meine Aufträge | ✔ | ✔ | ✔ | ✔ | · | · | · | · |
| Agent: Auftragssuche | ✔ | · | · | · | · | ✔ | · | · |
| Artikel | ✔ | · | · | · | ✔ | · | · | · |
| Dispo-Board | ✔ | ✔ | · | · | · | · | · | · |
| Freigabe | ✔ | ✔ | · | · | · | · | · | · |
| Dienstleister | ✔ | ✔ | · | · | · | · | · | · |
| PDF-Archiv | ✔ | ✔ | · | · | · | · | ✔ | · |
| Archiv-Suche | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| Team-Feedback | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
| Dashboard | ✔ | ✔ | · | · | · | · | · | · |
| Statistik | ✔ | ✔ | · | · | · | · | ✔ | · |
| Live-Dashboard | ✔ | ✔ | · | · | · | · | ✔ | · |
| Aufträge | ✔ | ✔ | · | · | · | · | · | · |
| Wochenansicht | ✔ | ✔ | · | · | · | · | · | · |
| Eingang | ✔ | ✔ | · | · | · | · | · | · |
| Karte | ✔ | ✔ | · | · | · | · | · | · |
| Fahrtenbuch | ✔ | ✔ | · | · | · | · | ✔ | · |
| Aufträge holen | ✔ | ✔ | ✔ | · | · | · | · | · |
| Administration | ✔ | · | · | · | · | · | · | · |
| Administration (inkl. Datenschutz, Wartung, Design) | ✔ | · | · | · | · | · | · | · |
- Dienstleister sehen ausschließlich Aufträge der eigenen Fahrzeuge („Meine Aufträge“); Handwerker nur ihre eigenen Aufträge.
- Noch nicht zugewiesene Aufträge (Eingangs-Glocke, „Offene Service-Aufträge“ zum Selbst-Übernehmen): Handwerker sehen in der Liste nur Auftragsart, Leistungsbereich, PLZ/Ort und Eingangszeit, in der Service-Vorschau zusätzlich Straße ohne Hausnummer, Kundenanliegen/Problembeschreibung, Artikel und Dispo-Notiz sowie die vorgeschlagene Einplanung – keine Namen, Hausnummern, Kundennummern oder Telefonnummern. Ablehnungen (mit optionalem Grund) werden im Auftragsprotokoll gespeichert. Kundendaten werden erst nach Zuweisung bzw. Übernahme sichtbar; jede Übernahme wird protokolliert und der Dispo gemeldet. Je Auftragsart bzw. global abschaltbar (Admin › Auftragsarten).
- Agent (Kundenservice): Auftragssuche, Termin abstimmen/stornieren. Chef: Statistik nur lesend. Archiv: nur Archiv-Suche.
- Rollen werden pro Benutzer vergeben; Änderungen an der Matrix werden im Audit protokolliert.
4 · Speicherort & Hosting
| Prototyp (heute) | Ziel (Go-live) | |
|---|---|---|
| Datenbank | SQLite-Datei data/dispo.sqlite (aktiv: SQLite) | optional MariaDB/MySQL im internen Netz (Umzug + Rückfall in Admin › Wartung › Datenbank) geplant |
| Server | uttek.de (Webhosting, Deutschland) – Testinstanz Demo | Interner Server bzw. Offline-/LAN-Paket im internen Netz geplant |
| Datenbank | SQLite-Datei (648,0 KB), außerhalb des Web-Zugriffs gesperrt | SQLite oder interner Datenbankserver, verschlüsselte Datenträger |
| Daten | Ausschließlich fiktive Demodaten (Namen mit „(fiktiv)“) – keine echten Kundendaten | Echtdaten erst nach Freigabe durch Rechtsabteilung / DSB |
| Externe Dienste | keine aktiv (SMS, Microsoft 365, Schnittstellen im Demo-Modus) | nur nach AVV/Freigabe (z. B. SMS-Provider, Microsoft 365) |
| Zugang | zusätzlicher Webserver-Passwortschutz (Basic Auth) vor der App-Anmeldung | nur aus dem internen Netz / VPN |
5 · Datenflüsse & Schnittstellen
| Fluss | Richtung | Status |
|---|---|---|
| Auftragseingang über REST-API (Bearer-Token) / CSV-Import | Quellsystem → Dispo | vorhanden Stub, Token-geschützt |
| Schnittstellen-Weitergabe (Ticketsystem (Platzhalter), CRM (Platzhalter), Quellsystem (Platzhalter), Kundenbenachrichtigung SMS/E-Mail (Platzhalter), Kundendatensystem, Störungssystem 1, Störungssystem 2, Abrechnungssystem) | Dispo → Zielsysteme | Demo nur protokolliert, nichts gesendet (Modus: demo) |
| SMS an Kunden (Terminvorschlag/-bestätigung) | Dispo → SMS-Provider → Kunde | Demo kein Versand, nur SMS-Postausgang |
| Öffentliche Terminseite (Link mit befristetem Token) + SMS-Antwort-Webhook | Kunde ↔ Dispo | vorhanden ohne Login, Token/Schlüssel + Rate-Limit |
| Microsoft 365 Kalender (Termine schreiben, private Termine als „belegt“ lesen) | Dispo ↔ Microsoft Graph | Demo Modus off – keine Verbindung |
| „Passwort vergessen“: Reset-Link per E-Mail an den Mitarbeiter (Benutzername, Name, Einmal-Link) | Dispo → internes SMTP → Mitarbeiter-Postfach | geplant optional · standardmäßig aus, kein Versand |
| Navigation/Karte | Browser → Google Maps | nur als Link beim Anklicken (Adresse geht dann an Google); kein Einbinden, kein automatischer Abruf |
vorhanden Keine Tracker, keine Analyse-Tools, keine CDNs: Schriften (Montserrat) und Diagramm-Bibliothek liegen lokal auf dem Server; der Code wurde auf externe Einbindungen geprüft. Es werden nur technisch notwendige Session-Cookies gesetzt (HttpOnly, SameSite=Lax, Secure bei HTTPS).
6 · Speicherdauer & Löschkonzept
| Daten | Heute | Vorschlag | Status |
|---|---|---|---|
| Aufträge inkl. Kundendaten | ohne Obergrenze; manuelles Anonymisieren je Auftrag (siehe 8) | Anonymisierung X Monate nach Erledigt/Storniert (konfigurierbar) | geplant |
| SMS-Protokoll, Termin-Token | Token läuft ab; Protokoll ohne feste Löschfrist | SMS-Texte nach 90 Tagen löschen | geplant |
| Schnittstellen-Postausgang (Payload), M365-Protokoll | ohne feste Löschfrist (0 Einträge) | 30–90 Tage | offen |
| Änderungsprotokolle (order_log/events) | ohne Obergrenze | an Auftragsaufbewahrung koppeln | geplant |
| PDF-Archiv | ohne Obergrenze | gesetzliche Aufbewahrungsfrist prüfen (z. B. 6/10 Jahre), danach löschen | zur Prüfung durch Rechtsabteilung |
| Rate-Limit IPs (pub_hits) | werden automatisch nach kurzer Zeit gelöscht | – | vorhanden |
| Backups | Auto-Backup täglich, es werden die letzten 7 behalten (konfigurierbar) | Backups verschlüsselt, Löschfristen gelten mit Verzögerung | vorhanden |
7 · Technische & organisatorische Maßnahmen (TOM)
Anmeldung
Persönliche Logins je Benutzer; Sitzung wird beim Login erneuert (Schutz vor Session-Fixation).
Passwörter
Hash (bcrypt); Richtlinie konfigurierbar (Standard ≥12, Komplexität oder Passphrase, Offline-Leak-Liste, keine Wiederverwendung der letzten 5); Änderung beendet andere Sitzungen.
Passwort vergessen (E-Mail)
Optional: Einmal-Link (Hash, 1 Std., einmalig), neutrale Antwort, Rate-Limit, Audit. Nur mit SMTP; sonst klarer Hinweis in Admin.
2FA (TOTP)
Authenticator-App, QR, Backup-Codes; Pflicht je Rolle konfigurierbar (Standard: aus); Admin kann 2FA zurücksetzen.
Login-Sperre
Nach N Fehlversuchen steigende Wartezeit je Konto und IP, protokolliert, durch Admin entsperrbar.
Rollen & Rechte
Rechte-Matrix serverseitig erzwungen; Dienstleister/Handwerker sehen nur eigene Aufträge.
CSRF-Schutz
Alle ändernden Aktionen mit CSRF-Token.
Zusätzlicher Zugriffsschutz
Basic Auth des Webservers vor der Anwendung (Prototyp); Datenbank- und Backup-Verzeichnisse per .htaccess gesperrt.
Cookies & Header
Session-Cookie HttpOnly, SameSite=Lax, Secure bei HTTPS; optional HTTPS-Redirect, HSTS, CSP/XFO/nosniff.
Verschlüsselung ruhender Daten
AES-256-GCM für sensible Auftragsfelder; Schlüssel außerhalb Webroot (oder data/ gesperrt); Migration mit Backup; reversibel.
Backups
Tägliches Auto-Backup + manuell, Wiederherstellung mit automatischer Vorab-Sicherung.
Protokollierung
Änderungen am Auftrag und Admin-/Sicherheits-Audit (inkl. IP).
Wartung
Wartungsmodus, Health-Check, Fehlerprotokoll, DB-Integritätsprüfung.
Datenminimierung im Test
Ausschließlich fiktive Demodaten.
7b · Sicherheit (Status) vorhanden
Live-Übersicht der technischen Maßnahmen (Admin › Sicherheit). Keine Geheimnisse oder Schlüsselinhalte.
| Maßnahme | Aktiv | Details |
|---|---|---|
| Passwort-Richtlinie | vorhanden aktiv | min. 12 Zeichen, Komplexität/Passphrase, Leak-Liste, History 5 |
| 2FA (TOTP) | vorhanden aktiv | verfügbar; Pflicht-Rollen: keine (Standard) |
| Passwort vergessen (E-Mail) | geplant optional/aus | kein SMTP – in Admin › E-Mail konfigurieren |
| Login-Sperre | vorhanden aktiv | nach 5 Fehlversuchen, steigende Wartezeit, je Konto + IP |
| HTTPS erzwingen | geplant optional/aus | optional (Admin › Sicherheit) |
| HSTS | geplant optional/aus | optional |
| Security-Header / Cookies | vorhanden aktiv | HttpOnly, SameSite, Secure bei HTTPS, CSP/XFO/nosniff |
| Feste Basis-Adresse | geplant optional/aus | nicht gesetzt (Admin › Sicherheit › Sitzung & Adresse) – Passwort-vergessen bleibt aus |
| Sitzungs-Timeout | vorhanden aktiv | 480 Min. Inaktivität, Handwerker-Dauerlogin 30 Tage |
| Ablage außerhalb Webroot | geplant optional/aus | Daten: im Webroot (per .htaccess gesperrt) · Backups: im Webroot (gesperrt) · Schlüssel: außerhalb |
| Verschlüsselung ruhender Daten | geplant optional/aus | aus – Schlüsselpfad: (außerhalb Webroot)/dispo-secrets/field.key |
Schlüssel für Feldverschlüsselung: (außerhalb Webroot)/dispo-secrets/field.key – separat sichern, nie im Webroot ohne Schutz. SMTP für „Passwort vergessen“: nicht konfiguriert (klarer Hinweis in Admin › E-Mail / Sicherheit).
8 · Betroffenenrechte
| Recht | Umsetzung | Status |
|---|---|---|
| Auskunft (Art. 15) | Export aller Daten eines Auftrags als JSON (unten) | vorhanden |
| Berichtigung (Art. 16) | Auftrag bearbeiten (Dispo/Admin), protokolliert | vorhanden |
| Löschung (Art. 17) | Anonymisieren je Auftrag (unten); automatische Fristen | vorhanden manuell · geplant automatisch |
| Suche nach Person über alle Aufträge | Auftragsliste/Archiv-Suche nach Name/Telefon | vorhanden |
| Widerspruch SMS | SMS-Versand je Auftragsart abschaltbar; Opt-out-Kennzeichen je Kunde | vorhanden je Art · offen je Kunde |
9 · Offene Punkte vor Go-live
- offen Betrieb auf internem Server/LAN-Paket; falls extern gehostet: Auftragsverarbeitungsvertrag (AVV) mit Hoster
- offen AVV mit SMS-Provider (seven.io / sipgate / LINK Mobility) vor Aktivierung
- offen Microsoft 365: Freigabe IT/DSB, App-Registrierung mit minimalen Rechten (nur Kalender)
- offen Prüfung Datenschutz-Folgenabschätzung (DSFA) – Mitarbeiter-Ortung/Planung, Kundendaten
- offen Einbindung Datenschutzbeauftragte(r) und Betriebsrat (Beschäftigtendaten, Leistungs-/Verhaltenskontrolle)
- offen Eintrag im Verzeichnis von Verarbeitungstätigkeiten (Art. 30)
- geplant Individuelle starke Passwörter setzen; Demo-Konten (u. a. vision) vor Go-live deaktivieren
- offen Löschfristen festlegen und automatisch umsetzen (siehe 6)
- vorhanden Brute-Force-Schutz (Login-Sperre) und optionale 2FA (TOTP) – Admin › Sicherheit
- geplant „Passwort vergessen“ nur bei Bedarf einschalten: internes SMTP eintragen, E-Mail-Adressen der Mitarbeiter pflegen (Admin › E-Mail › Server & Absender)
- offen Information der Kunden über SMS-Terminabstimmung (Datenschutzhinweise, Link auf Terminseite)
- offen Hinweis/Schulung: keine sensiblen Angaben in Freitextfeldern
- vorhanden Keine Tracker/CDNs, lokale Schriften – geprüft
- vorhanden Backups, Audit-Protokoll, Rollenmatrix, Auskunft/Anonymisierung je Auftrag
10 · FAQ Rechtsabteilung
- Sind echte Kundendaten im System?
- Nein. Der Prototyp enthält ausschließlich fiktive Demodaten (erkennbar am Zusatz „(fiktiv)“).
- Werden Daten an Dritte übermittelt?
- Derzeit nicht. SMS, Microsoft 365 und alle Schnittstellen laufen im Demo-Modus und senden nichts; es gibt keine Tracker oder externen Einbindungen.
- Wo liegen die Daten später?
- Geplant auf einem internen Server bzw. als Offline-/LAN-Paket im internen Netz; damit entfällt ein externer Hoster.
- Wer kann Kundendaten sehen?
- Nur angemeldete Benutzer gemäß Rolle: Disposition/Admin alle, Handwerker und Dienstleister nur eigene Aufträge, Agent über die Auftragssuche. Siehe Matrix in Abschnitt 3.
- Wie werden Passwörter gespeichert?
- Nur als bcrypt-Hash (PHP password_hash); im Klartext nirgends.
- Kann eine Auskunft oder Löschung umgesetzt werden?
- Ja, je Auftrag: JSON-Export aller zugehörigen Daten und Anonymisierung (Abschnitt 8). Automatische Löschfristen sind geplant.
- Wird der Standort von Handwerkern erfasst?
- Nein, keine GPS-Ortung. Gespeichert werden Heimatadresse als Routenstart und die geplante Tour.
- Was wird protokolliert?
- Änderungen an Aufträgen (Benutzer, Zeit, Aktion) und Admin-Aktionen inkl. IP-Adresse; dient Nachvollziehbarkeit und Sicherheit.
- Gibt es Backups und wer hat Zugriff?
- Täglich automatisch plus manuell; Ablage gesperrt gegen Webzugriff, Download nur für Admins, jeder Download wird protokolliert.
Automatisch erstellt aus Code und Datenbank von Dispo · 02.11.2026 14:55 · Kein Rechtsgutachten – Einordnungen zur Prüfung durch die Rechtsabteilung.