Supprimer les privilèges de la base de données MySQL

avant que vous ne pensiez que c'est une question en double, je crois que j'ai un cas unique, même si c'est un peu stupide.

il y a quelques jours, j'ai mis à jour la version de MySQL sur mon serveur Ubuntu 10.04 en 5.3.3 (elle est en avance sur les versions Ubuntu 10.04). Aujourd'hui, j'ai essayé de me connecter à phpMyAdmin pour quelque chose et j'ai découvert l'erreur quelque peu redoutée Connection for controluser as defined in your configuration failed .

après les descriptions suivantes de plusieurs questions SO sur la façon de corriger cela, je l'ai coincé.

  • j'ai essayé de reconfigurer phpMyAdmin , sans succès.
  • j'ai essayé de désinstaller phpMyadmin et réinstaller il, mais il ne pouvait pas supprimer les privilèges du db et échoué.
  • j'ai alors essayé de supprimer manuellement les privilèges de l'utilisateur - un peu bêtement, je pourrais ajouter - de la db, puis laisser tomber le db, puis l'utilisateur (avec flush privileges ).
  • j'ai complètement abandonné toute l'installation de phpMyAdmin (en supprimant l'application et le répertoire/etc / phpmyadmin) et je l'ai réinstallée (en utilisant apt-get) mais elle a dit que les permissions pour l'utilisateur phpmyadmin existaient déjà:

granting access to database phpmyadmin for phpmyadmin@localhost: already exists

donc, voilà ce qu'il me reste. J'ai une bourse que je ne peux pas modifier ni révoquer:

mysql> show grants for 'phpmyadmin'@'localhost';
+-------------------------------------------------------------------------------------------------------------------+
| Grants for phpmyadmin@localhost                                                                                   |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'phpmyadmin'@'localhost' IDENTIFIED BY PASSWORD '*46CFC7938B60837F46B610A2D10C248874555C14' |
| GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO 'phpmyadmin'@'localhost'                                                |
+-------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.26 sec)

mysql> revoke usage on *.* from 'phpmyadmin'@'localhost';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on host 'localhost'

mysql> revoke usage on *.* from 'phpmyadmin'@'localhost' identified by 'trustno1';
ERROR 1141 (42000): There is no such grant defined for user 'phpmyadmin' on host 'localhost'

(ne vous inquiétez pas, je n'utilise plus ce mot de passe, mais c'est le mot de passe qui a été utilisé précédemment et ce n'est pas le mot de passe que j'ai choisi pour la nouvelle installation de phpmyadmin).

Comment puis-je supprimer totalement ces subventions/privilèges? Je suis heureux de recommencer à zéro si besoin est (phpmyadmin qui est, pas le db).

41
demandé sur Community 2013-07-23 04:55:16

2 réponses

le privilège D'USAGE dans mysql signifie simplement qu'il n'y a aucun privilège pour l'utilisateur 'phpadmin'@'localhost' défini au niveau global *.* . En outre, le même utilisateur a tous les privilèges sur la base de données phpmyadmin phpadmin.* .

donc si vous voulez supprimer tous les privilèges et commencer totalement à partir de zéro, faites ce qui suit:

  • révoque tous les privilèges au niveau de la base de données:

    REVOKE ALL PRIVILEGES ON phpmyadmin.* FROM 'phpmyadmin'@'localhost';

  • supprimer l'utilisateur 'phpmyadmin'@'localhost'

    DROP USER 'phpmyadmin'@'localhost';

procédure ci-dessus supprimera entièrement l'utilisateur de votre instance, ce qui signifie que vous pouvez le recréer à partir de zéro.

pour vous donner un arrière-plan sur ce qui est décrit ci-dessus: dès que vous créez un utilisateur, la table mysql.user sera remplie. Si vous regardez sur un enregistrement vous y verrez l'utilisateur et tous les privilèges définis à 'N' . Si vous faites un show grants for 'phpmyadmin'@'localhost'; vous verrez, la famille allready, sortie ci-dessus. Simplement traduit par "pas de privilèges au niveau mondial pour l'utilisateur". Maintenant votre subvention ALL à cet utilisateur au niveau de la base de données, cela sera stocké dans le tableau mysql.db . Si vous faites un SELECT * FROM mysql.db WHERE db = 'nameofdb'; vous verrez un 'Y' sur chaque priv.

décrit ci-dessus montre le scénario que vous avez sur votre db à l'heure actuelle. Si avoir un utilisateur qui n'a que le privilège USAGE signifie que cet utilisateur peut se connecter, mais en plus de SHOW GLOBAL VARIABLES; SHOW GLOBAL STATUS; il n'a pas d'autres privilèges.

87
répondu Flo Doe 2013-07-25 08:37:24

la raison pour laquelle revoke usage on *.* from 'phpmyadmin'@'localhost'; ne fonctionne pas est assez simple : il n'y a pas de subvention appelée USAGE .

les subventions effectivement nommées sont dans la documentation MySQL

la subvention USAGE est une subvention logique. Comment? 'phpmyadmin' @ 'localhost'a une entrée dans mysql.user où user=' phpmyadmin'et host='localhost'. N'importe quelle dispute à mysql.l'utilisateur signifie sémantiquement USAGE . En cours d'exécution DROP USER 'phpmyadmin'@'localhost'; devrait fonctionner parfaitement. Sous le capot, il fait vraiment ça:

DELETE FROM mysql.user WHERE user='phpmyadmin' and host='localhost';
DELETE FROM mysql.db   WHERE user='phpmyadmin' and host='localhost';
FLUSH PRIVILEGES;

par conséquent, la suppression d'une rangée de mysql.user constitue l'exécution REVOKE USAGE , même si REVOKE USAGE ne peut pas être littéralement exécutée.

13
répondu RolandoMySQLDBA 2013-07-26 22:16:07