FlughafenDB / Datenbankprojekt / Rechteverwaltung
▶ Zum Lernbereich (Sonnet) →

Wer darf was?
Datenbankrechte am Beispiel einer Flughafen-Datenbank

Sechs Abteilungen, neun Tabellen und die Frage, wer eigentlich was sehen, ändern oder löschen darf – durchgespielt an einer fiktiven Airline-Datenbank.

HIT12 · Blogbeitrag MySQL 9 Rollen & Rechte

In unserem Datenbankprojekt haben wir uns mit dem Thema Datenbankrechte beschäftigt. Dafür haben wir eine fiktive Flughafen-Datenbank namens „FlughafenDB“ verwendet und überlegt, welche Abteilungen welche Rechte auf die Daten haben sollen.

Die Datenbank

Die Datenbank besteht aus neun Tabellen: mitarbeiter, passagier, passagierdetails, buchung, flug, flugplan, flugzeug, flugzeug_typ, fluglinie und flughafen. Die Tabellen sind alle miteinander verknüpft, zum Beispiel hat ein Passagier eine Buchung und eine Buchung gehört zu einem Flug.

FlughafenDB.erd — 9 Tabellen
ER-Diagramm FlughafenDB Zeigt neun Tabellen einer Flughafen-Datenbank und ihre Beziehungen über Primaer- und Fremdschluessel. Primaerschluessel Fremdschluessel feste Beziehung optionale Beziehung fluglinie fluglinie_id SMALLINT(6) iata CHAR(2) firmenname VARCHAR(30) heimat_flughafen SMALLINT(6) Indexes flugzeug flugzeug_id INT(11) kapazitaet MEDIUMINT(8) typ_id INT(11) fluglinie_id INT(11) Indexes passagierdetails passagier_id INT(11) geburtsdatum DATE geschlecht CHAR(1) strasse VARCHAR(100) ort VARCHAR(100) plz SMALLINT(6) land VARCHAR(100) emailadresse VARCHAR(120) telefonnummer VARCHAR(30) Indexes mitarbeiter mitarbeiter_id INT(11) vorname VARCHAR(100) nachname VARCHAR(100) geburtsdatum DATE geschlecht CHAR(1) strasse VARCHAR(100) ort VARCHAR(100) plz SMALLINT(6) land VARCHAR(100) emailadresse VARCHAR(120) telefonnummer VARCHAR(30) gehalt DECIMAL(8,2) abteilung ENUM(...) benutzername VARCHAR(20) passwort CHAR(32) Indexes flughafen flughafen_id SMALLINT(6) iata CHAR(3) icao CHAR(4) name VARCHAR(50) Indexes buchung buchung_id INT(11) flug_id INT(11) sitzplatz CHAR(4) passagier_id INT(11) preis DECIMAL(10,2) Indexes flugplan flugnr CHAR(8) von SMALLINT(6) nach SMALLINT(6) abflug TIME ankunft TIME fluglinie_id SMALLINT(6) montag TINYINT(1) dienstag TINYINT(1) mittwoch TINYINT(1) donnerstag TINYINT(1) freitag TINYINT(1) samstag TINYINT(1) sonntag TINYINT(1) Indexes passagier passagier_id INT(11) passnummer CHAR(9) vorname VARCHAR(100) nachname VARCHAR(100) Indexes flug flug_id INT(11) flugnr CHAR(8) von SMALLINT(6) nach SMALLINT(6) abflug DATETIME ankunft DATETIME fluglinie_id SMALLINT(6) flugzeug_id INT(11) Indexes flugzeug_typ typ_id INT(11) bezeichnung VARCHAR(50) beschreibung TEXT Indexes
Abb. 1 — Entity-Relationship-Diagramm der FlughafenDB. Durchgezogene Linien zeigen feste, gestrichelte Linien optionale Beziehungen.

Rollen und Berechtigungen

Damit nicht jeder alles machen kann, haben wir Rollen angelegt. Eine Rolle ist quasi eine Gruppe mit bestimmten Rechten, die man dann einem Benutzer zuweist. Das ist viel praktischer, als jedem Benutzer einzeln Rechte zu geben.

Wir haben sechs Rollen erstellt:

Rolle Mitarbeiter Passagier & Buchung Flug & Flugplan Öffentl. Daten Alle Tabellen
Geschäftsführung LesenLesenLesenLesenLesen
Mitarbeiterverwaltung Vollzugriff
Öffentlichkeitsarbeit Lesen
Buchungen / Kunden Vollzugriff
Flugplanung Vollzugriff
IT Vollzugriff
Abb. 2 — Übersicht, welche Rolle auf welchen Tabellenbereich zugreifen darf.

So sieht das zum Beispiel in SQL aus:

Beispiel

sql
CREATE ROLE IF NOT EXISTS `Geschaeftsfuehrung`;
GRANT SELECT ON Datenbank.* TO `Geschaeftsfuehrung`;

CREATE USER IF NOT EXISTS `Geschaeftsfuehrer`@`localhost`
    IDENTIFIED BY "sicheresPasswort";
GRANT `Geschaeftsfuehrung` TO `Geschaeftsfuehrer`@`localhost`;

Erklärung

CREATE ROLE
    IF NOT EXISTS -- Fehler bei doppeltem Erstellen verhindern
    `Geschaeftsfuehrung`; -- Name der Rolle

Erstellt die Rolle Geschaeftsfuehrung, falls sie noch nicht existiert.

GRANT
    SELECT -- Recht, das vergeben werden soll
    ON Datenbank.* -- Datenbank und Tabellen (hier: alle Tabellen)
    TO `Geschaeftsfuehrung`; -- Rolle (nur eine pro Befehl)

Vergibt das Recht SELECT an die Rolle Geschaeftsfuehrung.

CREATE USER
    IF NOT EXISTS -- Fehler bei doppeltem Erstellen verhindern
    `Geschaeftsfuehrer`@`localhost` -- Muster: `name`@`server`
    IDENTIFIED BY "sicheresPasswort"; -- Passwort festlegen

Erstellt den Benutzer Geschaeftsfuehrer mit Passwort.

GRANT
    `Geschaeftsfuehrung` -- Rolle, die zugewiesen werden soll
    TO `Geschaeftsfuehrer`@`localhost`; -- wie bei CREATE USER

Weist die Rolle Geschaeftsfuehrung dem Benutzer Geschaeftsfuehrer zu.

CREATE USER — MySQL Doku CREATE ROLE — MySQL Doku

Passwortrichtlinien

Ein wichtiges Thema ist auch die Passwortsicherheit. In MySQL kann man zum Beispiel festlegen, dass ein Passwort nach einer bestimmten Zeit abläuft oder dass der Account gesperrt wird, wenn man sich zu oft falsch einloggt:

sql
CREATE USER "guenter"@"localhost" IDENTIFIED BY "moin" -- Bereits bekannt
    PASSWORD EXPIRE INTERVAL 3 DAY -- Wie lange das Passwort gültig ist
    FAILED_LOGIN_ATTEMPTS 3 -- Wie viele Versuche man hat, um sich anzumelden
    PASSWORD_LOCK_TIME 1; -- Sperrdauer in Tagen
Password Management — MySQL Doku

Rechte wieder entziehen

Mit REVOKE kann man vergebene Rechte auch wieder entziehen. Man kann das sogar auf einzelne Spalten beschränken, also zum Beispiel darf die Buchungsabteilung nur den Namen und die E-Mail-Adresse eines Mitarbeiters bearbeiten, aber nicht andere Felder:

sql
REVOKE
    INSERT, UPDATE, DELETE -- Rechte aufgezählt
    ON flysecurity.* -- * = alle Tabellen
    FROM buchung; -- Rollenname

GRANT
    INSERT, UPDATE, -- auf alle Spalten
    DELETE (vorname, nachname, emailadresse) -- nur diese Spalten
    ON flysecurity.mitarbeiter -- Tabellenname
    TO buchung; -- Rollenname

Spaltengenau statt pauschal: Der DELETE-Zugriff oben gilt nur für vorname, nachname und emailadresse – nicht für das Gehalt oder andere sensible Felder.

REVOKE — MySQL Doku

Fazit

Ich finde das Thema eigentlich recht interessant, weil man dabei wirklich überlegen muss, welche Abteilung was braucht und was nicht. Das Prinzip ist, dass jeder nur die Rechte bekommt, die er wirklich braucht. Das macht die Datenbank sicherer, weil zum Beispiel jemand aus der Buchungsabteilung keine Flugpläne löschen kann, auch wenn er das aus Versehen tun würde.