conceder acceso remoto a la base de datos MySQL desde cualquier dirección IP

282

Soy consciente de este comando:

GRANT ALL PRIVILEGES
ON database.*
TO 'user'@'yourremotehost'
IDENTIFIED BY 'newpassword';

Pero luego solo me permite otorgar una dirección IP particular para acceder a esta base de datos remota de MySQL. ¿Qué sucede si lo deseo para que cualquier host remoto pueda acceder a esta base de datos MySQL? ¿Cómo puedo hacer eso? Básicamente, estoy haciendo pública esta base de datos para que todos puedan acceder a ella.

adit
fuente
1
Antes de hacer esto, considere las implicaciones de seguridad
e18r el
77
No todo sistema es un sistema de producción. Algunas personas necesitan esto para el desarrollo.
Conrad Jones el

Respuestas:

274
TO 'user'@'%'

% es un comodín: también puede hacer '%.domain.com'o '%.123.123.123'cosas así si lo necesita.

Ariel
fuente
@kristopolous Hay muchas cosas que podrían causar eso. Este comando trata sobre el acceso remoto (dos máquinas diferentes). Si eso no es lo que está haciendo, este no es el comando correcto. Aún necesita una contraseña correcta y otras cosas.
Ariel
11
Debe usar "privilegios de descarga"; para que los cambios surtan efecto
Didier Sampaolo
El truco cuando se conecta a una instancia de db que se ejecuta en la misma instancia del sistema operativo (por ejemplo, su máquina de desarrollo), es pasar el -h my_machine_nameparámetro. Esto engaña al cliente para que te identifique como 'user'@my_machine_name.example.com, en lugar de 'user'@localhost. De esta manera, no necesita crear y mantener cuentas duales y concesiones para ambos localhosty acceso a la red. Y, por supuesto, estar seguro mysqldestá obligado a 0.0.0.0frente 127.0.0.1.
Charlie Reitzel
173

Habilitar acceso remoto (Grant) Inicio / Tutoriales / Mysql / Habilitar acceso remoto (Grant) Si intenta conectarse a su servidor mysql desde una máquina remota y se encuentra con un error como el siguiente, este artículo es para usted.

ERROR 1130 (HY000): el host '1.2.3.4' no puede conectarse a este servidor MySQL

Cambiar la configuración de mysql

Comience con la edición del archivo de configuración mysql

vim /etc/mysql/my.cnf

Comente las siguientes líneas.

#bind-address           = 127.0.0.1
#skip-networking

Si no encuentra la línea de salto de red, agréguela y coméntela.

Reinicie el servidor mysql.

~ /etc/init.d/mysql restart

Cambiar privilegio GRANT

Es posible que se sorprenda al ver incluso después del cambio anterior que no obtiene acceso remoto o acceso pero no puede acceder a todas las bases de datos.

De manera predeterminada, el nombre de usuario y la contraseña de mysql que está utilizando puede acceder a mysql-server localmente. Entonces necesita actualizar el privilegio.

Ejecute un comando como el siguiente para acceder desde todas las máquinas. (Reemplace USERNAMEy PASSWORDpor sus credenciales).

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

Ejecute un comando como el siguiente para dar acceso desde una IP específica. (Reemplace USERNAMEy PASSWORDpor sus credenciales).

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'1.2.3.4' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

Puede reemplazar 1.2.3.4 con su IP. Puede ejecutar el comando anterior muchas veces para OTORGAR acceso desde múltiples IP.

También puede especificar un acceso remoto USERNAMEy separado PASSWORD.

Puede verificar el resultado final de la siguiente manera:

SELECT * from information_schema.user_privileges where grantee like "'USERNAME'%";

Finalmente, también puede necesitar ejecutar:

mysql> FLUSH PRIVILEGES;

Conexión de prueba

Desde terminal / línea de comando:

mysql -h HOST -u USERNAME -pPASSWORD

Si obtiene un shell mysql, no olvide ejecutar show database; para verificar si tiene privilegios correctos de máquinas remotas.

Consejo adicional: revocar acceso

Si accidentalmente concede acceso a un usuario, es mejor tener a mano la opción de revocación.

A continuación se revocarán todas las opciones para USERNAME de todas las máquinas:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'%';
Following will revoke all options for USERNAME from particular IP:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'1.2.3.4';
Its better to check information_schema.user_privileges table after running REVOKE command.

Si ve el privilegio USAGE después de ejecutar el comando REVOKE, está bien. Es tan bueno como ningún privilegio en absoluto. No estoy seguro de si se puede revocar.

Siddharth Kumar
fuente
77
Tenga en cuenta que tuve que cambiar el /etc/mysql/mysql.conf.d/mysqld.cnfarchivo en lugar de /etc/mysql/my.cnfcomentar la bind-addressparte. La #skip-networkinglínea de falta y no debe haber ningún efecto de la adición y comentando la línea.
Pawan
1
En MariaDB 10.1.26, el archivo de configuración es/etc/mysql/mariadb.conf.d/50-server.cnf
Kwadz
Si ha hecho todo lo anterior y aún no puede conectarse, verifique la configuración de su firewall, podría estar bloqueando el puerto 3306o el puerto que haya configurado
partir del
37

Suponiendo que el paso anterior se haya completado y que el puerto MySql 3306 se pueda acceder de forma remota; No olvide vincular la dirección IP pública en el archivo de configuración mysql.

Por ejemplo en mi servidor ubuntu:

#nano /etc/mysql/my.cnf

En el archivo, busque el bloque de sección [mysqld] y agregue la nueva dirección de enlace, en este ejemplo es 192.168.0.116. Se vería así

......    
.....    
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

bind-address        = 127.0.0.1    
bind-address        = 192.168.0.116

.....    
......

puede eliminar el enlace localhost (127.0.0.1) si lo desea, pero luego debe proporcionar específicamente una dirección IP para acceder al servidor en la máquina local.

Luego, el último paso es reiniciar el servidor MySql (en ubuntu)

stop mysql

start mysql

o #/etc/init.d/mysql restartpara otros sistemas

Ahora se puede acceder a la base de datos MySQL de forma remota mediante:

mysql -u username -h 192.168.0.116 -p
Waqas
fuente
/etc/init.d/mysql reloaddebería ser suficiente
Lorenz Lo Sauer
Acabo de hacer esto y no pude conectarme al servidor mysql de forma remota. Luego intenté comentar las direcciones de enlace y funcionó. También intenté iniciar sesión en el servidor con mysql -u <usuario> -p sin especificar el host y funcionó, por lo que parece que "puedes eliminar el enlace localhost (127.0.0.1) si lo deseas, pero luego tienes que hacerlo específicamente dar una dirección IP para acceder al servidor en la máquina local ". no es correcto. (ubuntu 12.04 servidor LTS mysql Ver 14.14 Distrib 5.5.34)
Programador
55
La bind-addressdirectiva determina la dirección IP en la que escucha el servidor mysql ; no las direcciones IP desde las cuales el servidor acepta conexiones.
GoZoner
1
Después de seguir cada paso, no funciona. Recibo un error al comentar bind-addressla dirección localhost o la de host remota. mysql.serviceJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
baermathias
¿Es posible proporcionar una dirección como abc.abc:1234 en lugar de 192.168.0.116?
bielas
26

Para cualquiera que haya intentado esto, así es como obtuve los privilegios, espero que ayude a alguien

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY
'yourRootPassword';

Como se señaló, %es un comodín y esto permitirá que cualquier dirección IP se conecte a su base de datos. La suposición que hago aquí es que cuando te conectas tendrás un usuario llamado root(que es el predeterminado). Introduce la contraseña de root y listo. Tenga en cuenta que no tengo comillas simples ( ') alrededor de la raíz del usuario.

Dev
fuente
¿Por qué es importante eliminar las comillas simples del usuario? ¿Por qué difiere esto de otras respuestas (y el manual)?
DMCoding
26

Se requieren cambios en el archivo de configuración para habilitar las conexiones a través de localhost.

Para conectarse a través de IP remotas, inicie sesión como usuario "root" y ejecute las siguientes consultas en mysql.

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Esto creará un nuevo usuario al que se puede acceder en localhost, así como desde IP remotas.

También comente la siguiente línea de su archivo my.cnf ubicado en /etc/mysql/my.cnf

bind-address = 127.0.0.1

Reinicia tu mysql usando

sudo service mysql restart

Ahora debería poder conectarse de forma remota a su mysql.

harishannam
fuente
2
Esto no responde la pregunta.
CHarris
1
@ChristopheHarris, ¿por qué te sientes así? La respuesta claramente proporciona instrucciones paso a paso sobre cómo crear un nuevo usuario en MySQL que permita el acceso localhost y remoto a la base de datos utilizando ese usuario. ¿Puedes explicarme?
harishannam
1
No funciona para mi Todavía tengo el mismo error. No importa si lo intento con root o con un nuevo usuario: No puedo conectarme al servidor MySQL en 'xxx.xxx.xxx.xxx' ([Errno 61] Conexión rechazada)
baermathias
21

Usa este comando:

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY 'yourRootPassword';

Luego:

FLUSH PRIVILEGES; 

Luego comente la línea siguiente en el archivo "/etc/mysql/mysql.conf.d/mysqld.cnf" (¡es obligatorio!):

bind-address = 127.0.0.1 

¡Funciona para mi!

Tomasz Czechowski
fuente
Muy buena. Importante la subvención. Si no, muchos errores para solicitudes comoyour-password-does-not-satisfy-the-current-policy-requirements
Alejandro Teixeira Muñoz
21

Para poder conectarse con su usuario desde cualquier dirección IP, haga lo siguiente:

Permita que el servidor mysql acepte conexiones remotas. Para este archivo mysqld.conf abierto:

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

Busque la línea que comienza con "bind-address" y establezca su valor en 0.0.0.0

bind-address                    = 0.0.0.0

y finalmente guarde el archivo.

Nota: Si está ejecutando MySQL 8+, la bind-addressdirectiva no estará en el mysqld.cnfarchivo por defecto. En este caso, agregue la directiva al final del archivo /etc/mysql/mysql.conf.d/mysqld.cnf.

Ahora reinicie el servidor mysql, ya sea con systemdo use el servicecomando anterior . Esto depende de su sistema operativo:

sudo systemctl restart mysql # for ubuntu    
sudo systemctl restart mysqld.service # for debian

Finalmente, el servidor mysql ahora puede aceptar conexiones remotas.

Ahora necesitamos crear un usuario y otorgarle permiso, para que podamos iniciar sesión con este usuario de forma remota.

Conéctese a la base de datos MySQL como root, o cualquier otro usuario con privilegios de root.

mysql -u root -p

ahora cree el usuario deseado tanto en localhost como en '%' comodín y otorgue permisos en todos los DB como tales.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

Luego,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

Y, por último, no te olvides de eliminar los privilegios

FLUSH PRIVILEGES;

Nota: Si ha configurado un firewall en su servidor de base de datos, también deberá abrir el puerto 3306 predeterminado del MySQL para permitir el tráfico a MySQL.

Espero que esto ayude ;)

Imtiaz Shakil Siddique
fuente
2
sudo systemctl restart mysqld.service es para debian, tuve que usar sudo systemctl restart mysql.service es para ubuntu
ani0904071
Actualicé mi respuesta y agregué el comando de reinicio mysql para ambas distribuciones. gracias @ ani0904071
Imtiaz Shakil Siddique
17

Ejecute lo siguiente:

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to root@'ipaddress' IDENTIFIED BY 'mysql root password';     
mysql> FLUSH PRIVILEGES;     
mysql> exit

Luego intente una conexión desde la dirección IP que especificó:

mysql -h address-of-remove-server -u root -p   

Deberías poder conectarte.

akhil.ov
fuente
15

Puedes resolver el problema de MariaDB con este comando :

Nota:

GRANT ALL ON *.* to root@'%' IDENTIFIED BY 'mysql root password';

%Es un comodín. En este caso, se refiere a todas las direcciones IP.

未来 陆家嘴 顶尖 的 投资 人
fuente
3
en mysql, lo que debe hacer es (1) .cambiar contenido my.cnf (2). el usuario remoto (3) se ocupa de su firewall para escuchar el puerto 3306.
未来 陆家嘴 顶尖 的 投资 人
Salvaste mi día. ¡Lo aprecio!
Almett
8
GRANT ALL PRIVILEGES ON *.* TO 'user'@'ipadress'
usuario3846464
fuente
7

Para acceder de forma remota a la base de datos del servidor Mysql 8:

CREATE USER 'root'@'%' IDENTIFIED BY 'Pswword@123';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;
Anil Rana
fuente
5
  • INICIE MYSQL usando un usuario administrador
    • mysql -u admin-user -p (INTRODUCIR CONTRASEÑA EN LA PRONTA)
  • Crea un nuevo usuario:
    • CREAR USUARIO 'newuser' @ '%' IDENTIFICADO POR 'contraseña'; (% -> anyhost)
  • Privilegios de concesión:
    • OTORGAR SELECCIONAR, BORRAR, INSERTAR, ACTUALIZAR EN db_name. * TO 'newuser' @ '%';
    • PRIMEROS PRIVILEGIOS;

Si está ejecutando una instancia EC2, no olvide agregar las reglas de entrada en el grupo de seguridad con MYSQL / Aurura.

Moh .S
fuente
5

Editar archivo:

/etc/mysql/percona-server.cnf

Agregue el siguiente código en el archivo.

[mysqld] bind-address = 0.0.0.0

Crear usuario para acceso remoto.

$ mysql -u root -p      
mysql> GRANT ALL ON *.* to snippetbucketdotcom@'%' IDENTIFIED BY 'tejastank';   
mysql> FLUSH PRIVILEGES;    
mysql> exit

Todo el servidor Linux funciona,

Para MSWin c: \ Buscar ubicación de instalación \ ruta del archivo

Tanque Tejas
fuente
[mysqld] necesita agregar el archivo, de lo contrario no funcionará correctamente
Tejas Tank
3

Simplemente cree el usuario en alguna base de datos como

GRANT ALL PRIVILEGES ON <database_name>.* TO '<username>'@'%' IDENTIFIED BY '<password>'

Luego ve a

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfy cambia la línea bind-address = 127.0.0.1abind-address = 0.0.0.0

Después de eso, puede conectarse a esa base de datos desde cualquier IP.

Diogo Mendes
fuente
3

Abra su mysql consoley ejecute el siguiente comando (ingrese su nombre de base de datos, nombre de usuario y contraseña):

OTORGAR TODO EN yourdatabasename. * A admin @ '%' IDENTIFICADO POR 'yourRootPassword';

Luego ejecutar:

PRIMEROS PRIVILEGIOS;

Abra la línea de comando y abra el archivo /etc/mysql/mysql.conf.d/mysqld.cnfusando cualquier editor con root privileges.

Por ejemplo:

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

Luego comente la siguiente línea:

dirección de enlace = 127.0.0.1

Reinicie mysql para reflejar los cambios usando el comando:

sudo service mysql restart

Disfrutar;)

Usman Yousaf
fuente
2

Necesita cambiar el archivo de configuración de mysql:

Comience con la edición del archivo de configuración mysql

vim /etc/mysql/my.cnf

añadir:

bind-address = 0.0.0.0
bhushan pardhi
fuente
0

En paneles de sitios web como cPanel, puede agregar un solo % (signo de porcentaje) en los nombres de host permitidos para acceder a su base de datos MySQL.

Al agregar uno solo %, puede acceder a su base de datos desde cualquier IP o sitio web, incluso desde aplicaciones de escritorio.

Muhammad Saqib
fuente
por favor no se refiera a algo como cPanel cuando se presenta una consulta directa, esto nunca mostrará un resultado funcional para nadie más
Tobias Hagenbeek
@TobiasHagenbeek Gracias por tus comentarios. Este método / truco no fue inventado por mí (es común en internet). Pero soy uno de los probadores de este método y descubrí que es el método más fácil y funcional por eso lo publiqué aquí. Sé que hay algunos riesgos de seguridad en este método que pueden ser descuidados.
Muhammad Saqib
0

Por ejemplo en mi CentOS

sudo gedit /etc/mysql/my.cnf

comentar las siguientes líneas

# dirección-enlace = 127.0.0.1

luego

servicio de sudo mysqld reiniciar

zawhtut
fuente
0

Si desea otorgar acceso remoto a su base de datos desde cualquier dirección IP, ejecute el comando mysql y luego ejecute el siguiente comando.

GRANT ALL PRIVILEGES ON *.*
TO 'root'@'%' 
IDENTIFIED BY 'password' 
WITH GRANT OPTION;
Atul6.Singh
fuente
0

lo que funcionó en Ubuntu es otorgar todos los privilegios al usuario:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;

y configurando la dirección de enlace en /etc/mysql/mysql.conf.d/mysqld.cnf:

bind-address            = 0.0.0.0

luego reiniciando el demonio mysql:

service mysql restart
Miguel Mota
fuente
-7

Puede deshabilitar toda la seguridad editando /etc/my.cnf:

skip-grant-tables
Danyial Shahid Ali
fuente
esto elimina todos los requisitos de contraseña
kristopolous
55
Tenga en cuenta que no es recomendable tener esta opción habilitada en un entorno de producción, ya que esto permite que cualquiera se conecte sin una contraseña.
AStopher
sin embargo, esto es ideal para un entorno de desarrollo
DMCoding
Esto permite a las personas hackear su base de datos sin usar una contraseña.
MilkyWay90
@DanielJames, incluso para el entorno de desarrollo, es una idea terrible
Dragas