Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m290_guko:learningunits:lu12:theorie:a_einfuerung [2025/11/11 21:16] gkochmodul: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 **wetraveltheworld.de** ein sauberes **User-Rechte- und Rollen-Konzept** auf.   
-  * **Rollen/Berechtigungen** vergeben (**GRANT/REVOKE**, Benutzer & Rollen verwalten)   +Die Lernenden kennen die Blog-Autor:innen bereits aus den JOIN-Übungen: **Caro Steig****Martin Merten** und **Shaolin Tran**.
-   **Datensicherheit/Datenschutz**: Prinzipien & schützenswerte Daten erkennen   +
-  MySQL-spezifische **DCL-Befehle** sicher anwenden+
 </WRAP> </WRAP>
  
-<WRAP info round 80% center> 
-**Voraussetzungen**   
-  * MySQL 8.x, WebStorm mit DB-Plugin, Root-Verbindung vorhanden.   
-  * Achtung: Für Produktivsysteme nie mit ''root'' arbeiten – im Unterricht nutzen wir ''root'' **nur** zum Einrichten. 
-</WRAP> 
- 
-===== 0) Kontext & Prinzipien ===== 
-  * **Least Privilege**: Jeder Account erhält nur die **minimal** benötigten Rechte.   
-  * **Trennung nach Aufgaben**: Lese-User (RO), Schreib-User (RW), Admin-User.   
-  * **Datenschutz**: Personenbezug erkennen (PII), Zugriff beschränken, Backups schützen. 
- 
-===== 1) Begriffe & Ebenen der Berechtigungen ===== 
-<WRAP round 80% box> 
-**Ebenen**: Global → Schema → Tabelle → Spalte → Routine (PROCEDURE/FUNCTION).   
-**Rollen** (MySQL 8): Mehrere Privilegien bündeln, **einmal** verwalten, **mehrfach** zuweisen.   
-**Benutzer**: ''user'@'host'' (Host einschränken: ''localhost'' vs. ''%'' für extern). 
-</WRAP> 
- 
-===== 2) Schritt-für-Schritt: Rollen & Benutzer anlegen ===== 
-<WRAP tip round 80% center> 
-**Ziel**: Demo-Schema ''app_demo'' + Rollen ''app_read'', ''app_write'', ''app_admin'' + passende Benutzer.   
-**Werkzeug**: WebStorm → Datenbank → SQL-Konsole (als ''root''). 
-</WRAP> 
- 
-<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 
-); 
-</code> 
- 
-**2.2 Rollen definieren**   
-<code sql> 
-CREATE ROLE IF NOT EXISTS 'app_read', 'app_write', 'app_admin'; 
- 
-GRANT SELECT                                ON app_demo.* TO 'app_read'; 
-GRANT SELECT, INSERT, UPDATE, DELETE        ON app_demo.* TO 'app_write'; 
-GRANT ALL PRIVILEGES                        ON app_demo.* TO 'app_admin'; 
-</code> 
- 
-**2.3 Benutzer anlegen (lokal)**   
-<code sql> 
-CREATE USER IF NOT EXISTS 'app_ro'@'localhost'    IDENTIFIED BY 'Str0ng!Ro'; 
-CREATE USER IF NOT EXISTS 'app_rw'@'localhost'    IDENTIFIED BY 'Str0ng!Rw'; 
-CREATE USER IF NOT EXISTS 'app_admin'@'localhost' IDENTIFIED BY 'Str0ng!Admin'; 
-</code> 
- 
-**2.4 Rollen zuweisen & Standardrolle setzen**   
-<code sql> 
-GRANT 'app_read'  TO 'app_ro'@'localhost'; 
-GRANT 'app_write' TO 'app_rw'@'localhost'; 
-GRANT 'app_admin' TO 'app_admin'@'localhost'; 
- 
-SET DEFAULT ROLE 'app_read'  TO 'app_ro'@'localhost'; 
-SET DEFAULT ROLE 'app_write' TO 'app_rw'@'localhost'; 
-SET DEFAULT ROLE 'app_admin' TO 'app_admin'@'localhost'; 
-</code> 
- 
-**2.5 Kontrolle**   
-<code sql> 
-SHOW GRANTS FOR 'app_rw'@'localhost'; 
-</code> 
-</WRAP> 
  
-===== 3) Test: Rollen wirken lassen ===== 
 <WRAP round 80% box center> <WRAP round 80% box center>
-**Als ''app_ro'' verbinden** (neue Verbindung in WebStorm).   +**Wichtig (Abgrenzung WordPress vs. MySQL):**   
-Erwartung: ''SELECT''''INSERT/UPDATE/DELETE''.+WordPress-**Rollen** (z. B. **Administrator**, **Redakteur**, **Autor**sind **Anwendungs-Rollen** innerhalb von WordPress.   
 +Hier modellieren wir **MySQL-Rollen** (DB-Rechte). Wir bilden die WP-Rollen **sinngemäss** abdamit 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.
 </WRAP> </WRAP>
  
 +===== 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 (alle DatenbankenBenutzerverwaltungServeroperationen)  
-<code sql> +**Verwenden für:** Installation, **Benutzer/Rollen anlegen**, **Rechte vergeben/entziehen**, Backups testen.   
--- als app_ro +**Nicht verwenden für:** Applikationsbetrieb, tägliche QueriesDafür dedizierte **RO**- (Read-Onlyund **RW**-Benutzer (Read-Write) einsetzen (**Least Privilege**).
-USE app_demo; +
-SELECT FROM notes;         -- sollte funktionieren +
-INSERT INTO notes(ownerbody) VALUES ('lisa','hello') -- sollte fehlschlagen (permission) +
-</code> +
- +
-**3.2 Rechte ändern (root)**   +
-<code sql> +
--- als root +
-REVOKE 'app_write' FROM 'app_rw'@'localhost'; +
-GRANT  'app_read'  TO   'app_rw'@'localhost'; +
-SHOW GRANTS FOR 'app_rw'@'localhost'; +
-</code>+
 </WRAP> </WRAP>
  
-===== 4Feingranular & 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 | ''CREATE DATABASE app_demo;'' 
-GRANT SELECT(id, owner) ON app_demo.notes TO 'app_ro'@'localhost'; +| **Tabelle** | Struktur mit Zeilen/Spalten | ''CREATE TABLE notes(...);'' | 
-</code> +**Benutzer** | Login-Identität ''user''@''host'' ''CREATE USER 'eva'@'localhost' ...;'' | 
- +**Host** | Woher der Login kommen darf | ''localhost'' = gleicher Rechner''%'' von überall (vorsichtig!| 
-**Passwort-Policy & Ablauf**   +**Grant (Privileg)** | Konkrete Berechtigung (z. B. SELECT) ''GRANT SELECT ON db.* TO ...;'' | 
-<code sql> +**Rolle** | Bündel aus Rechten; an viele Benutzer zuweisbar | ''CREATE ROLE 'app_read';'' |
-ALTER USER 'app_rw'@'localhostPASSWORD EXPIRE INTERVAL 90 DAY; +
-ALTER USER 'app_rw'@'localhostACCOUNT LOCK;   -- bei Bedarf +
--- ALTER USER 'app_rw'@'localhost' ACCOUNT UNLOCK+
-</code> +
- +
-**Benutzer & Hosts auflisten**   +
-<code sql> +
-SELECT user, host FROM mysql.user ORDER BY user, host; +
-</code> +
-</WRAP> +
- +
-===== 5) Mini-Quiz (Kontrollfragen===== +
-  Worin unterscheiden sich **WHERE** und **HAVING**? (Querbezug Aggregation + Rechteprüfung via SELECT)   +
-  * Warum ist ''GRANT ALL ON *.*'' für App-User problematisch?   +
-  * Was bedeutet ''user'@'localhost'' vs. ''user'@'%''?   +
-  Wie helfen **Rollen** bei späterem **Node/Express**-Backend? +
- +
-<WRAP alert round 80% center> +
-**Best Practice**   +
-  * Keine App unter ''root'' betreiben. +
-  * Host einschränken. +
-  * Rollen verwenden. +
-  * Passwörter rotieren.   +
-  * Backups schützen (siehe **LU12B**). +
-  * Im Code mit **Prepared Statements** arbeiten (LU Backend).+
 </WRAP> </WRAP>
  
  • modul/m290_guko/learningunits/lu12/theorie/a_einfuerung.1762892205.txt.gz
  • Zuletzt geändert: 2025/11/11 21:16
  • von gkoch