Impossible de supprimer un utilisateur anonyme de mysql.user

15

J'essaye de SUPPRIMER les utilisateurs anonymes de ma base de données mysql.users. Cependant, j'ai un comportement étrange. Lorsque j'entre la commande:

DROP User ''@'WOPR';

J'obtenais un message d'erreur générique. J'ai donc redémarré ma machine et je l'ai réessayée. Cette fois, j'ai eu la réponse

Query OK, 0 rows affected.

Mais quand je mets

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

Le retour est:

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

(WOPR est mon nom d'hôte)

Je lance la commande

DROP User ''@'WOPR';

et obtenez le même résultat.

J'exécute une nouvelle installation de MySQL 5.5 sur Arch Linux, la version 2.6.33 du noyau.

Quelqu'un sait-il ce qui peut provoquer ce comportement?

SirTasty
la source
Veuillez passer le mot pour envoyer des questions de cette nature au DBA StackExchange !!!
RolandoMySQLDBA

Réponses:

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

Cela devrait le faire pour vous.

Essaie !!!

CAVEAT

MySQL a certains utilisateurs préinstallés dans mysql.user. De plus, mysql.db est livré avec deux utilisateurs qui ont un accès anonyme et des privilèges complets pour tester les bases de données.

Fais juste ça

SELECT * FROM mysql.db \G

et vous verrez que quiconque se connecte à test ou à toute base de données commençant par test_ peut à peu près tout faire dans la base de données de test. C'est mauvais car une personne ayant un accès complet à n'importe quelle base de données de test peut consommer un disque en quelques minutes.

Exemple:

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

OK, gros problème. Il fait une table avec 4 octets.

Maintenant, essayez d'exécuter cette instruction SQL 30 fois:

INSERT INTO junk SELECT * FROM junk;

Hé une table instantanée avec 1 073 741 824 lignes (4 Go + fichier) !!! Imaging disposant de tous les droits sur une base de données de test où vous pouvez faire ce genre de ravage sur un disque.

Mon conseil est d'exécuter ceci pour nettoyer l'accès des utilisateurs de test:

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

Pour plus de précisions, voir mon article MySQL: Pourquoi y a-t-il des entrées "test" dans mysql.db?

À votre santé !!!

RolandoMySQLDBA
la source
Salut Rolando, ça a fait l'affaire, merci! Je corrige actuellement l'accès à ma base de données de test.
SirTasty
N'y a-t-il pas un moyen d'utiliser la drop usersyntaxe au lieu de modifier mysql.userdirectement la table sous - jacente ?
Pacerier
1
@Pacerier Veuillez regarder la question d'origine. Le vrai problème est que la DROP USERsyntaxe ne fonctionne pas lorsque le champ utilisateur est vide (chaîne vide). Vous devez le faire comme indiqué dans la réponse.
RolandoMySQLDBA
@RolandoMySQLDBA, Existe-t-il d'autres solutions que le piratage autour de la mysql.usertable?
Pacerier
@Pacerier Si vous lisez mon dernier lien, vous vous rendrez compte que MySQL (maintenant Oracle) place deux lignes directement dans mysql.dbl'installation qui permettra aux utilisateurs anonymes d'accéder à une base de données de test. Fait intéressant, on m'a dit que l'installation de Percona Server supprime ces lignes avant la fin de son installation ( dba.stackexchange.com/questions/66584/… ). Puisque vous utilisez MySQL, exécutez mysql_secure_installation ou supprimez ces deux lignes vous-même.
RolandoMySQLDBA