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:16] – gkoch | modul:m290_guko:learningunits:lu12:theorie:a_einfuerung [2025/11/12 00:13] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | ====== | + | ====== |
| <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 8.x, WebStorm mit DB-Plugin, Root-Verbindung vorhanden. | ||
| - | * Achtung: Für Produktivsysteme nie mit '' | ||
| - | </ | ||
| - | |||
| - | ===== 0) Kontext & Prinzipien ===== | ||
| - | * **Least Privilege**: | ||
| - | * **Trennung nach Aufgaben**: Lese-User (RO), Schreib-User (RW), Admin-User. | ||
| - | * **Datenschutz**: | ||
| - | |||
| - | ===== 1) Begriffe & Ebenen der Berechtigungen ===== | ||
| - | <WRAP round 80% box> | ||
| - | **Ebenen**: Global → Schema → Tabelle → Spalte → Routine (PROCEDURE/ | ||
| - | **Rollen** (MySQL 8): Mehrere Privilegien bündeln, **einmal** verwalten, **mehrfach** zuweisen. | ||
| - | **Benutzer**: | ||
| - | </ | ||
| - | |||
| - | ===== 2) Schritt-für-Schritt: | ||
| - | <WRAP tip round 80% center> | ||
| - | **Ziel**: Demo-Schema '' | ||
| - | **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 | ||
| - | 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/ |
| - | GRANT SELECT(id, owner) ON app_demo.notes TO 'app_ro'@'localhost'; | + | | **Tabelle** | Struktur mit Zeilen/ |
| - | </ | + | | **Benutzer** | Login-Identität '' |
| - | + | | **Host** | Woher der Login kommen darf | '' | |
| - | **Passwort-Policy & Ablauf** | + | | **Grant (Privileg)** | Konkrete Berechtigung |
| - | <code sql> | + | | **Rolle** | Bündel aus Rechten; an viele Benutzer zuweisbar | '' |
| - | ALTER USER 'app_rw' | + | |
| - | ALTER USER 'app_rw'@'localhost' | + | |
| - | -- ALTER USER 'app_rw' | + | |
| - | </ | + | |
| - | + | ||
| - | **Benutzer & Hosts auflisten** | + | |
| - | <code sql> | + | |
| - | SELECT user, host FROM mysql.user ORDER BY user, host; | + | |
| - | </ | + | |
| - | </ | + | |
| - | + | ||
| - | ===== 5) Mini-Quiz | + | |
| - | * Worin unterscheiden sich **WHERE** und **HAVING**? | + | |
| - | * Warum ist '' | + | |
| - | * Was bedeutet '' | + | |
| - | * Wie helfen | + | |
| - | + | ||
| - | <WRAP alert round 80% center> | + | |
| - | **Best Practice** | + | |
| - | * Keine App unter '' | + | |
| - | * Backups schützen (siehe **LU12B**). • Im Code mit **Prepared Statements** arbeiten (LU Backend). | + | |
| </ | </ | ||