Cambio de permisos de host para usuarios de MySQL

44

Tengo las siguientes subvenciones para un usuario / base de datos

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'              |
+---------------------------------------------------------------------------+

Para habilitar el acceso externo a la base de datos, necesito cambiar localhost a %. Una forma de hacerlo es con REVOKEtodos los permisos y configurarlo nuevamente. El problema es que hay un conjunto de contraseñas que no conozco, por lo que si revoco el permiso, no puedo volver a configurarlo.

¿Hay alguna manera de cambiar el nombre localhostde host a %(y de nuevo) sin revocar el permiso mismo?

Fu86
fuente

Respuestas:

59

Si tiene acceso a la mysqlbase de datos, puede cambiar las tablas de concesión directamente:

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

... y una UPDATEdeclaración análoga para cambiarlo de nuevo.

También es posible que deba realizar cambios en la mysql.dbtabla:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
nickgrim
fuente
Una pequeña solución (versión del servidor mysql: 5.7.5-m15 - Servidor de la comunidad MySQL): tanto desde phpmyadmin como desde el símbolo del sistema mysql - ACTUALIZACIÓN mysql. userSET Host= 'localhost' DONDE user. Host= '%' Y user. User= 'XXXdbusr';
Jadeye
1
Para una base de datos de producción, tendría cuidado con%, puede ser un riesgo de seguridad. Si tiene varios servidores web, también puede usar hosts con comodines como '192.168.0.%' O ''% .example.com ''. Otra opción es agregar el mismo usuario varias veces para cada host, o crear un usuario nombrado por separado por servidor web.
okdewit
Si, como yo, traté de permitir el acceso de root en una máquina de prueba local (RasPi en mi caso), esto no funcionará desde MySQL 5.7. Ver este hilo
Raul Pinto
@RaulPinto: ese hilo parece ser sobre phpMyAdmin, que no es totalmente relevante aquí, pero es bueno tener en cuenta para las personas que solo usan eso.
nickgrim
Mejor usar la declaración bien documentada USUARIO DE NOMBRES
Antonio Bardazzi
6

La mejor respuesta en Stackoverflow sugiere utilizar RENAME USERqué copia de los privilegios del usuario.

El uso del lenguaje de control de datos (declaraciones como GRANT, REVOKE, RENAME, etc.) no requiere FLUSH PRIVILEGES;y es necesario en arquitectura como Galera o Group Replication donde las tablas MyISAM no se replican.

Antonio Bardazzi
fuente
2

También me topé con este, y la solución propuesta no funcionó, ya que los privilegios específicos de la base de datos no se moverían también. lo que hice:

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
fuente
¿Y funcionó "eso"?
Pierre.Vriens
1

Para cambiar los privilegios, primero revoque todos los permisos para el usuario

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

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

 flush privileges;
Abhishek Anand Amralkar
fuente
Ese es exactamente mi problema, no puedo revocar el permiso debido a la contraseña. Por favor lee mi pregunta.
Fu86
Puede configurar el hash de contraseña para que sea el mismo que el anterior a través de una actualización. No necesita saber la contraseña real para hacerlo.
drogart
0

Falta muchas de las tablas si tiene privilegios que no sean simplemente db (como tablas o columnas, etc.). Dependiendo de las subvenciones que tenga su usuario, es posible que deba actualizar todas estas tablas o algunas:

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;
Mike
fuente