Como conceder permissões de acesso remoto ao servidor mysql para o usuário?

118

Se eu fizer SHOW GRANTSno meu banco de dados mysql, recebo

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' 
    IDENTIFIED BY PASSWORD 'some_characters' 
    WITH GRANT OPTION

Se não me engano, root@localhostsignifica que o usuário só rootpode acessar o servidor de localhost. Como digo ao MySQL para conceder rootpermissão para acessar este servidor mysql de todas as outras máquinas (na mesma rede) também?

Aufwind
fonte
6
A mudança simples localhostpara %concederá acesso root à rede pública. Não se esqueça deflush privileges;
6
Adicionar root @% expõe você a muitos riscos e não deve ser feito. Eu sei que este é um post antigo, mas esse aviso deveria estar aqui. A conta root é a primeira conta visada pelos invasores, e root @ '%' significa que o usuário root pode se conectar à sua conta MySQL de qualquer lugar que desejar. Há muito a ser abordado nos comentários, mas você deve tentar remover o máximo possível de usuários @ '%', e qualquer um que for declarado com isso deve ter privilégios muito limitados. Não importa o que aconteça, você definitivamente não deve adicionar root @ '%' e seus aplicativos também não devem esperar que essa conta esteja presente.
Damon
Consulte também Habilitar conexão MySQL remota
usuário
Olá pessoal, devemos remover a string PASSWORD desse comando ... está causando um erro ... basta finalizar com IDENTIFICADO POR e depois a própria senha.
Mário de Sá Vera

Respostas:

143

Isso concede acesso root com a mesma senha de qualquer máquina em *.example.com:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%.example.com' 
    IDENTIFIED BY 'some_characters' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;

Se a resolução de nomes não funcionar, você também pode conceder acesso por IP ou sub-rede:

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

GRANTDocumentos de sintaxe do MySQL .

Michael Berkowski
fonte
15
Presumo ...TO 'root'@'%' IDENTIFIED...que concederia acesso de qualquer lugar?
Aufwind
3
Executei o comando no mysql, mas SHOW GRANTSainda mostra o mesmo (como na minha pergunta). Eu até fiz FLUSH PRIVILGES. Há algo que eu sinto falta?
Aufwind
@Aufwind, eu não esperava que você precisasse de mais nada FLUSH PRIVILEGES. Saia e volte a entrar, reinicie o serviço mysqld se você tiver acesso. Além disso, certifique-se de que a skip networkinglinha não esteja habilitada em seu, my.cnfembora isso não explicaria o fato de você SHOW GRANTSainda não ser o mesmo.
Michael Berkowski
@Aufwind Caso contrário, você precisará perguntar em ServerFault.com.
Michael Berkowski
10
Observe que IDENTIFIED BY PASSWORDé acompanhado por um número hexadecimal de 41 dígitos com hash. Use IDENTIFIED BY 'password'se quiser incluir a senha diretamente.
Rainulf
94

Experimentar:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Pa55w0rd' WITH GRANT OPTION;
Moshe Beeri
fonte
1
umm o que Pa55w0rdparece estúpido, não me diga que essa é a senha que você deseja criar. Para todos que tentam fazer o login no seu mysql?
SSpoke de
23
É comumente usado para dar um espaço reservado para a senha, dizendo "coloque sua senha de leitura válida neste lugar".
moshe beeri de
2
Este comando com a advertência usual de que você só deseja usá-lo para aplicativos onde a segurança não é uma preocupação, por exemplo, dev ou QA.
einnocent de
se não estiver funcionando no mac, tente mudar 'root' @ '%' com 'root' @ 'localhost' ou / etc / hosts nome do computador ao qual você está concedendo privilégios.
moshe beeri de
2
Não se esqueça de executá-lo após:FLUSH PRIVILEGES;
dinamarquês de
44

Você precisa seguir alguns passos para se certificar de que primeiro o mysql e o usuário root estão acessíveis de fora:

  1. Desativar skip-networkingem my.cnf(ou seja /etc/mysql/my.cnf:)

  2. Verifique o valor de bind-addressin my.cnf, se estiver definido como 127.0.0.1, você pode alterá-lo 0.0.0.0para permitir o acesso de todos os IPs ou de qualquer ip a partir do qual você deseja se conectar.

  3. Conceda acesso remoto ao usuário root de qualquer ip (ou especifique seu ip em vez de %)

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
        IDENTIFIED BY 'your_root_password'
        WITH GRANT OPTION;
    FLUSH PRIVILEGES;`
  4. Reinicie o serviço mysql:

    sudo service mysql restart
Khashayar
fonte
Você também precisa abrir a porta 3306 do mysql do firewall, caso contrário os clientes remotos não se conectarão
David Okwii
Apenas um aviso rápido no ponto 2 de @Khashayar: 0.0.0.0 significa qualquer endereço IPv4. * significa QUALQUER endereço, seja IPv4 ou IPv6.
Gustavo Pinsard
34
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' 
    IDENTIFIED BY 'YOUR_PASS' 
    WITH GRANT OPTION;
FLUSH PRIVILEGES;  

*.* = DB.TABLE você pode restringir o usuário a um banco de dados específico e a uma tabela específica.

'root'@'%'você pode alterar o root com qualquer usuário que você criou e% é permitir todos os IPs. Você pode restringi-lo alterando% .168.1.1 etc. também.


Se isso não resolver, modifique também my.cnf ou my.ini e comente essas linhas

bind-address = 127.0.0.1para #bind-address = 127.0.0.1
e
skip-networkingpara#skip-networking

  • Reinicie o MySQL e repita as etapas acima novamente.

Raspberry Pi, encontrei a configuração de endereço de ligação em \etc\mysql\mariadb.conf.d\50-server.cnf

Wasim A.
fonte
2
Apenas a resposta que explica a parte *.*e 'user'@'address'. Obrigado! :)
Philipp
Conceder TUDO ativado . convida hackers a entrar.
Rick James
é por isso que expliquei *. *
Wasim A.
8

Essas concessões de SQL que os outros estão compartilhando funcionam. Se você ainda não conseguir acessar o banco de dados, é possível que você tenha apenas uma restrição de firewall para a porta. Depende do seu tipo de servidor (e de quaisquer roteadores entre eles) como abrir a conexão. Abra a porta TCP 3306 de entrada e dê a ela uma regra de acesso semelhante para máquinas externas (todos / sub-rede / IP único / etc.).

user171212
fonte
4

Abra o /etc/mysql/mysql.conf.d/mysqld.cnfarquivo e comente a seguinte linha:

#bind-address = 127.0.0.1
Vik2696
fonte
Trabalhando no Ubuntu 19.4
Ngô Văn Thao
3

No meu caso, eu estava tentando me conectar a um servidor mysql remoto no sistema operacional cent. Depois de passar por várias soluções (conceder todos os privilégios, remover ligações de IP, habilitar a rede), o problema ainda não estava sendo resolvido.

Como descobri, enquanto procurava por várias soluções, me deparei com o iptables, o que me fez perceber que a porta 3306 do mysql não estava aceitando conexões.

Aqui está uma pequena observação sobre como verifiquei e resolvi esse problema.

  • Verificando se a porta está aceitando conexões:
telnet (ip do servidor mysql) [portNo]

- Adicionando regra de tabela de ip para permitir conexões na porta:

iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACEITAR

-Não recomendamos isso para ambiente de produção, mas se seus iptables não estiverem configurados corretamente, adicionar as regras pode não resolver o problema. Nesse caso, deve ser feito o seguinte:

serviço iptables parar

Espero que isto ajude.

Kushal
fonte
3

Dois passos:

  1. configurar usuário com curinga:
    create user 'root'@'%' identified by 'some_characters'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD 'some_characters' WITH GRANT OPTION

  2. vim /etc/my.cnf
    adicione o seguinte:
    bind-address=0.0.0.0

reinicie o servidor, você não deverá ter nenhum problema para se conectar a ele.

studio1057
fonte
Seguindo, obtendo "ERROR 1827 (HY000): O hash da senha não tem o formato esperado. Verifique se o algoritmo de senha correto está sendo usado com a função PASSWORD ()." Você poderia explicar o que estou entendendo de errado aqui?
lampShadesDrifter
2

No mysql 8 e na versão posterior, você não pode adicionar um usuário concedendo privilégios. significa com esta consulta:

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

mysql retornará este erro:

ERROR 1064 (42000): você tem um erro na sintaxe do SQL; verifique o manual que corresponde à versão do seu servidor MySQL para a sintaxe correta para usar próximo a 'IDENTIFICADA POR' senha escrita 'na linha 1

isso significa que você não tem um usuário root para% domain. então você precisa primeiro inserir o usuário e depois conceder privilégios como este:

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'your password';
Query OK, 0 rows affected (0.11 sec)

mysql> GRANT ALL ON *.* TO 'root'@'%';
Query OK, 0 rows affected (0.15 sec)

mysql> FLUSH PRIVILEGES;

Não se esqueça de substituir as senhas por senhas específicas.

MhDG7
fonte
0

Isso funcionou para mim. Mas havia um problema estranho que até eu tentei primeiro, aqueles que não afetou. Eu atualizei a página do phpmyadmin e de alguma forma a fiz funcionar.

Se você precisar acessar local-xampp-mysql. Você pode ir para xampp-shell -> abrindo o prompt de comando.

Então mysql -uroot -p --port = 3306 ou mysql -uroot -p (se houver senha definida). Depois disso, você pode conceder esses acessos a partir da página do shell do mysql (também pode funcionar em localhost / phpmyadmin).

Basta adicioná-los se alguém encontrar este tópico e tiver problemas para iniciantes.

icemanzzz
fonte
0

Ubuntu 18.04

Instale e certifique-se de que o mysqld us esteja em execução.

Acesse o banco de dados e configure o usuário root:

sudo mysql -u root
SELECT User,Host FROM mysql.user;
DROP USER 'root'@'localhost';
CREATE USER 'root'@'%' IDENTIFIED BY 'obamathelongleggedmacdaddy';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
exit;

Edite as permissões do mysqld e reinicie:

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

# edit the line to be this:
bind-address=0.0.0.0

sudo systemctl stop mysql
sudo systemctl start mysql

De outra máquina, teste. A porta Obvs (3306) na máquina mysqld deve permitir a conexão da máquina de teste.

mysql -u root -p -h 123.456.789.666

Toda a "segurança" adicional do MySql não ajuda em nada a segurança, apenas complica e ofusca, agora é realmente mais fácil estragar tudo do que antigamente, onde você apenas usava uma senha muito longa.

Peter Prographo
fonte