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?

Fu86
fonte

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';
nickgrim
fonte
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.

Antonio Bardazzi
fonte
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;
Roman Haefeli
fonte
E "funcionou"?
precisa saber é o seguinte
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;
Abhishek Anand Amralkar
fonte
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;
mikew
fonte