web-dev-qa-db-fra.com

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

Avant de penser que cette question est en double, je pense avoir un cas unique, même s’il s’agit d’un cas un peu confus.

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

Après avoir suivi les descriptions de plusieurs SO questions sur la résolution de ce problème, je suis resté bloqué.

  • J'ai essayé de reconfigurer phpMyAdmin , sans succès.
  • J'ai essayé de désinstaller phpMyAdmin et réinstaller , mais il n'a pas pu supprimer les privilèges de la base de données et a échoué.
  • J'ai alors essayé de supprimer manuellement les privilèges de l'utilisateur - un peu bêtement, je pourrais ajouter - à partir de la base de données, puis laisser tomber la base de données, puis l'utilisateur (avec flush privileges).
  • J'ai complètement abandonné l'installation de phpMyAdmin (en supprimant l'application et le répertoire/etc/phpmyadmin) et je l'ai réinstallé (à l'aide d'apt-get), mais il était indiqué que les autorisations pour l'utilisateur phpmyadmin existaient déjà:

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

Donc, voici ce que je reste avec. J'ai une subvention que je ne peux ni 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 était 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, pas la base de données).

50
Cyntech

Le privilège USAGE dans mysql signifie simplement qu'il n'y a pas de privilèges pour l'utilisateur 'phpadmin' @ 'localhost' défini au niveau global *.*. De plus, le même utilisateur a le privilège ALL sur la base de données phpmyadmin phpadmin.*.

Donc, si vous voulez supprimer tous les privilèges et recommencer à zéro, procédez comme suit:

  • Révoquer 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';

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

Pour vous donner un peu de contexte sur ce qui est décrit ci-dessus: dès que vous créez un utilisateur, le mysql.user table sera peuplée. Si vous consultez un enregistrement, vous verrez que l'utilisateur et tous les privilèges sont définis sur 'N'. Si vous faites un show grants for 'phpmyadmin'@'localhost'; vous verrez, le familliar déjà, sortie ci-dessus. Traduit simplement en "pas de privilèges au niveau global pour l'utilisateur". Maintenant, votre subvention ALL à cet utilisateur au niveau de la base de données sera enregistrée dans la table mysql.db. Si vous faites un SELECT * FROM mysql.db WHERE db = 'nameofdb'; vous verrez un 'Y' sur chaque priv.

Ci-dessus, décrit le scénario que vous avez actuellement sur votre base de données. Donc, avoir un utilisateur qui n'a que USAGE privilège 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.

100
Flo Doe

En remarque, la raison revoke usage on *.* from 'phpmyadmin'@'localhost'; ne fonctionne pas est assez simple: Il n’ya pas de subvention appelée USAGE.

Les droits nommés sont dans la documentation MySQL

La subvention USAGE est une subvention logique. Comment? 'phpmyadmin' @ 'localhost' a une entrée dans mysql.user où utilisateur = 'phpmyadmin' et hôte = 'localhost'. Toute ligne dans mysql.user signifie sémantiquement USAGE. Fonctionnement DROP USER 'phpmyadmin'@'localhost'; devrait fonctionner parfaitement. Sous le capot, ça se fait vraiment:

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 ligne de mysql.user constitue en cours d'exécution REVOKE USAGE, même si REVOKE USAGE _ ne peut être littéralement exécuté.

14
RolandoMySQLDBA