Acesso root ao MySQL de todos os hosts

152

Eu instalei o servidor MySQL em uma máquina remota Ubuntu. O rootusuário é definido na mysql.usertabela da seguinte maneira:

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

Eu posso acessar com o usuário rootda mesma interface de linha de comando da máquina remota usando o mysqlcliente padrão . Agora, quero permitir o acesso root de todos os hosts da Internet , então tentei adicionar a seguinte linha (é uma duplicata exata da primeira linha do despejo anterior, exceto a hostcoluna):

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

Mas meu cliente no meu PC pessoal continua me dizendo (eu obscureci o IP do servidor):

Erro SQL (2003): Não é possível conectar ao servidor MySQL em '46 .xxx '(10061)

Não sei dizer se é um erro de autenticação ou de rede. No firewall do servidor , ativei a porta 3306 / TCP para 0.0.0.0/0 , e tudo bem para mim ...

Lorenzo-s
fonte
você pode telnet para a máquina na porta 3306
mihaisimi
3
provavelmente o daemon MySQL não escuta no 46.xxx, mas apenas no host local. Procure bind-addressem my.cnf
Maxim Krizhanovsky
1
Portanto, o world + dog agora tem o hash da sua senha root, o conhecimento de que o root é acessível a partir de qualquer host na Internet e o primeiro byte do seu endereço IP. Você não acha que isso é apenas uma pequena pouco a respeito?
eggyal
possível duplicata de Habilitar conexão remota MySQL
user

Respostas:

362

Há duas etapas nesse processo:

a) Conceder privilégios. Como usuário root, execute com isso substituindo 'password'sua senha root atual:

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

b) vincular a todos os endereços:

A maneira mais fácil é comentar a linha do seu my.cnfarquivo:

#bind-address = 127.0.0.1 

e reinicie o mysql

service mysql restart

Por padrão, ele se liga apenas ao localhost, mas se você comentar a linha, ele se liga a todas as interfaces que encontrar. Comentar a linha é equivalente a bind-address=*.

Para verificar onde o serviço mysql foi ligado, execute como root:

netstat -tupan | grep mysql

Atualização para o Ubuntu 16:

O arquivo de configuração é (agora)

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

(pelo menos no Ubuntu 16 padrão)

hovanessyan
fonte
5
Ok, o problema foi o endereço de ligação. Obrigado. @Darhazer Thank you too :) #
lorenzo-s
2
Para consultar as concessões atuais: `SHOW GRANTS FOR 'root' @ '%';
26515 robsch
5
Para também permitir que o root @% conceda permissões a outros usuários, imediatamente após a etapa (a), execute: GRANT USAGE ON *. * PARA 'root' @ '%' WITH GRANT OPTION;
Caleb
1
Arquivo de configuração é (agora) /etc/mysql/mysql.conf.d/mysqld.cnf (pelo menos no padrão Ubuntu 16)
JGP
2
Eu só precisava fazer isso, para poder conectar-me remotamente ao servidor remotamente:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy 13/10
35

Execute a seguinte consulta:

use mysql;

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

NOTA: Não recomendado para uso em produção.

Babu James
fonte
2
Esta não é a solução perfeita. Isso pode funcionar. Para mim, produziu um erro: ERRO 1062 (23000): Entrada duplicada '% -root' para a chave 'PRIMARY'
Scriptlabs
2
@Scriptlabs, é provável que haja mais de uma entrada na tabela de usuários com um host 'localhost'. E mais de uma linha com raiz, incluindo root.localhost, root.127.0.0.1, root.::1. Portanto, é melhor adicionar um usuário separado em vez de atualizar, e é por isso que estou votando negativamente nesta resposta.
Mike Purcell
4
não são privilégios de descarga; também necessário logo após?
Nom1fan
1
isso está funcionando para mim. tente isso. update mysql.user set host='%' where user='root'
Nur zazin
7

As vezes

endereço de ligação = 127.0.0.1

deveria estar

endereço de ligação = *

user2839051
fonte
7

MYSQL 8.0 - cliente de linha de comando mysql aberto
GRANT ALL PRIVILEGES ON *. * TO 'root' @ 'localhost';
use mysql
UPDATE mysql.user SET host = '%' WHERE usuário = 'root';
Reinicie o serviço mysql

user10580057
fonte
4

MariaDB em execução no Raspbian - é difícil identificar o arquivo que contém o endereço de ligação. O MariaDB tem algumas informações não muito úteis sobre o assunto.

eu usei

# sudo grep -R bind-address /etc 

para localizar onde está o maldito.

Eu também tive que definir os privilégios e hosts no mysql como todos acima apontaram.

E também me diverti bastante abrindo a porta 3306 para conexões remotas ao meu Raspberry Pi - finalmente usei o iptables-persistent .

Tudo funciona muito bem agora.

The Big Zank
fonte
1

se você tiver muitas redes conectadas ao seu sistema operacional, deverá especificar uma dessas redes nos endereços de ligação do arquivo my.conf. um exemplo:

[mysqld]
bind-address = 127.100.10.234

esse ip é de uma configuração ethX.

felipe cardenas
fonte
1
Por favor, adicione mais detalhes. Em que arquivo ou estrutura essa configuração precisa acontecer? Por favor, seja mais específico sobre a configuração ethX.
BPS
1

No meu caso, a configuração "endereço de ligação" foi o problema. Comentando essa configuração no my.cnffez não ajuda, porque no meu caso mysql definir o padrão para 127.0.0.1 por algum motivo.

Para verificar qual configuração o MySql está usando atualmente, abra a linha de comando na sua caixa local:

mysql -h localhost -u myname -pmypass mydb

Leia a configuração atual:

Show variables where variable_name like "bind%"

Você deve ver 0.0.0.0 aqui se quiser permitir o acesso de todos os hosts. Se não for esse o caso, edite seu /etc/mysql/my.cnfe defina o endereço de ligação na seção [mysqld]:

bind-address=0.0.0.0

Por fim, reinicie o servidor MySql para pegar a nova configuração:

sudo service mysql restart

Tente novamente e verifique se a nova configuração foi selecionada.

iHaveacomputer
fonte
-2

mysql_update é o que você precisa.

Não sei por que alguém seguiria as formas mais complexas de corrigir esse problema, quando o MySql graciosamente construiu uma ferramenta que já faz isso ...

Kieran Foot
fonte