Changer les permissions des hôtes pour les utilisateurs de MySQL

45

J'ai les subventions suivantes pour un utilisateur / une base de données

mysql> SHOW GRANTS FOR 'username'@'localhost';
+---------------------------------------------------------------------------+
| Grants for username@localhost                                             |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT ALL PRIVILEGES ON `userdb`.* TO 'username'@'localhost'              |
+---------------------------------------------------------------------------+

Pour activer l'accès externe à la base de données, je dois changer localhost en %. Une façon de faire est d'utiliser REVOKEtoutes les autorisations et de le définir à nouveau. Le problème est qu'il existe un mot de passe que je ne connais pas. Par conséquent, si je révoque l'autorisation, je ne peux pas le rétablir.

Existe-t-il un moyen de changer le nom localhostd' hôte en %(et de revenir) sans révoquer l'autorisation elle-même?

Fu86
la source

Réponses:

60

Si vous avez accès à la mysqlbase de données, vous pouvez modifier les tables de droits directement:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

... et une UPDATEdéclaration analogue pour le changer.

Vous devrez peut-être également modifier la mysql.dbtable:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
nickgrim
la source
Un petit correctif (version du serveur mysql: 5.7.5-m15 - serveur de communauté MySQL): à la fois depuis phpmyadmin et l'invite de commande mysql - UPDATE mysql. userSET Host= 'localhost' WHERE user. Host= '%' ET user. User= 'XXXdbusr';
Jadeye
1
Pour une base de données de production, je ferais attention à%, cela peut représenter un risque pour la sécurité. Si vous avez plusieurs serveurs Web, vous pouvez également utiliser des hôtes génériques, tels que '192.168.0.%' Ou ''% .example.com ''. Une autre option consiste à ajouter le même utilisateur plusieurs fois pour chaque hôte ou à créer un utilisateur nommé séparément par serveur Web.
okdewit
Si, comme moi, essayait d'autoriser l'accès root sur une machine de test locale (RasPi dans mon cas), cela ne fonctionnerait pas depuis MySQL 5.7. Voir le fil
Raul Pinto
@RaulPinto: ce fil de discussion semble concerner phpMyAdmin, ce qui n'est pas totalement pertinent ici, mais il est bon de le noter pour les personnes qui l'utilisent uniquement.
nickgrim
Mieux vaut utiliser la déclaration bien documentée RENAME USER
Antonio Bardazzi
6

Meilleure réponse sur Stackoverflow suggérant d'utiliser RENAME USERquelle copie les privilèges de l'utilisateur.

L'utilisation du langage de contrôle des données (instructions telles que GRANT, REVOKE, RENAME, etc.) n'est pas FLUSH PRIVILEGES;requise et est requise dans une architecture telle que Galera ou la réplication de groupe dans laquelle les tables MyISAM ne sont pas répliquées.

Antonio Bardazzi
la source
2

Je suis tombé sur celui-ci également, et la solution proposée n'a pas fonctionné, car les privilèges spécifiques à la base de données ne seraient pas déplacés également. ce que j'ai fait:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
Roman Haefeli
la source
Et "ça" a fonctionné?
Pierre.Vriens
1

Pour modifier les privilèges, d'abord révoquer toutes les autorisations à l'utilisateur

 revoke all privileges on *.* from 'username'@'localhost';

 grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';

 flush privileges;
Abhishek Anand Amralkar
la source
C'est exactement mon problème, je ne peux pas révoquer l'autorisation à cause du mot de passe. S'il vous plaît lire ma question.
Fu86
Vous pouvez définir le hash du mot de passe pour qu'il soit identique à l'ancien via une mise à jour. Vous n'avez pas besoin de connaître le mot de passe pour le faire.
Drogart
0

Manque beaucoup de tables si vous avez des privilèges autres que simplement db (comme des tables ou des colonnes, etc.). En fonction des subventions accordées à votre utilisateur, vous devrez peut-être mettre à jour toutes ces tables ou certaines d'entre elles:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.tables_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.columns_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.procs_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.proxies_priv SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
mikew
la source