conceder acesso remoto ao banco de dados MySQL a partir de qualquer endereço IP


280

Estou ciente deste comando:

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

Mas só me permite conceder um endereço IP específico para acessar esse banco de dados MySQL remoto. E se eu quiser, para que qualquer host remoto possa acessar esse banco de dados MySQL? Como faço isso? Basicamente, estou tornando esse banco de dados público para que todos possam acessá-lo.


1
Antes de fazer isso, considere as implicações de segurança
e18r

7
nem todo sistema é um sistema de produção. algumas pessoas precisam disso para o desenvolvimento.
Conrad Jones

Respostas:


272
TO 'user'@'%'

% é um curinga - você também pode fazer '%.domain.com'ou '%.123.123.123'e coisas assim, se precisar.


@ Kristopolous Há muitas coisas que podem causar isso. Este comando é sobre acesso remoto (duas máquinas diferentes). Se não é isso que você está fazendo, esse não é o comando certo. Você ainda precisa de uma senha correta e outras coisas.
Ariel #

11
Você precisa usar "privilégios de liberação"; para que as alterações entrem em vigor
Didier Sampaolo 19/11/2015

O truque ao conectar-se a uma instância db em execução na mesma instância do SO (por exemplo, sua máquina de desenvolvimento), é passar o -h my_machine_nameparâmetro Isso engana o cliente para identificá-lo como 'user'@my_machine_name.example.com, e não 'user'@localhost. Dessa forma, você não precisa criar e manter contas e concessões duplas para localhostacesso a ambos e à rede. E, claro, não se esqueça mysqldé obrigado a 0.0.0.0vs. 127.0.0.1.
Charlie Reitzel

173

Ativar acesso remoto (Grant) Início / Tutoriais / Mysql / Ativar acesso remoto (Grant) Se você tentar se conectar ao servidor mysql a partir de uma máquina remota, e encontrar um erro como o descrito abaixo, este artigo é para você.

ERRO 1130 (HY000): O host '1.2.3.4' não tem permissão para se conectar a este servidor MySQL

Alterar configuração do mysql

Comece com a edição do arquivo de configuração do mysql

vim /etc/mysql/my.cnf

Comente as seguintes linhas.

#bind-address           = 127.0.0.1
#skip-networking

Se você não encontrar a linha de ignorar rede, adicione-a e comente-a.

Reinicie o servidor mysql.

~ /etc/init.d/mysql restart

Alterar privilégio GRANT

Você pode se surpreender ao ver, mesmo após as alterações acima, que você não está obtendo acesso remoto ou acesso, mas não é capaz de todos os bancos de dados.

Por padrão, o nome de usuário e a senha do mysql que você está usando têm permissão para acessar o servidor mysql localmente. Então, precisa atualizar privilégios.

Execute um comando como abaixo para acessar de todas as máquinas. (Substitua USERNAMEe PASSWORDpor suas credenciais.)

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

Execute um comando como abaixo para dar acesso a um IP específico. (Substitua USERNAMEe PASSWORDpor suas credenciais.)

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

Você pode substituir o 1.2.3.4 pelo seu IP. Você pode executar o comando acima várias vezes para conceder acesso a partir de vários IPs.

Você também pode especificar um USERNAME&PASSWORD para acesso remoto.

Você pode verificar o resultado final:

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

Por fim, também pode ser necessário executar:

mysql> FLUSH PRIVILEGES;

Conexão de teste

Do terminal / linha de comando:

mysql -h HOST -u USERNAME -pPASSWORD

Se você obtiver um shell mysql, não se esqueça de executar os bancos de dados show; para verificar se você possui privilégios corretos em máquinas remotas.

Dica de bônus: revogar acesso

Se você acidentalmente conceder acesso a um usuário, é melhor ter a opção de revogação à mão.

A seguir, revogará todas as opções para USERNAME de todas as 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.

Se você vir o privilégio USAGE após executar o comando REVOKE, tudo bem. É tão bom quanto nenhum privilégio. Não tenho certeza se pode ser revogado.


7
Observe que eu tive que alterar o /etc/mysql/mysql.conf.d/mysqld.cnfarquivo em vez de /etc/mysql/my.cnfcomentar a bind-addressparte. A #skip-networkinglinha está ausente e não deve haver efeito de adicionar e comentar a linha.
Pawan

1
No MariaDB 10.1.26, o arquivo de configuração é/etc/mysql/mariadb.conf.d/50-server.cnf
Kwadz

Se você fez tudo o que precede e ainda não conseguiu se conectar, verifique as configurações do firewall, pode estar bloqueando a porta 3306ou a porta que você configurou
18/03/19

37

Assumindo que a etapa acima foi concluída e a porta 3306 do MySql esteja livre para ser acessada remotamente; Não se esqueça de vincular o endereço IP público no arquivo de configuração do mysql.

Por exemplo, no meu servidor ubuntu:

#nano /etc/mysql/my.cnf

No arquivo, procure o bloco de seção [mysqld] e adicione o novo endereço de ligação, neste exemplo é 192.168.0.116. Seria algo como isto

......    
.....    
# 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

.....    
......

você pode remover a ligação localhost (127.0.0.1) se desejar, mas precisará fornecer um endereço IP especificamente para acessar o servidor na máquina local.

Então o último passo é reiniciar o servidor MySql (no ubuntu)

stop mysql

start mysql

ou #/etc/init.d/mysql restartpara outros sistemas

Agora, o banco de dados MySQL pode ser acessado remotamente por:

mysql -u username -h 192.168.0.116 -p

/etc/init.d/mysql reloaddeveria bastar #
Lorenz Lo Sauer

Acabei de fazer isso e não consegui me conectar ao servidor mysql remotamente. Tentei comentar os endereços de ligação e funcionou. Eu também tentei fazer login no servidor com o mysql -u <usuário> -p sem especificar o host e funcionou; portanto, parece que "você pode remover a ligação localhost (127.0.0.1) se quiser, mas precisará especificamente forneça um endereço IP para acessar o servidor na máquina local ". não está correto. (ubuntu 12.04 LTS mysql servidor Ver 14,14 Distrib 5.5.34)
Programster

5
A bind-addressdiretiva determina o endereço IP em que o servidor mysql escuta; não os endereços IP dos quais o servidor aceita conexões.
GoZoner

1
Depois de seguir cada passo, não funciona. Eu recebo um erro ao comentar bind-addresso localhost ou o endereço remotehost. mysql.serviceJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
220017 baermathias

É possível fornecer um endereço como abc.abc:1234 em vez de 192.168.0.116?
bielas

26

Para quem se atrapalhou com isso, aqui está como consegui conceder os privilégios, espero que ajude alguém

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

Como observado, %é um curinga e isso permitirá que qualquer endereço IP se conecte ao seu banco de dados. A suposição que faço aqui é que, quando você se conectar, terá um usuário chamado root(que é o padrão). Alimente a senha root e você estará pronto. Observe que não tenho aspas simples ( ') ao redor da raiz do usuário.


Por que é importante remover as aspas simples do usuário? Por que isso difere de outras respostas (e do manual)?
DMCoding 31/10/16

26

As alterações no arquivo de configuração são necessárias para ativar as conexões via host local.

Para conectar-se através de IPs remotos, entre como um usuário "root" e execute as consultas abaixo no 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;

Isso criará um novo usuário acessível no host local e também nos IPs remotos.

Comente também a linha abaixo do seu arquivo my.cnf localizado em /etc/mysql/my.cnf

bind-address = 127.0.0.1

Reinicie seu mysql usando

sudo service mysql restart

Agora você deve conseguir se conectar remotamente ao seu mysql.


2
Isso não responde à pergunta.
charris

1
@ChristopheHarris, por que você se sente assim? A resposta fornece instruções passo a passo sobre como criar um novo usuário no MySQL que permita tanto o host local quanto o acesso remoto ao banco de dados usando esse usuário. Você pode explicar?
harishannam

1
Não funciona para mim. Ainda tem o mesmo erro. Não importa se eu o testo com root ou com um novo usuário: Não é possível conectar-se ao servidor MySQL em 'xxx.xxx.xxx.xxx' ([Errno 61] Conexão recusada) '
baermathias

21

Use este comando:

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

Então:

FLUSH PRIVILEGES; 

Em seguida, comente a linha abaixo no arquivo "/etc/mysql/mysql.conf.d/mysqld.cnf" (é necessário!):

bind-address = 127.0.0.1 

Funciona para mim!


Muito bom. Importante a concessão. Caso contrário, muitos erros para solicitações como #your-password-does-not-satisfy-the-current-policy-requirements
Alejandro Teixeira Muñoz

21

Para poder se conectar com seu usuário a partir de qualquer endereço IP, faça o seguinte:

Permita que o servidor mysql aceite conexões remotas. Para este arquivo mysqld.conf aberto:

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

Procure a linha que começa com "endereço de ligação" e defina seu valor como 0.0.0.0

bind-address                    = 0.0.0.0

e, finalmente, salve o arquivo.

Nota: Se você estiver executando o MySQL 8+, a bind-addressdiretiva não estará no mysqld.cnfarquivo por padrão. Nesse caso, adicione a diretiva na parte inferior do arquivo /etc/mysql/mysql.conf.d/mysqld.cnf.

Agora reinicie o servidor mysql, com systemdou use o servicecomando mais antigo . Isso depende do seu sistema operacional:

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

Finalmente, o servidor mysql agora pode aceitar conexões remotas.

Agora precisamos criar um usuário e conceder permissão, para que possamos logar com esse usuário remotamente.

Conecte-se ao banco de dados MySQL como root ou qualquer outro usuário com privilégio de root.

mysql -u root -p

agora crie o usuário desejado no localhost e no curinga '%' e conceda permissões em todos os bancos de dados como tal.

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

Então,

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

E, finalmente, não se esqueça de liberar privilégios

FLUSH PRIVILEGES;

Nota: Se você configurou um firewall no servidor de banco de dados, também será necessário abrir a porta 3306padrão do MySQL para permitir o tráfego no MySQL.

Espero que isto ajude ;)


2
sudo systemctl restart mysqld.service é para debian, eu tive que usar o sudo systemctl restart mysql.service é para ubuntu
ani0904071

Atualizei minha resposta e adicionei o comando mysql restart para ambas as distros. Obrigado @ ani0904071
Imtiaz Shakil Siddique

17

Execute o seguinte:

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

Em seguida, tente uma conexão a partir do endereço IP especificado:

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

Você deve conseguir se conectar.




7

Para acessar remotamente o servidor Mysql do banco de dados 8:

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

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

FLUSH PRIVILEGES;

5
  • INICIE MYSQL usando o usuário administrador
    • mysql -u admin-user -p (ENTRAR SENHA NO PROMPT)
  • Crie um novo usuário:
    • CRIAR USUÁRIO 'newuser' @ '%' IDENTIFICADO POR 'senha'; (% -> qualquer host)
  • Conceder privilégios:
    • GRANT SELECT, DELETE, INSERT, UPDATE ON db_name. * TO 'newuser' @ '%';
    • PRIVILÉGIOS DE LAVAGEM;

Se você estiver executando a instância do EC2, não se esqueça de adicionar as regras de entrada no grupo de segurança com o MYSQL / Aurura.


5

Editar arquivo:

/etc/mysql/percona-server.cnf

Anexe o código abaixo no arquivo.

[mysqld] bind-address = 0.0.0.0

Crie usuário para acesso remoto.

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

Todo servidor linux funciona,

Para MSWin c: \ Localizar local de localização \ caminho do arquivo


[mysqld] necessidade de adicionar no arquivo, o resto não funciona corretamente
Tejas tanque

3

Basta criar o usuário para algum banco de dados como

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

Então vá para

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnfe mude a linha bind-address = 127.0.0.1parabind-address = 0.0.0.0

Depois disso, você pode se conectar a esse banco de dados a partir de qualquer IP.


3

Abra o seu mysql consolee execute o seguinte comando (digite o nome do banco de dados, nome de usuário e senha):

CONCEDE TUDO EM seu nome de banco de dados. * PARA admin @ '%' IDENTIFICADO POR 'yourRootPassword';

Em seguida, execute:

PRIVILÉGIOS DE LAVAGEM;

Abra a linha de comando e abra o arquivo /etc/mysql/mysql.conf.d/mysqld.cnfusando qualquer editor com root privileges.

Por exemplo:

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

Em seguida, comente a linha abaixo:

endereço de ligação = 127.0.0.1

Reinicie o mysql para refletir as alterações usando o comando:

sudo service mysql restart

Aproveitar ;)


2

Você precisa alterar o arquivo de configuração do mysql:

Comece com a edição do arquivo de configuração do mysql

vim /etc/mysql/my.cnf

adicionar:

bind-address = 0.0.0.0

0

Nos painéis de sites como o cPanel, você pode adicionar um único %(sinal de porcentagem) nos nomes de host permitidos para acessar seu banco de dados MySQL.

Ao adicionar um único, %você pode acessar seu banco de dados a partir de qualquer IP ou site, mesmo a partir de aplicativos de desktop.


por favor, não se referem a uma coisa como cPanel quando uma consulta em linha reta é apresentada, isso nunca irá mostrar um resultado de trabalho para mais ninguém
Tobias Hagenbeek

@TobiasHagenbeek Obrigado pelo seu feedback. Este método / truque não foi inventado por mim (é comum na internet). Mas sou um dos testadores desse método e achei que é o método mais fácil e prático, por isso o publiquei aqui. Eu sei que existem alguns riscos de segurança nesse método que podem ser negligenciados.
Muhammad Saqib

0

Por exemplo, no meu CentOS

sudo gedit /etc/mysql/my.cnf

comente as seguintes linhas

# bind-address = 127.0.0.1

então

serviço sudo mysqld restart


0

Se você deseja conceder acesso remoto ao seu banco de dados a partir de qualquer endereço IP, execute o comando mysql e depois execute o seguinte comando.

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

0

o que funcionou no Ubuntu está concedendo todos os privilégios ao usuário:

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

e definindo o endereço de ligação em /etc/mysql/mysql.conf.d/mysqld.cnf:

bind-address            = 0.0.0.0

reiniciando o daemon mysql:

service mysql restart

-7

Você pode desativar toda a segurança editando /etc/my.cnf:

skip-grant-tables

isso remove todos os requisitos de senha
kristopolous

5
Observe que não é aconselhável ter essa opção ativada em um ambiente de produção, pois isso permite que qualquer pessoa se conecte sem uma senha!
AStopher

no entanto, isso é ideal para um ambiente de desenvolvimento #
DMCoding 31/10

Isso permite que as pessoas invadam seu banco de dados sem usar uma senha.
MilkyWay90

@DanielJames mesmo para ambiente de desenvolvimento é uma idéia terrível
Dragas
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.