Der im Website-Alltag beliebte MySQL-Server ist ein selbständiger Geselle. Er pflegt sein eigenes, von der Linux-Benutzerverwaltung unabhängiges Zugangssystem. Der Root-User in MySQL muss demnach auch keine Root-Rechte in dem Linux-System haben, das die Datenbank beherbergt. Seine Benutzer und deren Rechte speichert MySQL – wie könnte es anders sein – in einer MySQL-Datenbank. Um Benutzer schnell einzurichten und mit Privilegien auszustatten, kann der Admin auf das maßgeschneiderte Statement GRANT zurückgreifen.
Jeder MySQL-User findet sich mit mindestens einer Zeile in der Tabelle user repräsentiert, die wiederum zu einer Datenbank namens mysql gehört, in der das Datenbank-System seine Einstellungen verwaltet. Um nun einen neuen Mysql-Benutzer hinzuzufügen, könnte man sich theoretisch der üblichen INSERT- und UPDATE-Statements bedienen. Das wird aber schnell kompliziert, vor allem, wenn es gilt, den Zugriff auf bestimmte Datenbanken oder gar einzelne Tabellen zu begrenzen, wofür MySQL weitere Verwaltungs-Tabellen (db, host, tables_priv) verwendet. Zum Glück lässt sich all dies per GRANT in einem Rutsch erledigen.
Wie wird am bequemsten ein neuer User eingerichtet? Zunächst eine Vorüberlegung: Aus Sicherheitsgründen ist es immer eine gute Idee, für jede Datenbank einen eigenen User zu erzeugen; dann kann beispielsweise ein PHP-Script als dieser User agieren und erhält nur auf diese eine Datenbank Zugriff. Das in PHP programmierte WordPress beispielsweise benötigt eine Datenbank, in der es seine Artikel, Kategorien, Benutzer etc. speichert.
Mit nur einem GRANT-Statement lässt sich ein User anlegen und einer Datenbank samt Zugriffsrechten (in MySQL „Privilegien“ genannt) zuordnen:
mysql> CREATE DATABASE
IF NOT EXISTS wp-datenbank;
mysql> GRANT ALL ON wp-datenbank.* TO wp-user@hostname IDENTIFIED BY "wp-geheim";
Nun hat also der Benutzer wp-user Zugriff auf die Datenbank wp-datenbank:
- wpuser darf aber nur von hostname aus zugreifen; von einem anderen Rechner aus bleibt ihm sicherheitshalber der Zugriff verwehrt – selbst mit dem richtigen Passwort. (Wenn WordPress und MySQL auf demselben Server liegen, können Sie wp-user@localhost verwenden.)
- wp-user erhält Zugriff auf alle Tabellen (deshalb das Sternchen) innerhalb von wp-datenbank. (Um den Zugriff auf eine bestimmte Tabelle zu beschränken, lautet die Schreibweise wp-datenbank.tabellenname.)
- Mit GRANT ALL erlauben wir dem Benutzer, (fast) alles Mögliche innerhalb dieser Datenbank zu machen – fast, denn er selbst darf GRANT nicht nutzen, um weiteren Usern Zugang zu ermöglichen.
- IDENTIFIED BY spezifiziert schließlich das Passwort – lassen wir es weg, wird kein Passwort gesetzt, und das wollen wir ganz und gar nicht. Nur wenn der User-Account samt Passwort bereits existierte, könnten wir auf IDENTIFIED BY verzichten.
Wenn sich unsere Web-Anwendung nun über den eingerichteten User-Account beim MySQL-Server anmeldet, bekommt sie Zugriff auf die Datenbank – sobald wir ihr die Zugangsdaten bekannt gemacht haben. In WordPress wird das über die Datei wp-config.php erledigt:
define('DB_NAME', 'wp-datenbank');
define('DB_USER', 'wp-user');
define('DB_PASSWORD', 'wp-geheim');
define('DB_HOST', 'db-hostname');
Fine-Tuning. Mit GRANT ALL kann man nicht viel falsch machen. Gewissenhafte Admins könnten aber auf die Idee kommen, einem User wirklich nur die Privilegien zu geben, die er braucht. Immerhin darf ein User nach GRANT ALL Einträge einfügen, verändern und löschen.
Die Anweisung
mysql> GRANT SELECT, UPDATE ON wp-datenbank.* TO wp-user@hostname IDENTIFIED BY "wp-geheim";
würde unserem User lediglich die Statements SELECT und UPDATE erlauben. Und weiter: Mit REVOKE lassen sich einem User gezielt Privilegien entziehen. Nach einem
mysql> REVOKE UPDATE ON wp-datenbank.* TO wp-user@hostname IDENTIFIED BY "wp-geheim";
bliebe dem armen User nur noch der SELECT erlaubt – WordPress wäre mit solchermaßen begrenzten Zugriffsrechten nicht mehr arbeitsfähig.
GRANT schlägt mangels Rechten fehl? Dann hat Ihr User-Account selbst nicht das GRANT-Privileg. Bei MySQL gilt: Ein User darf einem anderen User nur jene Rechte einräumen oder verbieten, über die er selbst verfügt. Wer die Rechte auf jeden Fall hat, ist root, der MySQL-Hauptbenutzer (wiederum nicht zu verwechseln mit dem Linux-User root).
Wenn Sie auf einem aktuellen Debian oder Ubuntu mit
apt-get install mysql-server
die Datenbank installiert haben, sind Sie im Einrichtungsdialog aufgefordert worden, ein root-Passwort festzulegen. Und wenn Sie sich nun mit
mysql -uroot -p
als User root mit dem bewussten Passwort anmelden, dann verfügen Sie über alle Privilegien, um einen neuen User einzurichten. Das Passwort haben Sie doch sicher nicht vergessen?
thanks for sharing~
my week is saved – interesting blog here
This is exactly just what I was looking for. Thanks!
Vielen Dank für die Doku. Hat mir sehr geholfen. :)