Weiter Zurück [Inhalt] Online Suche im Handbuch

29. Wie sichere ich MySQL gegen Hacker ab ?

Um ein MySQL System abzusichern, sollten man folgendes bedenken:

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 Dämon nicht als root. mysqld kann von jedem Useraccount des Betriebssystems gestartet werden.

Sie können auch einen neuen User 'mysql' anlegen um alles noch 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 der Username, unter dem der MySQLD - Dämon gestartet wird, nichts mit den Userrechten des GRANT Mechanismus zu tun hat.

Um mysqld mit anderen User-Rechten zu starten, genügt es, das mysql.server Skript zu editieren. Dies wird normalerweise mit dem 'su'-Kommando ausgefü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 automatisch besondere Rechte für User mit 'Process_priv'-Rechten in der User Tabelle ab, 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 dies zu verhindern, werden alle Dateien, die mit SELECT INTO OUTFILE erzeugt werden, mit dem Leserecht für jedermann versehen, damit es nicht möglich ist, bereits bestehende Dateien zu überschreiben.

Falls sie ihrem DNS Server nicht trauen, sollten sie IP-Nummern anstatt Hostnamen in den Rechte-Tabellen verwenden.

Die Option --secure für mysqld sollte im Prinzip Hostnames mit einem double reverse lookup absichern.

Auf jeden Fall sollte man sehr vorsichtig mit Wildcards in Hostnamen sein !

Falls sie ein root Paßwort in 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 (adress spoofing).

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. Der User hat dann fälschlicherweise den Eindruck, MySQL wäre zu langsam ...

MySQL ab Version 3.22 speichert Hostnamen zwischen und hat dies defaultmäßig eingeschaltet.

--skip-grant-tables

Benutze das Rechte-System nicht. Dies gibt jedermann 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.

Hier noch einmal die Privilegien im Überblick:

ALL PRIVILEGES      FILE                RELOAD
ALTER               INDEX               SELECT
CREATE              INSERT              SHUTDOWN
DELETE              PROCESS             UPDATE
DROP                REFERENCES          USAGE

ALL ist ein Synonym für ALL PRIVILEGES. REFERENCES ist leider noch nicht implementiert.

USAGE ist momentan (könnte noch geändert werden) ein Synonym für "no privileges". Es kann für einen User verwendet werden, der keine Privilegien besitzt.

Um Rechte einem User zu entziehen, muß man den Wert mit der GRANT Option verändern.


REVOKE GRANT OPTION ON ... FROM ...;

Die einzigen priv_type Werte, die man für einen tabelle verändern kann, sind SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT, INDEX und ALTER.

Es können auch priv_type Werte für Spalten angegeben werden. Diese sind SELECT, INSERT and UPDATE.

Man kann globale Privilegien mit Hilfe der ON *.* Syntax setzen, wie z.B.: ON db_name.* ..... Aber Achtung ! Wer keine Datenbank angegeben hat, setzt die Privilegien für die komplette Datenbank.

Für bestimmte User, die immer über dieselbe IP-Nummer sich an den Server anbinden, kann es interessant sein, in MySQL dieses mitzuloggen und zu regeln. Hierzu kann man entweder einen User mit der Form user@host oder auch mit Wildcards bestimmen, wie z.B. mit dem Zeichen "%".

So könnte man auch user@"%.domain.de", oder user@"192.168.100.%" angeben, um einem User in einem Klass-C Netz Zugang zu geben. Dieses Beispiel sollte immer dann verwendet werden, wenn die IP-Nummern im Netz mit DHCP vergeben werden.

Der einfache User ist ein Synonym für user@"%". Wenn jedoch der Zugang für alle User freigegeben wird, dies ist die Default - Einstellung, dann sollten Sie unbedingt alle lokalen User noch in die mysql.user (Datenbank mysql, Tabelle user Tabelle eintragen. Es werden dann alle User Ihres Netzwerkes korrekt mitgeloggt.

So können Sie später ermitteln, welcher Ihnen bekannte User auf die Datenbank zugegriffen hat:


mysql> SELECT Host,User FROM mysql.user WHERE User=";

Im Moment unterstützt GRANT nur host, table, database und columns Rechte mit bis zu 60 Buchstaben. Ein Username darf maximal 16 Buchstaben lang sein, was in der Praxis völlig ausreichen dürfte.

Die Privilegien für eine Tabelle oder eine Spalte werden in einem logischen OR mit anderen Privilegien in anderen Tabellen verknüpft. Entweder Sie sind als User berechtigt, auf die Datenbank zuzugreifen, oder Ihre Arbeitsstation darf zugreifen. In beiden Fällen muß Ihnen jedenfalls der Zugang gewärt werden. Das bedeutet dann auch, daß Sie von anderen Arbeitsstationen auf Ihre Datenbank zugreifen können. Das birgt natürlich auch Gefahren, wenn Sie z.B. einen Host eintragen, und DHCP im Netzwerk aktiviert haben. Es ist dann nur eine Frage der Zeit, bis jemand rein zufällig Ihre Rechte nuten kann, weil das DHCP System diesem User Ihre alte IP-Nummer vergeben hat.

Die Privilegien einer Spalte wird also wie folgt bestimmt:


global privileges
ODER (database privileges AND host privileges)
ODER table privileges
ODER column privileges

Wenn Sie Rechte vergeben, dann bleiben diese solange aktiv, bis Sie diese mit dem DELETE Befehl aufheben. Das bedeutet im Klartext, daß Rechte,die mit GRANT vergeben wurden, nicht mit REVOKE gelöscht werden können. Hierzu muß explizit DELETE verwendet werden.

In MySQL 3.22.12 oder höher wird beim Anlegen eines Users ein bestimmtes Paßwort gesetzt, welches der IDENTIFIED BY Klausel entnommen wird. In diesem Fall wird das alte Paßwort durch ein neues ersetzt.

Aber Achtung: Wenn keine solche Klausel angeben wird, dann besitzt der User kein Paßwort. Das sollte nie passieren.

Paßworte werden mit der Option SET PASSWORD gesetzt. Siehe Kapitel SET.

Wenn GRANT Privilegien für eine Datenbank vergeben werden, wird ggf. eine mysql.db Tabelle angelegt. Erst, wenn alle Einträge mit REVOKE gelöscht wurden, wird diese Tabelle wieder gelöscht.

Wenn ein User keinerlei Privilegien an einer Tabelle besitzt, dann wird diese auch nicht angezeigt, z.B. wenn der User sich eine Liste der Tabelle mit SHOW TABLES anzeigen läßt. Diese Tabelle ist dennoch vorhanden.

Mit der Option WITH GRANT OPTION Klausel kann man einem User die Erlaubnis geben, seine Rechte auch an andere User weiterzugeben. Daher sollte man mit dieser Option sehr vorsichtig sein.

Man kann also keine Rechte weitervererben, die man selber nicht besitzt. Man sollte jedoch aufpassen, wenn man einem User Rechte in dem Moment vererbt, wenn man selber gerade höhere Privilegien besitzt. Um dies zu verhindern, muß man sich entweder ausloggen und unter einem neuen Level einloggen, oder man verwendet die Option WITH GRANT, um die Rechte für eine Datenbank einzuschränken, die man gerade einem anderen User vererben möchte. Wenn Sie also das UPDATE Recht vergeben, dann erhält der User automatisch auch das Recht für INSERT und SELECT.

Man sollte normalerweise keinem User das ALTER Recht geben, da ansonsten ein User die Rechte verändern kann, indem er eine Tabelle umbenennt.

Beim Start von MySQL werden alle Privilegien in das RAM geladen. Damit werden alle Regeln aktiv, sobald sich ein User an die Datenbank anbindet. Alle Modifikationen an den Rechten, die mit GRANT oder REVOKE ausgeführt werden, werden von dem User direkt bemerkt. Wenn Sie jedoch per Hand die Rechte verändern, z.B. mit INSERT oder UPDATE, dann müssen die unbedingt alle Privilegien mit FLUSH PRIVILEGES aktualisieren. Dies können Sie entweder über ein SQL Statement erreichen, oder Sie verwenden das Toolkit mysqladmin flush-privileges.

Die größten Unterschiede zwischen ANSI SQL und MySQL bei GRANT sind diese:


Weiter Zurück [Inhalt] Online Suche im Handbuch