Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Acesso negado para usuário 'test'@'ip'(usando senha:YES)


"Acesso negado para o usuário 'test'@'ip'(usando senha:YES)" é um erro do MySQL.

Isso significa que no nível da rede tudo está funcionando , porque ter acesso negado como um determinado usuário , o servidor deve ter entendido com qual usuário você estava tentando se conectar . Portanto, rede, firewall, roteamento e assim por diante, todos devem estar funcionando; o servidor deve estar escutando, etc.

O problema está "simplesmente" na autenticação .

Tente conectar localmente ao banco de dados (para substituir a autenticação) e inspecione a tabela de privilégios:
USE mysql;
SELECT User, Host, Password from user WHERE User = 'test';

e lembre-se de que a linha em que você está interessado é a que menciona o IP (já que a mensagem de erro especifica o IP , e não o nome do host - nesse caso, pode ter sido um problema de DNS; o nome do host é o nome do host que o servidor acredita que você está vindo , não o nome do host de onde você está realmente vindo).

A correspondência usuário/host vai de mais específico para menos específico . Então, se você já teve:
user      host     password
test      1.2.3.4  foo

e correu,
GRANT... TO [email protected]'%' ... PASSWORD bar

...esta doação funcionaria em qualquer lugar exceto 1.2.3.4, onde a senha permaneceria 'foo'.

Do manual (link acima):

Você pode ser forçado a fazer
USE mysql;
DELETE FROM user WHERE User = 'test';
GRANT ALL PRIVILEGES ON database.* TO 'test'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

para garantir que não haja linhas espúrias na tabela de concessão referindo-se ao 'teste' do usuário.

(Além disso, o GRANT deve ser, eu acho,
GRANT ALL PRIVILEGES ON databasename.*

)

Dúvida de segurança (não relacionada à resposta)


O manual acima diz:A especificidade de um endereço IP literal não é afetada pelo fato de ele ter uma máscara de rede, então 192.168.1.13 e 192.168.1.0/255.255.255.0 são considerados igualmente específicos .

Agora, à primeira vista 127.0.0.1/0.0.0.0 parece muito específico (e inofensivo) para localhost . A máscara de rede, se não me engano, garante que seja equivalente a % , exceto que é incrivelmente específico e será executado primeiro . Portanto
test     bar         %           
test     localfoo    127.0.0.1/0.0.0.0

significa que a senha para test de qualquer lugar não é "bar", mas é "localfoo".

Ninguém inseriria tal concessão por engano, mas há engano e erro .