====== LU12d - Datenschutz in Datenbanken ====== **Ziel dieser Seite** Ein **praxisnaher Überblick** für Mediamatik-Lernende: Was bedeutet **Datenschutz** konkret bei MySQL? Was ist in der Schweiz (**DSG**) sowie im EU-Kontext (**DSGVO**) zu beachten? Welche **technischen & organisatorischen Massnahmen (TOM)** sind sinnvoll? **Hinweis (keine Rechtsberatung):** Diese Unterlage dient der **Sensibilisierung** und **Praxisorientierung** im Unterricht. Für verbindliche Auskünfte bitte interne Richtlinien/Datenschutzbeauftragte/Jurist:innen konsultieren. ===== 1) Warum Datenschutz in der DB wichtig ist ===== * Datenbanken enthalten oft **Personendaten** (*PII – Personally Identifiable Information*), z. B. Namen, E-Mail, IPs, Bestell- oder Gesundheitsdaten. * Verstösse gefährden **Betroffene** (Missbrauch, Profiling) und **Organisationen** (Reputation, Bussen, Kosten). * WordPress & Co.: Häufig **viel PII** (User-Accounts, Kommentare, Formulare) – Standard-Installationen brauchen **Härtung**. ===== 2) Rechtlicher Rahmen (Kurzüberblick) ===== * **DSG (Schweiz)**: Gilt ab 2023 revidiert. Kernprinzipien: **Rechtmässigkeit**, **Verhältnismässigkeit**, **Zweckbindung**, **Datensicherheit**, **Transparenz**. Rechte der betroffenen Personen (Auskunft, Berichtigung, Löschung, Datenportabilität in gewissen Fällen). * **DSGVO (EU)**: Vergleichbar, teils **strenger** (u. a. Büssen). Gilt, wenn EU-Personen betroffen sind oder EU-Bezug besteht (z. B. Webangebot). * **Rollen**: **Verantwortlicher** (Controller) bestimmt Zweck/Mittel; **Auftragsverarbeiter** (Processor) verarbeitet im Auftrag (z. B. Hosting). **Merke:** Recht klärt das **«Was & Warum»**, Technik (MySQL/Architektur) liefert das **«Wie»** (Sicherheit, Zugriffskontrolle, Logs, Backups). ===== 3) Datenarten & Schutzbedarf ===== ^ Kategorie ^ Beispiele ^ Schutz-Niveau ^ | **PII (Personendaten)** | Name, E-Mail, IP, Benutzername | **Mittel–hoch** | | **Besonders schützenswerte Daten** | Gesundheit, Religion, politische Meinung | **Hoch** | | **Geschäftsgeheimnisse** | Preise intern, Prototypen | **Mittel–hoch** | | **Betriebsdaten** | Log- & Metrikdaten (können PII enthalten) | **Abhängig vom Inhalt** | ===== 4) Grundsätze (DSG/DSGVO) in die Praxis übersetzen ===== * **Datenminimierung:** Nur speichern, was nötig ist (z. B. keine unnötigen Felder). * **Zweckbindung:** Daten nur für definierte Zwecke verwenden (kein «Sammeln auf Vorrat»). * **Richtigkeit & Aktualität:** Korrekte, aktuelle Daten (Korrekturen erlauben). * **Speicherbegrenzung:** **Lösch-/Archivfristen** umsetzen (auch in Backups!). * **Integrität & Vertraulichkeit:** Zugriffsschutz, Verschlüsselung, Härtung. * **Rechenschaftspflicht:** Nachweisbar dokumentieren (wer hat wann was getan). ===== 5) Technische & organisatorische Massnahmen (TOM) für MySQL ===== ==== 5.1 Zugriff & Rollen (Least Privilege) ==== * **Eigene DB-User** je Anwendung/Team (nicht ''root''). * **Rollen/Grants** gezielt: **RO** (read-only) fürs Reporting, **RW** (read-write) fürs Backend. * **Host einschränken** (''user'@'localhost'' statt ''%''). -- Beispiel: minimaler App-User (nur SELECT/INSERT auf produktivem Schema) CREATE USER 'app_ro'@'localhost' IDENTIFIED BY 'Str0ng!Pass'; GRANT SELECT ON prod_db.* TO 'app_ro'@'localhost'; ==== 5.2 Starke Passwörter & Policies ==== * **validate_password**-Komponente aktivieren (Länge, Komplexität). * **Rotation/Ablauf** & **Account-Lock** nach Fehlversuchen nutzen. -- Passwortrichtlinie (Beispiel; Anpassung je nach Policy) INSTALL COMPONENT 'file://component_validate_password'; SET PERSIST validate_password.length = 12; -- Ablauf/Lock pro Benutzer ALTER USER 'app_rw'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY; ALTER USER 'app_rw'@'localhost' FAILED_LOGIN_ATTEMPTS 6 PASSWORD_LOCK_TIME 2; ==== 5.3 Verschlüsselung – Transport & Ruhe ==== * **Transport (in transit):** **TLS/SSL** erzwingen (Client↔Server). * **Speicher (at rest):** InnoDB-**Tablespace Encryption** + Keyring. **Transport erzwingen (Server)** # my.cnf (Beispiel) require_secure_transport = ON ssl_cert = /etc/mysql/ssl/server-cert.pem ssl_key = /etc/mysql/ssl/server-key.pem ssl_ca = /etc/mysql/ssl/ca.pem **At-Rest (InnoDB)** # my.cnf early-plugin-load = keyring_file.so keyring_file_data = /var/lib/mysql-keyring/keyring innodb_encrypt_tables = ON innodb_encrypt_log = ON -- Schlüsselrotation ALTER INSTANCE ROTATE INNODB MASTER KEY; ==== 5.4 Protokollierung & Auditing (sparsam mit PII) ==== * **Kein** dauerhaftes General Log in Produktion (PII-Risiko, Performance). * **Audit** gezielt (Wer/Was/Wann), Query-Parameter nicht im Klartext, Retention mit Löschfristen. * Zugriff auf Logs einschränken. ==== 5.5 Backups & Wiederherstellung ==== * **Verschlüsselte** Backups (z. B. ''mysqldump | gpg''). * **Restore regelmässig testen** (auch Rechte/Versionen). * **Aufbewahrungsfristen** + **Löschkonzept** (auch in Off-Site/Cloud). * **Anonymisierte** Backups für Dev/Schulung (keine produktiven PII). # Beispiel: verschlüsseltes Dump mysqldump --single-transaction --routines prod_db \ | gpg --symmetric --cipher-algo AES256 \ > prod_db-$(date +%F).sql.gpg ==== 5.6 Datenmaskierung/Anonymisierung (für Test & Analytics) ==== * **Views** zur Spaltenmaskierung, **Hashes/Pseudonyme** für E-Mails, **Rauschen** für Metriken. -- Beispiel: Sicht mit maskierter E-Mail CREATE OR REPLACE VIEW v_users_masked AS SELECT user_id, display_name, CONCAT(LEFT(email,2),'***@',SUBSTRING_INDEX(email,'@',-1)) AS email_masked FROM users; -- Pseudonymisierung (one-way Hash) UPDATE users SET email = SHA2(email,256) WHERE /* in Dev/Copy */ 1=1; ==== 5.7 WordPress-spezifische Hinweise ==== * **DB-User mit Minimalrechten:** Für WP-Betrieb **kein root**, nur benötigte Rechte auf **WP-Schema**. * **Core/Plugins/Themes** aktuell halten; nur **notwendige** Plugins; regelmässig **Sicherheitsupdates**. * **wp-config.php** härten: **AUTH_KEYS/SALTS** setzen, **DISALLOW_FILE_EDIT** aktivieren. * **HTTPS erzwingen** (HSTS), **Adminbereich schützen** (2FA, IP-Restriktion). * **Formulare/Kommentare:** PII-Felder minimieren; IP-Adressen **anonymisieren**; klare **Privacy Policy**. * **Backups & Logs**: enthalten oft PII → **verschlüsseln**, Retention definieren, Zugriff beschränken. ===== 6) Prozesse & Organisation ===== * **Auskunft/Berichtigung/Löschung**: Abläufe & Fristen definieren (auch für DB-Backups & Off-Site-Kopien). * **Breach-Response**: Erkennen, Melden, Beheben, Dokumentieren (DSG/DSGVO Fristen). * **Verzeichnis von Verarbeitungstätigkeiten** pflegen (wer verarbeitet was, wo, warum, wie lange?). * **Auftragsverarbeitung** (Hosting/Cloud): Verträge mit **SCC**/**AVV** prüfen, Speicherort/Transfer klären. ===== 7) Datenschutz-Quickcheck (für Projekte) ===== - [ ] **Minimaldaten**? (nur notwendige Felder) - [ ] **DB-User getrennt**, **Least Privilege** umgesetzt (RO/RW/Rollen)? - [ ] **TLS** aktiv & erzwungen (''require_secure_transport'')? - [ ] **At-Rest-Verschlüsselung** (InnoDB + Keyring)? - [ ] **Passwortrichtlinie** & **Rotation** aktiv (''validate_password'', ''PASSWORD EXPIRE'')? - [ ] **Backups verschlüsseln**, **Restore getestet**, **Retention** definiert? - [ ] **Logs/Audit**: nur notwendige Daten, Zugriff limitiert, Löschfristen? - [ ] **Anonymisierte Testdaten** statt produktiver PII in Dev/Schulung? - [ ] **WP-Härtung** (Updates, SALTS, kein root, HTTPS, 2FA)? - [ ] **Prozesse** für Auskunft/Löschung/Breach vorhanden & dokumentiert? ===== 8) Glossar (kurz) ===== ^ Begriff ^ Erklärung ^ | **PII** | *Personally Identifiable Information* – Personendaten (z. B. Name, E-Mail, IP). | | **TOM** | Technische & organisatorische Massnahmen (Sicherheitsmassnahmen). | | **At Rest / In Transit** | Daten **im Speicher** / **während der Übertragung**. | | **Least Privilege** | Nur minimal notwendige Rechte vergeben. | | **AVV/SCC** | Auftragsverarbeitungsvertrag / Standardvertragsklauseln (EU). |