Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| modul:m290_guko:learningunits:lu12:theorie:a_einfuerung [2025/11/11 21:28] – gkoch | modul:m290_guko:learningunits:lu12:theorie:a_einfuerung [2025/11/12 00:13] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== LU12a: Data Security & User Management (DCL) – Rollen & Berechtigungen | + | ====== LU12a - Data Security & User Management (DCL) ====== |
| <WRAP round 80% box center> | <WRAP round 80% box center> | ||
| - | **Lernziele (gemäss Bildungsplan)** | + | **MySQL 9.4** · In **zwei Seiten** bauen wir mit der Beispiel-WordPress-Datenbank des Reiseblogs |
| - | | + | Die Lernenden kennen die Blog-Autor: |
| - | * **Datensicherheit/ | + | |
| - | | + | |
| </ | </ | ||
| - | <WRAP info round 80% center> | ||
| - | **Voraussetzungen** | ||
| - | * MySQL **9.4**, WebStorm mit DB-Plugin, Root-Verbindung vorhanden. | ||
| - | * Achtung: Für Produktivsysteme nie mit '' | ||
| - | </ | ||
| - | |||
| - | ===== 0) Kontext & Prinzipien ===== | ||
| - | * **Least Privilege**: | ||
| - | * **Trennung nach Aufgaben**: Lese-User (**RO**)((**RO = Read-Only**: | ||
| - | * **Datenschutz**: | ||
| - | |||
| - | ==== 0.1) Was ist der **root**-User – wofür (nicht)? ==== | ||
| - | <WRAP round 80% box> | ||
| - | **root** ist der **Superuser** von MySQL: hat **alle** Rechte auf dem Server (Benutzer/ | ||
| - | **Verwenden für:** Installation/ | ||
| - | **Nicht verwenden für:** Applikationsbetrieb, | ||
| - | **Warum?** Minimierung von Risiken (Fehlbedienung, | ||
| - | </ | ||
| - | |||
| - | ===== 1) Begriffe – einfach erklärt ===== | ||
| - | <WRAP round 80% box> | ||
| - | **Datenbank vs. Schema** | ||
| - | In MySQL sind **„Datenbank“** und **„Schema“** **synonym** ('' | ||
| - | |||
| - | **Benutzer (User)** | ||
| - | Login-Identität in der Form '' | ||
| - | |||
| - | **Rolle (Role)** | ||
| - | Bündel aus **Rechten** (Privilegien). Erleichtert Verwaltung: Rechte **einmal** an die Rolle vergeben, Rolle an **viele Benutzer** zuweisen. | ||
| - | |||
| - | **Grant (Privileg)** | ||
| - | Konkrete **Berechtigung**, | ||
| - | </ | ||
| - | |||
| - | ==== 1.1) Wo wirken Rechte? (Ebenen) ==== | ||
| - | <WRAP round 80% box> | ||
| - | ^ Ebene ^ Beispiel ^ Typische Grants ^ | ||
| - | | **Global** (Serverweit) | alles auf dem Server | '' | ||
| - | | **Datenbank/ | ||
| - | | **Tabelle** | '' | ||
| - | | **Spalte** | '' | ||
| - | | **Routine** | '' | ||
| - | </ | ||
| - | //Hinweis: Hier folgt in der Stunde eine **Grafik** (Levels-Diagramm).// | ||
| - | |||
| - | ==== 1.2) Benutzer vs. Rollen vs. Grants – auf einen Blick ==== | ||
| - | <WRAP round 80% box> | ||
| - | ^ Begriff ^ Kurzdefinition ^ Beispiel-Befehl ^ | ||
| - | | **Benutzer** | Wer darf sich von **wo** verbinden? | '' | ||
| - | | **Rolle** | Bündel von Rechten, mehrfach nutzbar | '' | ||
| - | | **Grant** | Konkrete Berechtigung | '' | ||
| - | | **Zuweisung** | Rolle → Benutzer | '' | ||
| - | | **Aktivierung** | Standardrolle setzen | '' | ||
| - | </ | ||
| - | |||
| - | ==== 1.3) Hosts – '' | ||
| - | <WRAP round 80% box> | ||
| - | **'' | ||
| - | • **'' | ||
| - | • **'' | ||
| - | • **Spezifische Hosts/ | ||
| - | **Best Practice:** so **eng wie möglich** einschränken (z. B. nur App-Server IP), nie unnötig '' | ||
| - | </ | ||
| - | |||
| - | ===== 2) Schritt-für-Schritt: | ||
| - | <WRAP tip round 80% center> | ||
| - | **Ziel**: Demo-Datenbank '' | ||
| - | **Werkzeug**: | ||
| - | </ | ||
| - | |||
| - | <WRAP round 80% box> | ||
| - | **2.1 Demo-Schema & Tabelle** | ||
| - | <code sql> | ||
| - | CREATE DATABASE IF NOT EXISTS app_demo; | ||
| - | USE app_demo; | ||
| - | |||
| - | CREATE TABLE IF NOT EXISTS notes( | ||
| - | id INT PRIMARY KEY AUTO_INCREMENT, | ||
| - | owner VARCHAR(64) NOT NULL, | ||
| - | body TEXT | ||
| - | ); | ||
| - | </ | ||
| - | |||
| - | **2.2 Rollen definieren** | ||
| - | <code sql> | ||
| - | CREATE ROLE IF NOT EXISTS ' | ||
| - | |||
| - | GRANT SELECT | ||
| - | GRANT SELECT, INSERT, UPDATE, DELETE ON app_demo.* TO ' | ||
| - | GRANT ALL PRIVILEGES | ||
| - | </ | ||
| - | |||
| - | **2.3 Benutzer anlegen (lokal)** | ||
| - | <code sql> | ||
| - | CREATE USER IF NOT EXISTS ' | ||
| - | CREATE USER IF NOT EXISTS ' | ||
| - | CREATE USER IF NOT EXISTS ' | ||
| - | </ | ||
| - | |||
| - | **2.4 Rollen zuweisen & Standardrolle setzen** | ||
| - | <code sql> | ||
| - | GRANT ' | ||
| - | GRANT ' | ||
| - | GRANT ' | ||
| - | |||
| - | SET DEFAULT ROLE ' | ||
| - | SET DEFAULT ROLE ' | ||
| - | SET DEFAULT ROLE ' | ||
| - | </ | ||
| - | |||
| - | **2.5 Kontrolle** | ||
| - | <code sql> | ||
| - | SHOW GRANTS FOR ' | ||
| - | </ | ||
| - | </ | ||
| - | ===== 3) Test: Rollen wirken lassen ===== | ||
| <WRAP round 80% box center> | <WRAP round 80% box center> | ||
| - | **Als '' | + | **Wichtig (Abgrenzung WordPress vs. MySQL): |
| - | Erwartung: '' | + | WordPress-**Rollen** (z. B. **Administrator**, |
| + | Hier modellieren wir **MySQL-Rollen** (DB-Rechte). Wir bilden die WP-Rollen **sinngemäss** ab, damit ihr Least-Privilege auf DB-Ebene versteht. | ||
| + | Im echten WP-Betrieb verwendet man i. d. R. **einen** DB-Benutzer mit definierten Rechten; App-Rollen regelt WordPress selbst. | ||
| </ | </ | ||
| + | ===== Was ist der root-User? ===== | ||
| <WRAP round 80% box> | <WRAP round 80% box> | ||
| - | **3.1 Read-Only testen** | + | **root** ist der **Superuser** von MySQL: hat **alle** Rechte auf dem Server |
| - | <code sql> | + | **Verwenden für:** Installation, |
| - | -- als app_ro | + | **Nicht verwenden für:** Applikationsbetrieb, |
| - | USE app_demo; | + | |
| - | SELECT | + | |
| - | INSERT INTO notes(owner, body) VALUES (' | + | |
| - | </code> | + | |
| - | + | ||
| - | **3.2 Rechte ändern | + | |
| - | <code sql> | + | |
| - | -- als root | + | |
| - | REVOKE ' | + | |
| - | GRANT ' | + | |
| - | SHOW GRANTS FOR ' | + | |
| - | </ | + | |
| </ | </ | ||
| - | ===== 4) Feingranular & Sicherheit | + | ===== Grundbegriffe (einfach) ===== |
| <WRAP round 80% box> | <WRAP round 80% box> | ||
| - | **Spaltenrechte** | + | ^ Begriff ^ Kurz erklärt ^ Beispiel ^ |
| - | <code sql> | + | | **Datenbank/Schema** | In MySQL synonym; Container für Tabellen | '' |
| - | GRANT SELECT(id, owner) ON app_demo.notes TO ' | + | | **Tabelle** | Struktur mit Zeilen/Spalten | '' |
| - | </code> | + | | **Benutzer** |
| - | + | | **Host** | Woher der Login kommen darf | '' | |
| - | **Passwort-Policy & Ablauf** | + | | **Grant |
| - | <code sql> | + | | **Rolle** | Bündel aus Rechten; an viele Benutzer zuweisbar | '' |
| - | ALTER USER ' | + | |
| - | ALTER USER 'app_rw'@' | + | |
| - | -- ALTER USER 'app_rw'@' | + | |
| - | </ | + | |
| - | + | ||
| - | **Benutzer & Hosts auflisten** | + | |
| - | <code sql> | + | |
| - | SELECT user, host FROM mysql.user ORDER BY user, host; | + | |
| - | </code> | + | |
| - | </ | + | |
| - | + | ||
| - | ===== 5) Mini-Quiz | + | |
| - | * Worin unterscheiden sich **Benutzer**, **Rollen** und **Grants** – und wie spielen sie zusammen? | + | |
| - | * Warum ist '' | + | |
| - | * Was bedeutet | + | |
| - | * Bonus: Warum gehört **root** nicht in den Applikationsbetrieb? | + | |
| - | + | ||
| - | <WRAP alert round 80% center> | + | |
| - | **Best Practice** | + | |
| - | * Keine App unter '' | + | |
| - | * Host einschränken ('' | + | |
| - | * Rollen verwenden | + | |
| - | | + | |
| - | | + | |
| - | * Im Code **Prepared Statements** verwenden (Thema in der Backend-LU). | + | |
| </ | </ | ||