Erro de acesso do MySQL negado ao conectar via túnel SSH

8

Durante meses, conectei-me à instância do MySQL em execução no nosso servidor de teste local por meio de um túnel SSH sem nenhum problema. De repente, porém, sem mudanças que eu possa pensar, o servidor começou a rejeitar a tentativa de login do Sequel Pro com o erro:

Unable to connect to host 127.0.0.1 because access was denied.

Double-check your username and password and ensure that access from your current location is permitted.

MySQL said: Access denied for user 'root'@'localhost' (using password: YES)

Consigo efetuar login a partir do terminal quando conectado diretamente ao servidor por meio do SSH, mas não através de um túnel SSH. O problema não é específico para o Sequel Pro ou apenas para mim mesmo, eu recebo o mesmo erro ao conectar-me através do MySQL Workbench do que outros no escritório. Eu restaurei a senha com mysqladmin apenas por causa da sanidade, isso definitivamente não é o problema.

Quando comecei a investigar mais, notei que o erro estava reportando o servidor como "localhost", em vez de "127.0.0.1", que 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, eu posso ver os dados da tabela, criar novos bancos de dados, etc. O único problema é quando eu venho para criar usuários eu recebo o erro:

Access denied for user 'root'@'%' (using password: YES)

Estranhamente, o usuário é realmente criado, acho que é apenas um problema com o grant. Novamente, no terminal eu posso fazer qualquer coisa quando logado como root.

Alguém pode ajudar a esclarecer por que as conexões de encapsulamento e (provavelmente) os comandos grant 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 o Mac OS X Server.

Atualizar

Veja 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 os outros redundantes?

Atualização 2

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

    
por Adam 21.07.2014 / 10:41

3 respostas

15

No MySQL, a palavra-chave localhost é reservada para conexão usando o soquete MySQL e você deve usar o endereço IP 127.0.0.1 para conexões TCP com a porta de rede MySQL em 127.0.0.1. Isso significa que o servidor deve conceder privilégios aos usuários especificamente de 127.0.0.1 , e o cliente deve usar -h 127.0.0.1 para percorrer o encapsulamento em vez de se conectar a um soquete local.

Para permitir o acesso por meio do encaminhamento de porta SSH, você precisa de algo como:

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

e, em seguida, execute

FLUSH PRIVILEGES;

e possivelmente

FLUSH QUERY CACHE;

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

Nas mensagens de erro 127.0.0.1, depois que uma pesquisa de DNS reversa é convertida em localhost , tornando a depuração difícil.

Como o manual descreve:

On Unix, MySQL programs treat the host name localhost specially, in a way that is likely different from what you expect compared to other network-based programs. For connections to localhost, MySQL programs attempt to connect to the local server by using a Unix socket file. This occurs even if a --port or -P option is given to specify a port number. To ensure that the client makes a TCP/IP connection to the local server, use --host or -h to specify a host name value of 127.0.0.1, or the IP address or name of the local server. You can also specify the connection protocol explicitly, even for localhost, by using the --protocol=TCP option. For example:

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

The --protocol option enables you to establish a particular type of connection even when the other options would normally default to some other protocol.

    
por 21.07.2014 / 11:30
1

Eu já vi no passado com ssh tunels, que há uma diferença entre Conceder tudo para "localhost" e conceder tudo para "127.0.0.1", então tente conceder a "127.0.0.1 em vez ou em adição ao seu" localhost "concessão.

    
por 21.07.2014 / 10:54
0

Em vez de usar o Sequel para criar o túnel, você cria o túnel?

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

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

    
por 06.08.2014 / 15:36