Dies ist eine alte Version des Dokuments!


LU12c: MySQL – Rollen & Berechtigungen im Reiseblog

Sie können …

* den Unterschied zwischen Anwendungsbenutzer und Datenbankbenutzer erklären. * mit den Befehlen CREATE USER, GRANT, REVOKE, CREATE ROLE in MySQL arbeiten. * für das Beispiel travel_blog mit genau zwei Rollen und zwei Benutzern ein einfaches, nachvollziehbares Berechtigungskonzept erstellen.

Im Beispielprojekt travel_blog gibt es eine Tabelle users für die Benutzer der Fachanwendung (Reiseblog). Diese Einträge gehören zur Webanwendung, nicht zur MySQL-Benutzerverwaltung.

id username email 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, z. B.:

* 'caro'@'%' * '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 mit MySQL sprechen? (Datenbank)

Diese Trennung ist wichtig für Datenschutz (DSG/DSGVO) und Datensicherheit.

Der Benutzer root wird bei der MySQL-Installation automatisch erstellt.

* root hat volle Kontrolle über den Server (alle Datenbanken, alle Tabellen, alle Benutzer). * Anwendungen sollten niemals mit root arbeiten.

Besser ist:

* eine Admin-Benutzerin (z. B. caro) mit einer Admin-Rolle (db_admin), * ein eigener technischer Benutzer für die Anwendung (z. B. travel_app), der nur die minimal nötigen Rechte erhält.

So setzen Sie das Prinzip der minimalen Privilegien (Need-to-know) auch auf Datenbankebene um.

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 klar, wo Kommentare gespeichert werden und wie sie mit Posts und Benutzer*innen verknüpft sind.

Wir vereinfachen bewusst und arbeiten nur mit zwei Rollen:

* einer Admin-Rolle für die verantwortliche Person im Projekt, * einer Anwendungsrolle für den technischen Zugriff der Webanwendung.

* volle Rechte auf travel_blog.* * darf Rechte weitergeben (GRANT OPTION) * gedacht für: Caro Steig (Admin im Reiseblog-Projekt)

* SELECT, INSERT, UPDATE, DELETE auf allen Tabellen in travel_blog * keine Berechtigungen, die Struktur zu ändern (kein CREATE TABLE, kein DROP usw.) * gedacht für: den technischen Benutzer travel_app (Backend / Node.js / Express)

CREATE ROLE db_admin;
CREATE ROLE blog_app; 

Merksatz: Berechtigungen werden an Rollen vergeben. Die eigentlichen Benutzer erhalten später nur Rollen – nicht einzelne Privilegien.

Nun legen Sie fest, was die beiden Rollen genau dürfen.

GRANT ALL PRIVILEGES
ON travel_blog.*
TO db_admin
WITH GRANT OPTION; 

Die Rolle db_admin kann damit alles in der Datenbank travel_blog tun (Tabellen anlegen, Daten ändern, Rechte vergeben usw.). Sie ist vergleichbar mit einer Schulleitung / IT-Administration im Schulbeispiel.

GRANT SELECT, INSERT, UPDATE, DELETE
ON travel_blog.*
TO blog_app; 

Die Rolle blog_app darf:

* Daten lesen (SELECT), * neue Datensätze anlegen (INSERT), * vorhandene Datensätze ändern (UPDATE), * Datensätze löschen (DELETE).

Sie darf aber keine Tabellen anlegen oder löschen und keine Rechte vergeben. Damit ist die Schadenswirkung im Falle eines Fehlers oder Angriffs deutlich begrenzt – ganz im Sinne von DSG/DSGVO.

Jetzt legen Sie genau zwei MySQL-Benutzer an:

* eine Admin-Benutzerin (caro), * einen technischen Benutzer für die Anwendung (travel_app).

CREATE USER 'caro'@'%'
IDENTIFIED BY 'CaroS!2025';
 
CREATE USER 'travel_app'@'localhost'
IDENTIFIED BY 'TravelApp!2025'; 

Hinweise:

* 'caro'@'%' → Caro darf sich von überall her mit passenden Zugangsdaten verbinden (nur zu Demonstrationszwecken). * 'travel_app'@'localhost' → Die Anwendung darf nur vom Server selbst aus auf MySQL zugreifen. * In der Praxis sollten Sie selbstverständlich stärkere und individuelle Passwörter verwenden.

GRANT db_admin
TO 'caro'@'%';
 
GRANT blog_app
TO 'travel_app'@'localhost'; 

Damit ist die Zuordnung klar und leicht erklärbar:

* Caro ist fachlich und technisch verantwortlich für die Datenbank travel_blog (Admin-Rolle). * travel_app ist eine reine Service-Kennung für den Webserver / das Backend und arbeitet mit eingeschränkten Rechten.

Mit SHOW GRANTS können Sie jederzeit prüfen, welche Rechte ein Benutzer effektiv besitzt.

SHOW GRANTS FOR 'caro'@'%';
SHOW GRANTS FOR 'travel_app'@'localhost'; 

So können Sie im Unterricht sehr gut sichtbar machen:

* Admin-Benutzerin caro → viele Rechte (über die Rolle db_admin), * Anwendungsbenutzer travel_app → nur die minimal nötigen Rechte (blog_app).

Wenn sich später Aufgaben ändern (z. B. eine andere Person übernimmt die Adminrolle), können Sie einfach:

* eine neue Benutzerkennung anlegen, * die Rolle db_admin von caro entziehen und der neuen Person geben.

Das Berechtigungskonzept bleibt dabei klar und einfach.

Mit diesen zwei Rollen und zwei Benutzern setzen Sie bereits zentrale Datenschutzprinzipien um:

* Schutz vor unbefugtem Zugriff:

  • Nur db_admin und blog_app haben Zugriff auf travel_blog.

* Prinzip der minimalen Privilegien:

  • Die Anwendung arbeitet nicht mit root, sondern mit travel_app und eingeschränkten Rechten.

* Vertraulichkeit und Integrität:

  • Strukturänderungen und Rechtevergabe sind nur über die Adminrolle möglich, nicht über die Anwendung.

Die Logik entspricht den Schulbeispielen (WebUntis, Moodle, Absenzen-Tool, Notenbuch, Lohnliste):

* Die „Schulleitung/IT“ entspricht hier der Rolle db_admin (Caro). * Die „Fachanwendung“ (z. B. Absenzen-Tool) entspricht hier dem Benutzer travel_app mit Rolle blog_app.

In früheren Lerneinheiten (LU08, LU09) haben Sie Daten modelliert, in Beziehung gesetzt und abgefragt. Jetzt ergänzen Sie die Frage:

* Wer darf was mit diesen Daten tun?

Genau das ist der Kern des Handlungsziels: Rollen und Berechtigungen vergeben, um Datensicherheit und Datenschutz (DSG/DSGVO) zu gewährleisten.

  • modul/m290_guko/learningunits/lu12/theorie/c_mysql_rollen_berechtigungen.1763315404.txt.gz
  • Zuletzt geändert: 2025/11/16 18:50
  • von gkoch