by A. Grupp Zurück

Nachfolgend eine Teil-Übersetzung des MySQL-Manuals. Es handelt sich bislang nur um das Kapitel 6 - "Wie arbeiten die MySQL-Rechte". Ursache ist

  • die hohe Sensibilität dieses Themas
  • verbunden mit der Komplexität der Implementierung
  • unter spezieller Berücksichtigung der allgemeinen Fähigkeit englische Dokumentation flüssig zu lesen (auch meiner)
:-))))).

Wie arbeiten die MySQL-Rechte?

MySQL hat ein fortschrittliches aber vom Standard abweichendes Sicherheits/Rechte-System.

Was kann das Rechte-System für sie erledigen?

Die grundlegende Funktion des MySQL-Rechte-Systems ist es einem Username auf einem Host die SELECT, INSERT, UPDATE und DELETE Rechte bzgl. einer Datenbank zu erteilen.

Außerdem besteht die Möglichkeit eines "anonymous"-Users und mit der evtl. Erlaubnis MySQL-spezifische Funktionen wie LOAD DATA INFILE zu benutzen.

Bitte beachten sie, daß die Usernamen für eine SQL-Datenbank, wie MySQL, nichts mit Unix-Usern zu tun haben. Zur Vereinfachung versuchen die meisten MySQL-Clients sich mit dem aktuellen Usernamen einzuloggen, aber dies kann mit dem --user Schalter geändert werden. Dies bedeutet auch, daß sie eine Datenbank ohne Passwörter für alle User nicht absichern können.

6.2 Wie arbeitet das Rechte-System?

MySQL versteht die Kombination aus einem Host und einem User als eindeutige Identität. Denken Sie bei der Arbeit mit den MySQL-Rechten nicht an User, denken sie an Host+User und alles sollte wesentlich klarer sein. Sie können z.B. einen User namens ´Robb´ auf zwei unterschiedlichen Hosts (mit unterschiedlichen Rechten) in MySQL ohne Konflikte verwalten.

Das MySQL Rechtesystem stellt sicher, daß jeder User genau die Dinge tun kann die ihm zugeteilt wurden. In Abhängigkeit davon welcher xuser sich von welchem host an welcher Datenbank anmeldet entscheidet MySQL die jeweilige Rechtezuteilung.

Sie können ihre Rechte jederzeit mit dem script mysqlaccess testen, welches Yves Carlier zur MySQL-Distribution beigesteuert hat.

  • Siehe dazu Abschnitt 6.7 Warum erhalte ich den Fehler Access denied?
  • Siehe dazu Abschnitt 6.8 Wie schütze ich MySQL gegen crackers?

Alle Rechte werden in den drei Tabellen user, host und db gespeichert.

Jedes in der user-Tabelle erteilte Recht ist für alle Datenbanken gütig die in der db-Tabelle nicht gefunden werden können. Deshalb könnte es klug sein den einzelnen Usern (vom Supervisor abgesehen) ihre Rechte nur auf Datenbank-Ebene zuzuteilen.

Die host-Tabelle existiert hauptsächlich um eine Liste "sicherer" Server zu verwalten. Bei TcX enthält die host-Tabelle eine Liste aller Rechner im lokalen Netzwerk. Diesen werden Rechte erteilt.

Die Rechte des sich gerade anmeldenden Users werden nach dem folgenden Algorithmus festgestellt:

  1. Zuerst wird der Inhalt der Tabellen nach folgendem Schema sortiert:
    TabelleSortierung nach:
    host Zuerst die hosts ohne Wildcards, gefolgt von host mit einer Wildcard und Einträgen mit host = "".
    dbNach host ohne wild/host mit wild/leeren hosts
    userhost/user
    Die Tabelle host wird nach Hosts ohne Wildcard, gefolgt von hosts mit einer Wildcard und Einträgen mit host="" sortiert. Innerhalb jedes hosts, wird nach den gleichen Regeln nach dem user sortiert. Die Tabelle db wird nach den gleichen Regeln sortiert. Bei den nachfolgenden Schritten wird in den so sortierten Datens&aum;tzen nachgesehen und der erste passende Datensatz verwendet.
  2. Die Rechte des sich anmeldenden Benutzers werden aus der Tabelle user entnommen. Dabei wird wie bereits weiter oben beschrieben der erste passende Datensatz aus der vorher sortierten Tabelle verwendet. Den so erhaltenen Satz an Rechten nennen wir Priv.
  3. Die Rechte des sich anmeldenden Benutzers werden aus der Tabelle db entnommen. Auch hier wird die vorher sortierte Tabelle und der erste passende Datensatz verwendet.
  4. Falls der in der db-Tabelle gefundene Datensatz den Eintrag host="" enthält, so werden die ursprünglichen Rechte Priv aus der user-Tabelle mit den Host-Rechten aus der host-Tabelle logisch ver-UND-et. D.h. im Klartext: Aus beiden Datensätzen werden alle Rechte entfernt bei denen nicht in beidesmal "Y" eingetragen ist. Falls host<>"" ist, so werden die Rechte von Priv nicht verändert. In solchen Fällen muß der host-Eintrag zumindest teilweise mit dem Hostname des verbindenden Hosts übereinstimmen. Deshalb kann angenommen werden, daß die in dieser Zeile festgelegten Rechte dem Profil des sich anmeldenden hosts entsprechen.
  5. Die Rechte des Users aus der Tabelle user werden anschließend mit dem Priv-Rechtesatz logisch ver-ODERt (d.h. alle Y-Rechte werden hinzugefügt).
Achtung: Falls Sie in den Rechte-Tabellen etwas geändert haben, müssen Sie eine mysqladmin reload durchführen um die Änderungen zu aktivieren!!!

Der sich anschließende User erhält das Priv-Rechte-Set. Nachfolgend ein Beispiel für das Sortieren und Auffinden der richtigen Datensätze. Nehmen wir an die user-Tabelle sieht folgendermaßen aus:

+-----------+---------+-
| Host      | User    | ...
+-----------+---------+-
| %         | root    | ...
| %         | jeffrey | ...
| localhost | root    | ...
| localhost |         | ...
+-----------+---------+-
Die Suchreihefolge sieht dann (nach erfolgter Sortierung) folgendermaßen aus:
  • localhost/root
  • localhost/any
  • any/jeffrey
  • any/root
Jeffrey der sich via localhost anmeldet wird deshalb mit dem Rechtesatz localhost/any und nicht mit dem Satz any/jeffrey ausgestattet. Immer der erste passende Eintrag wird verwendet. Falls sie also Probleme mit den Zugriffsrechten haben, drucken sie den Inhalt der Tabelle user aus, sortieren ihn von Hand und stellen den ersten passenden Datensatz fest. Es folgt nun ein Beispiel um den user "custom" hinzuzufügen der sich von den Hosts "localhost", "server.domain" und "whitehouse.gov" anmelden darf. Er möchte das Password "stupid" haben. Die Datenbank "bankaccount" möchte er nur via "localhost", die Datenbank "customer" von allen drei hosts aus erreichen können.
shell> mysql mysql.
mysql> insert into user (host,user,password)
       values('localhost','custom',password('stupid'));
mysql> insert into user (host,user,password)
       values('server.domain','custom',password('stupid'));
mysql> insert into user (host,user,password)
       values('whitehouse.gov','custom',password('stupid'));

mysql> insert into db
       (host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       values
       ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> insert into db
       (host,db,user,Select_priv,Insert_priv,Update_priv,Delete_priv,
        Create_priv,Drop_priv)
       values
       ('%','customers','custom','Y','Y','Y','Y','Y','Y');
Sie können selbstverständlich xmysqladmin, mysql_webadmin, mysqladmin und xmysql verwenden um in den Rechte-Tabellen Datensätze einzufügen/abzuändern. Sie finden diese Utilities im Contrib-Verzeichnis.

Die Rechtevergabe-Tabellen

Die für Tabellen relevanten Rechte sind select, insert, update und delete.

Die Rechte für Tabellen und Datenbanken sind create und drop. "Create" und "drop"-Recht gelten für beides - Tabellen und Datenbanken. Falls ein User nälich alle Tabellen einer Datenbank löschen darf, kann er auch gleich das Recht erhalten die ganze Datenbank zu löschen.

Andere Rechte vergeben die Berechtigung um Dateien zu benutzen (für LOAD DATA INFILE und SELECT INTO OUTFILE) und Administrations-Kommandos wie shutdown, reload, refresh und process auszuführen.

Das Rechtevergabesystem basiert auf 3 Tabellen.

user Tabelle
Sie beinhaltet alle host+user Kombinationen die das Recht haben sich an den mysql-Server anzumelden und enthält gegebenenfalls noch deren Password. Die user-Tabelle hat die folgenden Datenfelder:
Datenfeld Datentyp Schlüssel Standardwert
Host char(60) PRI ""
User char(16) PRI ""
Password char(16) - ""
Select_priv enum('N','Y') - N
Insert_priv enum('N','Y') - N
Update_priv enum('N','Y') - N
Delete_priv enum('N','Y') - N
Create_priv enum('N','Y') - N
Drop_priv enum('N','Y') - N
Reload_priv enum('N','Y') - N
Shutdown_priv enum('N','Y') - N
Process_priv enum('N','Y') - N
File_priv enum('N','Y') - N
  • db-Tabelle Legt fest welche Datenbanken ein host+user benutzen kann und was er mit den Tabellen in jeder Datenbank machen kann. Die db-Tabelle hat die folgenden Datenfelder:
    Datenfeld Typ Schlüssel Standardwert
    Host char(60) PRI ""
    Db char(64) PRI ""
    User char(16) PRI ""
    Select_priv enum('N','Y') - N
    Insert_priv enum('N','Y') - N
    Update_priv enum('N','Y') - N
    Delete_priv enum('N','Y') - N
    Create_priv enum('N','Y') - N
    Drop_priv enum('N','Y') - N
  • host-Tabelle Wird nur in großen Netzwerken benutzt um bei leeren host-Einträgen in der db-Tabelle nachzuschauen. D.h. falls sie einem User gestatten wollen Datenbanken von jedem Host in ihrem Netzwerk zu benutzen, sollten Sie " als Hostname in der db-Tabelle eintragen. In diesem Fall sollte die host-Tabelle für jeden Host ihres Netzwerks einen Eintrag aufweisen. Die host-Tabelle hat die folgenden Datenfelder:
    Datenfeld Typ Schlüssel Standardwert
    Host char(60) PRI ""
    Db char(64) PRI ""
    Select_priv enum('N','Y') - N
    Insert_priv enum('N','Y') - N
    Update_priv enum('N','Y') - N
    Delete_priv enum('N','Y') - N
    Create_priv enum('N','Y') - N
    Drop_priv enum('N','Y') - N
    • Die host und db Spalten können eine Zeichenkette mit der SQL-Wildcard % and _ enthalten. Wenn sie irgendeine dieser Spalten leer lassen, so ist das gleichbedeutend mit dem Eintrag '%'.
    • Ein host kann localhost, ein Hostname, eine IP-Nummer oder eine Zeichenkette mit Wildcards sein. Ein leerer Host in der db-Tabelle gilt für alle Hosts in der host-Tabelle. Ein leerer Host in der host- oder user-Tabelle gilt für alle Hosts die eine TCP-Verbindung zu ihrem Server aufbauen können.
    • db ist der Name einer Datenbank oder ein SQL regulärer Ausdurck (regexp).
    • Eine leere user Spalte bedeutet, daß jeder Username gültig ist. Wildcards im Username sind nicht zulässig.
    • Ein user auf den nichts in der user-Tabelle paßt wird wie ein no-name user behandelt.
    • Die Rechte der user-Tabelle werden mit der db-Tabelle ver-OR-d. Das bedeutet, daß der superuser einfach nur einen Eintrag in der user-Tabelle haben muß in dem alle Rechte-Flags auf Y gesetzt sind.
    Sie können einen Eintrag wie 123.444.444.% in der host-Tabelle verwenden um jedem User eines IP-Klasse-C-Netzes Zugriff zu ermöglichen. Um zu verhindern, daß jemand durch Benennung seines Hosts als 123.444.444.somewhere.com in das System eindringt, verbietet MySQL alle Hostnames die mit Zahlen oder einem Punkt beginnen. Falls also ihr Rechner 1.2.foo.com oder so heißt, wird er durch Namensüberprüfung nie Zugang erhalten. Verwenden sie in diesem Fall seine IP-Nummer in der Rechtevergabe.

    6.4 Hinzufügen neuer user-Rechte zu MySQL

    Um Rechte zur MySQL-Datenbank hinzuzufügen:

    Dies setzt vorraus, daß der gegenwärtige User insert-Rechte für die mysql-Datenbank und reload-Rechte hat. Der DB-Server (mysqld) muß gestartet sein. Falls er noch nicht gestartet ist, starten sie ihn mit safe_mysqld --log &.

    > mysql mysql
      insert into user values ('%','monty',password('something'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') ;
      insert into user (host,user,password) values('localhost','dummy',") ;
      insert into user values ('%','admin',",'N','N','N','N','N','N','Y','N','Y','Y') ;
      quit
    > mysqladmin reload
    

    Dies erzeugt drei neue User:

    Monty
    Voller superuser, muß aber ständig ein Passwort bei der Arbeit mit MySQL benutzen.
    admin
    Braucht kein Passwort, kann aber nur mysqladmin reload, mysqladmin refresh und mysqladmin processlist ausführen. Es können ihm individuelle Datenbank-Rechte durch die db-Tabelle eingeräumt werden.
    dummy
    Ihm müssen individuelle Datenbank-Rechte durch die db-Tabelle eingerichtet werden.

    6.5 Default Rechte

    Die default Rechte (wurden durch `scripts/mysql_install_db' gesetzt) lassen den User root alles tun. Jeder User kann mit jeder Datenbank deren Name 'test' ist oder mit 'test_' beginnt alles tun. Ein normaler User kann mysqladmin shutdown oder mysqladmin processlist nicht benutzen. Sehen sie sich das Skript (`scripts/mysql_install_db') als Beispiel an wie man andere User hinzufügt.

    Die Rechte-Tabellen werden mit mysqladmin reload durch mysqld eingelesen.

    6.6 Ein Beispiel für die Rechte-Vergabe

    Ein üblicher Fehler ist es zu vergessen, daß Passwörter verschlüsselt abgespeichert werden. Dies führt zum Beispiel zu folgendem:

    INSERT INTO user VALUES ('%','jeffrey','bLa81m0','Y','Y','Y','N','N','N','N','N', 'N','N');

    Dann (ist selbstverständlich) ein mysqladmin reload um die Änderung an der Authentifizierung zu aktivieren. Es folgt ein Versuch sich beim Server anzumelden:

    $ ./mysql -h sqlserver -u jeffrey -p bLa81m0 test
    Access denied
    

    Versuchen sie stattdessen folgendes:

    INSERT INTO user VALUES
    ('%','jeffrey',password('bLa81m0'),'Y','Y','Y','N','N','N','N','N','N','N');
    

    Wie vorher, mysqladmin reload um die Äderungen an den Rechten zu aktivieren.

    Nun sollte es wie gewünscht funktionieren.

    6.7 Warum erhalte ich einen Access denied? Fehler?

    • Haben sie die MySQL-Rechte-Tabellen mit dem Skript `mysql_install_db' installiert? Testen sie dies durch Ausührung von mysql -u root test. Das dürfte keinen Fehler ergeben. Sie können auch überprüfen ob sie eine Datei 'user.IDS' im mysql-Datenbank-Verzeichnis haben (üblicherweise unter install_dir/var/mysql/user.ISD).
    • Bei einer Erstinstallation sollten sie 'mysql -u root mysql' benutzen um Zugang zu den Rechte-Tabellen zu erhalten
    • Denken sie daran, daß sie bei jeder Änderung der Rechte in den Rechte-Tabellen durch Ausführung von mysqladmin reload diese Änderungen aktivieren müssen. Andernfalls werden nach wie vor die Einstellungen im alten Zustand benutzt.
    • Für Testzwecke sollten sie den mysqld-Dämon mit der --without-grant-tables Option starten. Nun können sie die MySQL-Rechte-Tabellen ändern und mit Hilfe des Skripts mysqlaccess überprüfen ob ihre Einstellungen funktionieren. mysqladmin reload sagt dann dem mysqld-Dämon, daß er die neuen Rechte-Tabellen benutzen soll.
    • Selbst wenn sie mit Perl, Python, oder ODBC Zugriffsprobleme haben, sollten sie immer mit mysql -u user database oder mysql -u user -ppassword database ihre Rechteprobleme testen. Mann kann auch den --password=your_password Syntax benutzen um das Passwort zu übergeben.
    • Falls sie bei einer Anmeldung mit mysql -u user database die Fehlermeldung 'Access denied' erhalten, dann haben sie ein Problem mit der 'user'-Tabelle. Überprüfen sie dies durch mysql -u root mysql und select * from user. Sie sollten einen Eintrag mit 'hostname' und 'user' erhalten der auf ihren Rechnername und ihren Usernamen paßt. Falls der Client und der Server auf demselben Rechner laufen, sie die --host-Option nicht benutzt haben und sie die MIT-pthreads nicht benutzen, dann ist 'localhost' ein Synonym für ihren Rechnername.
    • Die Fehlermeldung Access denied sagt ihnen wer sie sind während sie sich anzumelden versuchen, von welchem Host aus sie sich anmelden und ob sie ein Passwort benutzt haben oder nicht. Sie sollten normalerweise einen Eintrag in der user-Tabelle haben der genau wie in der Fehlermeldung angegeben auf ihren Rechner- und Username paßt.
    • Falls sie die Fehlermeldung 'Host ... is not allowed to connect to this MySQL server' erhalten wenn sie versuchen sich an einem MySQL-Server auf einer anderen Maschine anmelden, dann haben sie keinen Datensatz in der User-Tabelle die auf die Remote-Maschine paßt. Sie können dies beheben indem sie das Kommandozeilen-Tool 'mysql' benutzen und für die Maschinen/User-Kombination mit der sie sich anmelden wollen einen Datensatz zur user-Tabelle hinzufügen. Falls sie nicht MySQL 3.22 installiert haben und nicht genau wissen mit welcher IP/Hostname-Kombination sie sich anzumelden versuchen, dann sollten sie einen Eintrag mit '%' als Host in der user-Tabelle einfügen und mysqld mit der Option --log restarten. Nach einem Anmeldeversuch finden sie dann Informationen im MySQL log wie sie sich tatsächlich angemeldet haben.
    • Falls mysql -u root test funktioniert, aber mysql -h your_hostname -u root test die Fehlermeldung 'Access denied' erzeugt, dann haben sie nicht den richtigen Namen für ihren Rechner in der user-Tabelle. Falls sie z.B. einen Eintrag mit host 'tcx' in der 'user'-Tabelle haben, ihr DNS aber dem MySQL-Server sagt, daß ihr Hostname 'tcx.subnet.se' ist, dann wird dieser Eintrag nicht funktionieren. Probieren sie es mit einem Datensatz der die IP-Nummer ihres Hosts in der 'user'-Tabelle hat. Sie können natürlich auch einen Host mit einer Wildcard (z.B. 'tcx%') zur 'user'-Tabelle hinzufügen (beachten sie aber bitte, daß Hostnamen die mit '%' aufhören eine Sicherheitslücke darstellen).
    • Falls es ihnen nicht gelingt festzustellen warum sie die Fehlermeldung 'Access denied' erhalten, dann entfernen sie alle Einträge die Wildcards (Einträge die % oder _ enthalten) im Hostname enthalten aus der user-Tabelle! Ein häfiger Fehler ist, daß man einen neuen User hinzufügt der host='%' und user='some user' hat und glaubt, daß einem das erlaubt sich auch vom selben Rechner 'localhost' anzumelden. Der Grund warum das nicht funktioniert ist ein genauerer Eintrag mit host='localhost' und user=" der gegenüber dem neuen Eintrag bevorzugt wird wenn man sich von 'localhost' anmeldet. Die richtige Vorgehensweise ist es, eine zweiten Datensatz mit host='localhost' und user='some_user' vorzunehmen oder den Eintrag mit user=" zu entfernen.
    • Bei der Benutztung der MIT-pthreads, wird localhost nie benutzt. Alle Verbindungen zum mysql-Daemon laufen über TCP/IP und sie müssen ihren richtigen Hostnamen in 'user' haben selbst wenn sie den Client auf dem gleichen Rechner benutzen auf dem auch der Server läuft.
    • Falls sie die Fehlermeldung 'Access to database denied' erhalten, dann haben sie ein Problem mit der db-Tabelle. Falls der benutzte Eintrag in der db-Tabelle einen leeren Hostname hat, dann überprüfen sie auch den zughörigen Eintrag in der 'host'-Tabelle.
    • Falls mysql -u user database auf dem Server-Rechner funktionert, mysql -u host -u user database aber nicht auf einem anderen Client-Rechner geht, dann haben sie diesen Client-Rechner nicht in der 'user'- oder 'db'-Tabelle.
    • Falls es mit Password's nicht funktioniert, dann denken sie daran, daß Passwörter mit der PASSWORD-Funktion eingefügt werden müssen. Schauen sie im Abschnitt '6.6 Ein Beispiel für die Rechte-Vergabe' nach.
    • Falls mysql -u user test funktioniert, mysql -u user other_database aber nicht, dann haben sie die other_database nicht in der 'db'-Tabelle.
    • Falls sie die Fehlermeldung 'Access to database denied' bei der Benutzung von SELECT ... INTO OUTFILE oder LOAD DATAi SQL Befehlen erhalten, dann haben sie wahrscheinlich das File_priv-Recht für sich nicht in der 'user'-Tabelle.
    • Falls alles fehlschlägt, dann starten sie den mysqld Daemon mit: --debug=d,general,query. Dadurch werden Informationen über den Host und User ausgegeben der sich anzumelden versucht und außerdem erhalten sie Informationen über jedes Kommando. Sie dazu auch >18.10 Debugging MySQL.
    • Falls sie irgendwelche weiteren Probleme mit den MySQL-Rechte-Tabellen haben und das Gefühl haben diese auf der Mailing-Liste zu veröffentlichen, dann fügen sie immer einen Dump der MySQL-Rechte-Tabellen hinzu. Sie können diesen Tabellendump mit dem Befehl mysqldump mysql durchführen. Wie immer, mailen sie ihr Problem mit dem mysqlbug-Skript.
    • Falls sie die Fehlermeldung Can't connect to local mySQL server oder Can't connect to MySQL server on some_hostname erhalten, so bedeutet dies, daß der mysqld-Daemon nicht gestartet ist oder daß sie versuchen sich über den falschen Socket oder den falschen Port anzumelden. Stellen sie sicher, daß der Socket existiert (normalerweise /tmp/mysql.sock) oder versuchen sie sich auf den Port mit Telnet anzumelden: telnet hostname 3306. Sie können auch mysqladmin version versuchen um mehr Informationen zu erhalten.
    • Falls sie die Fehlermeldung Access denied erhalten wenn sie einen Client ohne jegliche Optionen starten, dann stellen sie sicher, daß sie keinen alten Passwörter in irgendeiner ihrer option-Dateien haben! Sehen sie dazu 4.17 Option files.

    6.8 Wie sichere ich MySQL gegen Hacker ab

    Um ein MySQL System abzusichern sollten sie über das folgende nachdenken:

    • Benutzen sie Passörter für alle MySQL Benutzer. Denken sie daran, daß jeder sich als eine andere Person anmelden kann indem er z.B. 'mysql --user other_user database' verwendet. Das ist übliches Verhalten bei allen Client/Server-Applikationen. Sie können das Passwort aller User ändern indem sie das mysql_install_db-Skript editieren oder wenn es nur um den MySQL root user geht durch:
      mysql -u root -e "update user set password=password('new_password')
      where user='root'" mysql
      
    • Starten sie den MySQL deamon nicht als root. mysqld kann von jedem user gestartet werden. Sie können auch einen neuen User 'mysql' anlegen um alles nich sicherer zu machen. Sie brauchen den root user name in der 'user'-Tabelle nicht zu ändern selbst wenn sie mysqld unter einem anderen User starten, da MySQL user nichts mit Unix-Usern zu tun hat. Um mysqld mit einem anderen user zu starten, können sie einfach das mysql.server Skript editieren. Dies wird normalerweise mit dem 'su'-Kommando durchgeführt.
    • Stellen sie sicher, daß nur der mysqld-User die read/write Rechte auf die Datenbank-Verzeichnisse hat.
    • Geben sie nicht allen Usern die 'Process_priv' Rechte. Jeder kann mit dem 'mysqladmin processlist'-Kommando überprüfen ob jemand das Password ändert. mysqld speichert eine extra Verbindung für User mit 'Process_priv'-Rechten, so daß ein root user sich einloggen kann selbst wenn alle normalen Verbindungen in Benutzung sind.
    • Geben sie 'File_priv'-Rechte nicht an alle User. Wenn ein User dieses Recht hat, kann er eine im ganzen Dateisystem Dateien mit den Rechten des mysql-Daemon anlegen! Um das ein bißchen sicherer zu machen werden alle Dateien die mit SELECT INTO OUTFILE erzeugt werden, mit dem Leserecht für jedermann versehen und es ist nicht möglich bereits bestehende Dateien zu überschreiben.
    • Falls sie ihrem DNS nicht trauen, sollten sie IP's anstatt Hostnamen in den Rechte-Tabellen verwenden. Die --secure Option für mysqld sollte im Prinzip Hostnames absichern. Auf jeden Fall sollte man sehr vorsichtig mit Wildcards in Hostnamen sein!
    • Falls sie ein root Password ind das mysql.server Skript integrieren, dann sollten sie dieses nur für root lesbar machen.

    Die nachfolgenden Optionen beinflußen die mysqld Sicherheit:

    --secure
    Stelle sicher, daß die IP-Nummer die von get_hostbyname geliefert wurde sich auch auf den Original-Hostnamen zurück abbilden läßt. Dies wurde implementiert um es für jemand außerhalb schwieriger zu machen sich Zugang zu verschaffen indem er einen anderen Host vortäuscht. Diese Option fügt auch einige "sanity checks" für Hostnamen hinzu. Dies ist bei MySQL 3.21 defaultmäßig abgeschaltet da es manchmal lange dauert dies zu überprüfen. MySQL 3.22 speichert Hostnamen zwischen und hat dies defaultmäßig eingeschaltet.
    --skip-grant-tables
    Benutze das Rechte-System überhautp nicht. Dies gibt jedem vollen Zugriff auf alle Datenbanken!
    --skip-name-resolve
    Hostnamen werden nicht aufgelößt. Alle Hostnamen in den Rechte-Tabellen müssen IP-Nummern oder 'localhost' sein.
    --skip-networking
    Erlaube keine Verbindungen über das Netzwerk (TCP/IP). Alle Verbindungen zu mysqld werden mit Unix-Sockets durchgeführt. Diese Option funktioniert auf Systemen mit MIT-pthreads nicht sehr gut da MIT-pthreads die Unix-Sockets nicht unterstützen.
       Lokal bzw. Remote-Zugriffe seit dem 6. Mai 1999