Dies ist eine alte Version des Dokuments!
LU12c: MySQL – Rollen & Berechtigungen im Reiseblog
Lernziele dieser Seite
Sie können …
- den Unterschied zwischen Anwendungsbenutzer und Datenbankbenutzer erklären.
- mit den Befehlen
CREATE USER,GRANT,REVOKE,CREATE ROLEin MySQL arbeiten.
Anwendungsbenutzer vs. Datenbankbenutzer
Im Beispielprojekt travel_blog gibt es eine Tabelle users für die Benutzer der WordPress-Applikation Reiseblog. Diese Einträge gehören zur Webanwendung, nicht zur MySQL-Benutzerverwaltung.
| id | username | name | |
|---|---|---|---|
| 1 | caro | [caro@wetraveltheworld.de](mailto:caro@wetraveltheworld.de) | Caro Steig |
| 2 | martin | [martin@wetraveltheworld.de](mailto:martin@wetraveltheworld.de) | Martin Merten |
| 3 | shaolin | [shaolin@wetraveltheworld.de](mailto:shaolin@wetraveltheworld.de) | Shaolin Tran |
MySQL-Benutzerkonten werden dagegen im System mysql.user gespeichert. Das heisst, diese User haben Zugriff auf (Teile) der Datenbank in MySQL:
'caro'@'%''martin'@'%''travel_app'@'localhost'
Wichtig:
Die Einträge in travel_blog.users und in mysql.user sind zwei verschiedene Ebenen, auch wenn sie zufällig gleich heissen:
travel_blog.users→ Wer darf sich im Reiseblog einloggen? (Anwendung)mysql.user→ Wer darf direkt in MySQL Änderungen machen? (Datenbank)
Best Practice: root nur für Administration
Der Benutzer root wird bei der MySQL-Installation automatisch erstellt.
roothat volle Kontrolle über den Server (alle Datenbanken, alle Tabellen, alle Benutzer).- Anwendungen sollten niemals mit
rootarbeiten.
Besser ist:
- spezifische Admin-Benutzer (z. B.
caro,martin) mit einer Admin-Rolle (db_admin), - eine eigene technische Benutzerkennung für die Anwendung (z. B.
travel_app), die nur die benötigten Rechte erhält.
So setzen Sie das Prinzip der minimalen Privilegien auch auf Datenbankebene um.
Schritt 1: travel_blog-Datenbank vorbereiten
Annahme: Die Datenbank travel_blog mit den Tabellen posts, users, categories, post_category existiert bereits.
Wir ergänzen eine Tabelle comments für Blog-Kommentare:
USE travel_blog; CREATE TABLE comments ( id INT AUTO_INCREMENT PRIMARY KEY, post_id INT NOT NULL, user_id INT NOT NULL, comment_text TEXT NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT fk_comments_post FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE, CONSTRAINT fk_comments_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE );
Damit ist technisch klar, wo Kommentare gespeichert werden und wie sie mit Posts und Benutzer*innen verknüpft sind.
Schritt 2: Rollen definieren
Wir bilden die im Text genannten Personen und Aufgaben im MySQL-Rollenkonzept ab.
Geplante Rollen
* db_admin
- volle Rechte auf
travel_blog.* - darf Rechte weitergeben (
GRANT OPTION) - gedacht für: Caro Steig, Martin Merten
* post_editor
SELECT/INSERT/UPDATE/DELETEaufpostsundcategories- z. B. für: Shaolin Tran (Blog-Redaktion)
* comment_moderator
SELECT/INSERT/UPDATE/DELETEaufcomments- z. B. für: Joachim Steig (Moderation der Kommentare)
* app_readwrite
SELECT/INSERT/UPDATE/DELETEauf den Anwendungstabellen- wird von der späteren Backend-Anwendung (Node.js / Express) verwendet
Rollen in MySQL anlegen
CREATE ROLE db_admin; CREATE ROLE post_editor; CREATE ROLE comment_moderator; CREATE ROLE app_readwrite;
Merksatz: Vergeben Sie Berechtigungen wenn möglich an Rollen, nicht direkt an einzelne Benutzer. Benutzer bekommen danach nur noch Rollen zugewiesen – das ist übersichtlicher und skalierbarer.
Schritt 3: Rechte an Rollen vergeben (GRANT)
Jetzt hinterlegen Sie bei jeder Rolle, was sie darf.
Rolle ''db_admin''
GRANT ALL PRIVILEGES ON travel_blog.* TO db_admin WITH GRANT OPTION;
Diese Rolle darf alles in der Datenbank travel_blog und darf diese Rechte auch an andere weitergeben.
Rolle ''post_editor'' (z. B. Shaolin)
GRANT SELECT, INSERT, UPDATE, DELETE ON travel_blog.posts TO post_editor; GRANT SELECT, INSERT, UPDATE, DELETE ON travel_blog.categories TO post_editor;
Rolle ''comment_moderator'' (z. B. Joachim)
GRANT SELECT, INSERT, UPDATE, DELETE ON travel_blog.comments TO comment_moderator;
Wenn Sie möchten, dass normale Blog-Besucher*innen nur eigene Kommentare anlegen können, bekommt der Webserver später weniger Rechte (z. B. nur INSERT und SELECT) und die Businesslogik prüft, wer was ändern darf.
Rolle ''app_readwrite'' (für die Anwendung)
GRANT SELECT, INSERT, UPDATE, DELETE ON travel_blog.* TO app_readwrite;
Diese Rolle wird später vom Backend (Node.js / Express) verwendet, um über eine REST-API CRUD-Operationen auszuführen – aber nur auf der Datenbank travel_blog, nicht auf dem ganzen MySQL-Server.
Schritt 4: Benutzer erstellen und Rollen zuweisen
Nun legen Sie wenige, klar definierte MySQL-Benutzer an und geben ihnen die passenden Rollen.
Beispielhafte Benutzer:
caro– Admin im Reiseblog-Projektmartin– Admin im Reiseblog-Projektshaolin– Redaktorin für Blogbeiträgejoachim– Moderator für Kommentaretravel_app– technischer Benutzer für die Webanwendung
Benutzer anlegen (CREATE USER)
CREATE USER 'caro'@'%' IDENTIFIED BY 'CaroS!2025'; CREATE USER 'martin'@'%' IDENTIFIED BY 'MartinM!2025'; CREATE USER 'shaolin'@'%' IDENTIFIED BY 'Shaolin!2025'; CREATE USER 'joachim'@'%' IDENTIFIED BY 'Joachim!2025'; CREATE USER 'travel_app'@'localhost' IDENTIFIED BY 'TravelApp!2025';
*(Hinweis: Verwenden Sie in der Praxis stärkere und individuelle Passwörter – diese dienen nur als Beispiel im Unterricht.)*
Rollen zuweisen (GRANT … TO Benutzer)
-- Admin-Rolle für Caro und Martin GRANT db_admin TO 'caro'@'%', 'martin'@'%'; -- Editor-Rolle für Shaolin GRANT post_editor TO 'shaolin'@'%'; -- Kommentar-Moderation für Joachim GRANT comment_moderator TO 'joachim'@'%'; -- Rolle für die Anwendung GRANT app_readwrite TO 'travel_app'@'localhost';
Damit ist die Verbindung klar:
* Caro und Martin: Admins mit voller Verantwortung für die Datenbank. * Shaolin: Darf Inhalte (Posts, Kategorien) bearbeiten, aber keine Struktur ändern. * Joachim: Darf Kommentare moderieren. * travel_app: Wird vom Backend genutzt – kein Login durch reale Personen.
Rechte kontrollieren: SHOW GRANTS
Um zu prüfen, welche Rechte ein Benutzer effektiv hat, verwenden Sie:
SHOW GRANTS FOR 'caro'@'%'; SHOW GRANTS FOR 'shaolin'@'%'; SHOW GRANTS FOR 'travel_app'@'localhost';
MySQL zeigt dabei an, welche Rollen und Privilegien dem jeweiligen Account zugeordnet sind.
Wenn sich Aufgaben ändern (z. B. verlässt jemand das Projekt), können Sie Rollen oder Benutzer mit REVOKE und DROP ROLE bzw. DROP USER wieder sauber entfernen.
Verbindung zu DSG/DSGVO & Schulbeispielen
Die Rollen und Berechtigungen im Reiseblog-Beispiel setzen zentrale Datenschutzprinzipien technisch um:
* Schutz vor unbefugtem Zugriff
- Nur definierte Rollen (z. B.
db_admin,post_editor) dürfen auf bestimmte Tabellen zugreifen.
* Vertraulichkeit, Integrität, Verfügbarkeit
- Admins dürfen mehr, Redaktor*innen nur so viel wie nötig, die App nur, was für ihren Zweck erforderlich ist.
* Need-to-know / Prinzip der minimalen Privilegien
- Keine Nutzung von
rootdurch Anwendungen. travel_apphat nur Rechte intravel_blog, nicht auf dem gesamten Server.
Die Logik ist die gleiche wie in den Schul-Beispielen (WebUntis, Moodle, Absenzen-Tool, Notenbuch, Lohnliste):
* Schulleitung und Verwaltung haben mehr Rechte als Lehrpersonen. * Lehrpersonen haben mehr Rechte als Lernende. * Lernende haben oft nur Leserechte oder dürfen nur eigene Daten bearbeiten. * Lohn- und Personaldaten sind besonders geschützt und nur für sehr wenige Rollen sichtbar.
In früheren Lerneinheiten (LU08, LU09) haben Sie Daten in Beziehung gesetzt und abgefragt. Jetzt erweitern Sie diese Sicht um die Frage:
* Wer darf was mit diesen Daten tun?
Das ist der Kern von Handlungsziel 6:
*Rollen und Berechtigungen vergeben, um Datensicherheit und Datenschutz zu gewährleisten.*