Acesso ao MySQL negado erro ao conectar via túnel SSH

12

Por meses, estive me conectando à instância do MySQL em execução no nosso servidor de teste local através de um túnel SSH sem problemas. De repente, porém, sem alterações que eu possa pensar, o servidor começou a rejeitar a tentativa de logon do Sequel Pro com o erro:

Não foi possível conectar ao host 127.0.0.1 porque o acesso foi negado.

Verifique seu nome de usuário e senha e verifique se o acesso a partir da sua localização atual é permitido.

O MySQL disse: Acesso negado para o usuário 'root' @ 'localhost' (usando a senha: YES)

Consigo efetuar login no terminal quando conectado diretamente ao servidor por SSH, mas não por um túnel SSH. O problema não é específico para o Sequel Pro ou apenas para mim, recebo o mesmo erro ao conectar-me através do MySQL Workbench, assim como outros no escritório. Redefini a senha mysqladminapenas por uma questão de sanidade, esse definitivamente não é o problema.

Quando comecei a investigar mais, notei que o erro estava relatando o servidor como "localhost", em vez de "127.0.0.1", que eu inseri no Sequel Pro. Um amigo sugeriu que provavelmente é apenas um tratamento incorreto de erros, mas parece estranho, dada a diferença significativa entre localhost e 127.0.0.1 no MySQL.

Em uma tentativa de contornar o problema de encapsulamento, concedi acesso ao root @%, para que eu possa me conectar diretamente. Isso funciona na maior parte do tempo, eu posso ver os dados da tabela, criar novos bancos de dados, etc. O único problema é quando eu for criar usuários e recebo o erro:

Acesso negado para o usuário 'root' @ '%' (usando a senha: YES)

Estranhamente, o usuário é realmente criado, acho que é apenas um problema de concessão. Mais uma vez, no terminal, eu posso fazer qualquer coisa quando estiver logado como root.

Alguém pode ajudar a esclarecer por que as conexões de túnel e (provavelmente) os comandos de concessão estão recebendo o erro de acesso negado?

Para referência, o MySQ é a versão 5.6.16, com a maioria das configurações padrão, instaladas via Homebrew em uma máquina com MAC OS X Server.

Atualizar

Aqui está a lista de hosts aos quais o root atualmente tem acesso:

mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host           | user |
+----------------+------+
| %              | root |
| 127.0.0.1      | root |
| ::1            | root |
| localhost      | root |
+----------------+------+
4 rows in set (0.00 sec)

Pelo que entendi, a primeira linha ("%") deve realmente tornar as outras redundantes?

Atualização 2

Corrigido o problema de concessão; o usuário root @% não recebeu todos os privilégios com o extra with grant optionno final; portanto, ele pode fazer tudo, exceto conceder. Ainda gostaria de saber por que os túneis SSH estão sendo negados.

Adão
fonte
então, antes de criar a conta "%", você fez o "127.0.0.1" e o "localhost" e ambos não funcionaram, está correto?
Sverre 21/07
localhost só funciona se você estiver realmente no host certo; portanto, em teoria, apenas 127.0.0.1 (a rede equivalente ao localhost) deve funcionar em um túnel ssh. no unix como sistemas operacionais, pelo menos.
Sverre 21/07

Respostas:

18

No MySQL, a localhostpalavra-chave é reservada para conexão usando o soquete MySQL e você deve usar o endereço IP 127.0.0.1para conexões TCP à porta de rede MySQL em 127.0.0.1. Isso significa que tanto o servidor deve conceder privilégios para usuários especificamente 127.0.0.1, e o cliente deve usar -h 127.0.0.1para atravessar o túnel em vez de ligar a um socket local.

Para permitir o acesso usando o encaminhamento de porta SSH, você precisa de algo como:

GRANT SELECT ON *.* TO user@`127.0.0.1`

e depois corra

FLUSH PRIVILEGES;

e possivelmente

FLUSH QUERY CACHE;

Se ainda não funcionar, reinicie o processo do servidor.

Nas mensagens de erro 127.0.0.1 após uma pesquisa DNS reversa, é traduzida para localhostdificultar a depuração.

Como o manual descreve:

No Unix, os programas MySQL tratam o nome do host localhost especialmente, de uma maneira que provavelmente é diferente do que você espera em comparação com outros programas baseados em rede. Para conexões com o host local, os programas MySQL tentam se conectar ao servidor local usando um arquivo de soquete Unix. Isso ocorre mesmo se uma opção - -portou -Pfor fornecida para especificar um número de porta. Para garantir que o cliente faça uma conexão TCP / IP com o servidor local, use --hostou -hpara especificar um valor de nome de host 127.0.0.1ou o endereço IP ou o nome do servidor local. Você também pode especificar o protocolo de conexão explicitamente, mesmo para o host local, usando a --protocol=TCPopção Por exemplo:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

A --protocolopção permite que você estabeleça um tipo específico de conexão, mesmo quando as outras opções normalmente seriam padronizadas para algum outro protocolo.

HBruijn
fonte
2
Ah! Isso explica por que estou vendo o host local na mensagem de erro quando esperava ver 127.0.0.1. No entanto, o usuário root recebeu todos os privilégios @ 127.0.0.1, mas ainda recebo o erro de acesso negado ao conectar-me através de um túnel SSH. A declaração exata que corri é:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Adam
Estou tendo esse problema e é claro que esse é realmente o problema do host vs soquete. Quando digito ssh -h 127.0.0.1 -u root -premotamente no servidor, a conexão também é rejeitada.
fuzzyTew
Resolvi as -h 127.0.0.1conexões de falha no servidor de reiniciar mysql, mas a tomada de ssh ainda não vai funcionar
fuzzyTew
Aqui vamos nós. 1. O servidor deve conceder a @ 127.0.0.1. Isso não levou para mim até que eu reiniciei o servidor. 2. A conexão local deve ser 127.0.0.1 e não localhost, para que o túnel seja usado em vez de um soquete local.
fuzzyTew
1

Eu já vi no passado com tels ssh, que existe uma diferença entre Conceder tudo para "localhost" e conceder tudo para "127.0.0.1", portanto, tente conceder para "127.0.0.1 em vez disso ou em adição à sua concessão" localhost ".

Sverre
fonte
ou oposto, no seu caso parece que
Sverre
Obrigado, atualizei a questão para incluir uma lista de hosts nos quais a raiz é concedida. Achei estranho que, apesar de digitar "127.0.0.1" como servidor MySQL no Sequel Pro, o erro do MySQL o reportasse como "localhost". Eu não acho que esse seja o problema.
Adam
você tem senhas para todos os diferentes usuários? Além disso, quando você se conecta ao mysql pelo túnel, qual é a sintaxe real que você usa?
Sverre 21/07
existem restrições no usuário root na sua configuração mysql?
Sverre 21/07
Apenas execute novamente as grantinstruções com identified by ..para garantir que todas as senhas raiz sejam iguais, mas sem alegria.
Adam
0

Em vez de usar o Sequel para criar o túnel, o que você mesmo criou?

ssh -Cc blowfish -Nf -vv -L3306: localhost: 3306 sshuser @ domain

Em seguida, conecte-se ao Sequel para 127.0.0.1:3306 Você pode se conectar? Aparece alguma coisa no seu terminal (ou nos logs do cliente ssh)?

Florian Bidabe
fonte