Acceso raíz MySQL desde todos los hosts


152

He instalado el servidor MySQL en una máquina remota de Ubuntu. El rootusuario se define en la mysql.usertabla de esta manera:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Puedo acceder con el usuario rootdesde la misma interfaz de línea de comandos de la máquina remota utilizando el mysqlcliente estándar . Ahora quiero permitir el acceso a la raíz desde cada host en Internet , así que intenté agregar la siguiente fila (es un duplicado exacto de la primera fila del volcado anterior, excepto la hostcolumna):

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

Pero mi cliente en mi PC personal continúa diciéndome (oscurecí la IP del servidor):

Error de SQL (2003): no se puede conectar al servidor MySQL en '46 .xxx '(10061)

No puedo decir si es un error de autenticación o un error de red. En el servidor de seguridad habilité el puerto 3306 / TCP para 0.0.0.0/0 , y eso está bien para mí ...


puede telnet a la máquina en el puerto 3306
mihaisimi

3
lo más probable es que el demonio MySQL no escuche en 46.xxx sino solo en localhost. Busque bind-addressen my.cnf
Maxim Krizhanovsky

1
Entonces, el mundo + perro ahora tiene el hash de su contraseña de root, el conocimiento de que la raíz es accesible desde cualquier host en Internet y el primer byte de su dirección IP. Usted no cree que esto es sólo un pequeño poco en relación?
eggyal

Respuestas:


362

Hay dos pasos en ese proceso:

a) Conceder privilegios. Como usuario root, ejecute esta sustitución 'password'con su contraseña de root actual:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

b) enlazar a todas las direcciones:

La forma más fácil es comentar la línea en su my.cnfarchivo:

#bind-address = 127.0.0.1 

y reiniciar mysql

service mysql restart

De forma predeterminada, se vincula solo a localhost, pero si comenta la línea, se vincula a todas las interfaces que encuentra. Comentar la línea es equivalente a bind-address=*.

Para verificar dónde se ha vinculado el servicio mysql, ejecute como root:

netstat -tupan | grep mysql

Actualización para Ubuntu 16:

El archivo de configuración es (ahora)

/etc/mysql/mysql.conf.d/mysqld.cnf 

(al menos en Ubuntu 16 estándar)


55
Ok, el problema era la dirección vinculante. Gracias. @Darhazer Gracias también :)
lorenzo-s

2
Para consultar las subvenciones actuales: `MOSTRAR SUBVENCIONES PARA 'root' @ '%';
robsch

55
Para permitir también que root @% otorgue permisos a otros usuarios, inmediatamente después del paso (a) ejecute: CONCESIÓN DE USO EN *. * PARA 'root' @ '%' CON LA OPCIÓN DE CONCESIÓN;
Caleb

1
El archivo de configuración es (ahora) /etc/mysql/mysql.conf.d/mysqld.cnf (al menos en Ubuntu 16 estándar)
jgp

2
Solo necesitaba hacer esto, para poder conectarme remotamente al servidor de forma remota:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy

35

Ejecute la siguiente consulta:

use mysql;

update user set host='%' where host='localhost'

NOTA: No recomendado para uso en producción.


2
Esta no es la solución perfecta. Puede funcionar Para mí, produjo un error: ERROR 1062 (23000): entrada duplicada '% -root' para la clave 'PRIMARY'
Scriptlabs

2
@Scriptlabs, es probable que haya más de una entrada en la tabla de usuario con un host de 'localhost'. Y más de una fila con root, incluyendo root.localhost, root.127.0.0.1, root.::1. Por lo tanto, es mejor agregar un usuario separado en lugar de actualizar, por eso estoy rechazando esta respuesta.
Mike Purcell

44
no es PRIVILEGIOS FLUSH; También es necesario justo después?
Nom1fan

1
Esto es trabajo para mí. prueba esto. update mysql.user set host='%' where user='root'
nur zazin

7

Algunas veces

dirección de enlace = 127.0.0.1

debiera ser

dirección-enlace = *


7

MYSQL 8.0 - abrir cliente de línea de comando mysql
CONCEDE TODOS LOS PRIVILEGIOS EN *. * A 'root' @ 'localhost';
use mysql
UPDATE mysql.user SET host = '%' WHERE user = 'root';
Reiniciar el servicio mysql


4

MariaDB ejecutándose en Raspbian: el archivo que contiene la dirección de enlace es difícil de identificar. MariaDB tiene información no muy útil sobre el tema.

solía

# sudo grep -R bind-address /etc 

para localizar dónde está la maldita cosa.

También tuve que establecer los privilegios y hosts en mysql como todos los mencionados anteriormente.

Y también pasé un buen rato abriendo el puerto 3306 para conexiones remotas a mi Raspberry Pi, finalmente utilicé iptables-persistent .

Todo funciona muy bien ahora.


1

Si tiene muchas redes conectadas a su sistema operativo, debe especificar una de esta red en los enlaces de enlace del archivo my.conf. un ejemplo:

[mysqld]
bind-address = 127.100.10.234

esta ip es de una configuración ethX.


1
Por favor agregue más detalles. ¿En qué archivo o marco debe suceder esa configuración? Sea más específico sobre la configuración de ethX.
BPS

1

En mi caso, la configuración de "dirección de enlace" era el problema. Al comentar esta configuración en my.cnfno ayuda, ya que en mi caso MySQL establecer el valor predeterminado a 127.0.0.1 por alguna razón.

Para verificar qué configuración está usando MySql actualmente, abra la línea de comando en su cuadro local:

mysql -h localhost -u myname -pmypass mydb

Lea la configuración actual:

Show variables where variable_name like "bind%"

Debería ver 0.0.0.0 aquí si desea permitir el acceso desde todos los hosts. Si este no es el caso, edite su /etc/mysql/my.cnfy establezca la dirección de enlace en la sección [mysqld]:

bind-address=0.0.0.0

Finalmente reinicie su servidor MySql para elegir la nueva configuración:

sudo service mysql restart

Intente nuevamente y verifique si se ha seleccionado la nueva configuración.


-2

mysql_update es lo que necesitas

No sé por qué alguien seguiría las formas más complejas de corregir este problema, cuando MySql gentilmente creó una herramienta que ya hace esto ...

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.