Anonymer Benutzer kann nicht aus mysql.user entfernt werden

15

Ich versuche, die anonymen Benutzer aus meiner mysql.users-Datenbank zu löschen. Allerdings habe ich merkwürdiges Verhalten bekommen. Wenn ich den Befehl eingebe:

DROP User ''@'WOPR';

Ich habe eine allgemeine Fehlermeldung erhalten. Also habe ich meinen Computer neu gestartet und es erneut versucht. Diesmal bekam ich die Antwort

Query OK, 0 rows affected.

Aber wenn ich reinsteige

SELECT User, Host, Password FROM mysql.user WHERE User='';

Die Rückgabe ist:

+------+------+----------+
| User | Host | Password |
+------+------+----------+
|      | WOPR |          |
+------+------+----------+

(WOPR ist mein Hostname)

Ich führe den Befehl aus

DROP User ''@'WOPR';

und erhalten das gleiche Ergebnis.

Ich führe eine Neuinstallation von MySQL 5.5 unter Arch Linux, Kernel-Version 2.6.33 aus.

Weiß jemand, was dieses Verhalten verursachen kann?

SirTasty
quelle
Bitte informieren Sie den DBA StackExchange über Fragen dieser Art !!!
RolandoMySQLDBA

Antworten:

15
DELETE FROM mysql.user WHERE user='' AND host='WOPR';
FLUSH PRIVILEGES;

Dies sollte es für Sie tun.

Versuche es !!!

VORBEHALT

In MySQL sind bestimmte Benutzer in mysql.user vorinstalliert. Außerdem enthält mysql.db zwei Benutzer, die über anonymen Zugriff und vollständige Berechtigungen zum Testen von Datenbanken verfügen.

Tu das einfach

SELECT * FROM mysql.db \G

und Sie werden sehen, dass jeder, der eine Verbindung zu test oder einer Datenbank herstellt, die mit test_ beginnt, so ziemlich alles in der Testdatenbank tun kann. Dies ist schlecht, da eine Person mit uneingeschränktem Zugriff auf eine Testdatenbank eine Festplatte innerhalb weniger Minuten aufzehren kann.

Beispiel:

use test
CREATE TABLE junk (INT a) ENGINE=MyISAM;
INSERT INTO junk VALUES (1);

OK, große Sache. Es wird eine Tabelle mit 4 Bytes erstellt.

Versuchen Sie nun 30 Mal, diese SQL-Anweisung auszuführen:

INSERT INTO junk SELECT * FROM junk;

Hey, ein Instant-Tisch mit 1.073.741.824 Zeilen (4 GB + Datei) !!! Imaging mit vollständigen Rechten für eine Testdatenbank, in der Sie diese Art von Chaos auf einer Festplatte anrichten können.

Mein Rat an Sie ist, dies auszuführen, um den Testbenutzerzugriff zu bereinigen:

DELETE FROM mysql.db WHERE db LIKE 'tes%' AND user='';
FLUSH PRIVILEGES;

Weitere Erläuterungen finden Sie in meinem Beitrag zu MySQL: Warum gibt es "Test" -Einträge in mysql.db?

Prost !!!

RolandoMySQLDBA
quelle
Hallo Rolando, das hat den Trick gemacht, danke! Ich repariere gerade meinen Testdatenbankzugriff.
SirTasty
Gibt es keine Möglichkeit, die drop userSyntax zu verwenden, anstatt die zugrunde liegende mysql.userTabelle direkt zu ändern?
Pacerier
1
@ Pacerier Bitte schauen Sie sich die Originalfrage an. Das eigentliche Problem ist, dass die DROP USERSyntax nicht funktioniert, wenn das Benutzerfeld leer ist (leere Zeichenfolge). Sie müssen es so machen, wie es die Antwort vorgibt.
RolandoMySQLDBA
@RolandoMySQLDBA, Gibt es neben dem Herumhacken mit der mysql.userTabelle noch andere Lösungen ?
Pacerier
@Pacerier Wenn Sie meinen letzten Link lesen, werden Sie feststellen, dass MySQL (jetzt Oracle) mysql.dbbei der Installation zwei Zeilen direkt anordnet , damit anonyme Benutzer auf eine Testdatenbank zugreifen können. Interessanterweise wurde mir mitgeteilt, dass die Installation von Percona Server diese Zeilen löscht, bevor die Installation abgeschlossen ist ( dba.stackexchange.com/questions/66584/… ). Da Sie MySQL verwenden, führen Sie entweder mysql_secure_installation aus oder löschen Sie diese beiden Zeilen selbst.
RolandoMySQLDBA