Sechs Abteilungen, neun Tabellen und die Frage, wer eigentlich was sehen, ändern oder löschen darf – durchgespielt an einer fiktiven Airline-Datenbank.
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 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.
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 | Lesen | Lesen | Lesen | Lesen | Lesen |
| Mitarbeiterverwaltung | Vollzugriff | – | – | – | – |
| Öffentlichkeitsarbeit | – | – | – | Lesen | – |
| Buchungen / Kunden | – | Vollzugriff | – | – | – |
| Flugplanung | – | – | Vollzugriff | – | – |
| IT | – | – | – | – | Vollzugriff |
So sieht das zum Beispiel in SQL aus:
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`;
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.
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:
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
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:
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.
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.