Alterando permissões de host para usuários MySQL


44

Tenho as seguintes concessões para um usuário / banco de dados

mysql> SHOW GRANTS FOR 'username'@'localhost';
+---------------------------------------------------------------------------+
| Grants for username@localhost                                             |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT ALL PRIVILEGES ON `userdb`.* TO 'username'@'localhost'              |
+---------------------------------------------------------------------------+

Para habilitar o acesso externo ao banco de dados, preciso alterar o host local para %. Uma maneira de fazer isso é REVOKEtodas as permissões e defini-lo novamente. O problema é que existe um conjunto de senhas que eu não conheço; portanto, se eu revogar a permissão, não será possível restaurá-lo.

Existe uma maneira de alterar o nome do host localhostpara %(e voltar novamente) sem revogar a própria permissão?

Respostas:


59

Se você tiver acesso ao mysqlbanco de dados, poderá alterar diretamente as tabelas de concessão:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

... e uma UPDATEdeclaração análoga para mudar de volta.

Também pode ser necessário fazer alterações na mysql.dbtabela:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';

Uma pequena correção (versão do mysql Server: 5.7.5-m15 - MySQL Community Server): tanto do phpmyadmin quanto do prompt de comando do mysql - UPDATE mysql. userSET Host= 'localhost' ONDE user. Host= '%' AND user. User= 'XXXdbusr';
— Jadeye 21/07

1
Para um banco de dados de produção, eu teria cuidado com%, pode ser um risco de segurança. Se você tiver vários servidores da Web, também poderá usar hosts com caracteres curinga, como '192.168.0.%' Ou ''% .example.com ''. Outra opção é adicionar o mesmo usuário várias vezes para cada host ou criar um usuário nomeado separadamente por servidor da web.
— 28417 okdowit

Se, como eu, tentei permitir acesso root em uma máquina de teste local (RasPi no meu caso), isso não funcionará desde o MySQL 5.7. Veja este tópico
— Raul Pinto

@RaulPinto: esse tópico parece ser sobre o phpMyAdmin, que não é totalmente relevante aqui, mas é bom notar para as pessoas que usam apenas isso.
— nickgrim

Melhor usar a declaração bem documentada RENAME USER
— Antonio Bardazzi 11/11/19

6

Melhor resposta no Stackoverflow, sugerindo usar RENAME USERquais cópias dos privilégios do usuário.

O uso da Data Control Language (declarações como GRANT, REVOKE, RENAME e assim por diante) não requer FLUSH PRIVILEGES;e é exigido em arquitetura como Galera ou Replicação de Grupo, onde as tabelas MyISAM não são replicadas.


2

Eu tropecei nessa também, e a solução proposta não funcionou, pois os privilégios específicos do banco de dados não seriam movidos também. o que eu fiz:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;


1

Para alterar privilégios, primeiro revogue toda a permissão para o usuário

 revoke all privileges on *.* from 'username'@'localhost';

 grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';

 flush privileges;

Esse é exatamente o meu problema, não posso revogar a permissão por causa da senha. Por favor, leia minha pergunta.
— Fu86

Você pode definir o hash da senha como igual ao antigo por meio de uma atualização. Você não precisa saber a senha real para fazer isso.
— Drogart 03/03

0

Faltam muitas tabelas se você tiver outros privilégios que não sejam simplesmente db (como tabelas ou colunas etc). Dependendo do que o usuário concede, talvez seja necessário atualizar todas essas tabelas ou algumas:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.tables_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.columns_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.procs_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.proxies_priv SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
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.