Como o mysql determina o nome do host de seus clientes?

14

Estou tentando criar um usuário MySQL que só poderá se conectar ao banco de dados MySQL a partir de um nome de host específico.

conceda tudo no db_name. * para 'user_name'@'appserver-lan.mydomain.com' identificado por 'some_passwd'

Ao verificar a tabela de usuário no banco de dados mysql, posso ver que o usuário foi criado com sucesso:

use mysql; selecione * do usuário em que Usuário = 'nome_do_usuário' e Host = 'appserver-lan.mydomain.com'

ou

mostre concessões para 'nomedeusuário'@'appserver-lan.mydomain.com'

O nome do host que eu especifiquei é um alias para um nome amazon-ec2, que quando resolvido pelos servidores DNS da AWS resulta em um endereço LAN:

[root @ db_server ~] # host appserver-lan.mydomain.com

appserver-lan.mydomain.com é um alias para ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com tem o endereço 10.xxx .xxx.xxx

O problema é que, quando tento conectar-me ao IP da LAN do banco de dados desse appserver-lan, recebo um erro de acesso negado, embora a senha esteja correta. O estranho aqui é que o nome do host mostrado no erro não é o nome do host que eu havia especificado quando o usuário foi criado:

ERRO 1045 (28000): acesso negado para o usuário 'user_name' @ ' appserver.mydomain.com ' (usando a senha: YES)

Então, minha pergunta é: como o mysql determina o nome do host do cliente? Acredito que isso não seja feito através de uma pesquisa reversa de DNS, pois verifiquei e não aponta para "appserver.mydomain.com" nem para "appserver-lan.mydomain.com". Além disso, o servidor db não possui entradas relacionadas ao appserver em / etc / hosts.

Resumindo, tenho certeza de que é um problema de resolução de nome de host, pois conceder privilégios para o host "%" ou para o IP da LAN funciona perfeitamente.

Alguma idéia do que estou perdendo?

Luis Fernando Alen
fonte
Por que você acha que não é DNS reverso? O que acontece quando você faz host -t PTR 10.1.2.3?
#
host -t PTR 10.xxx.xxx.xxx xxx.xxx.xxx.10.in-addr.arpa ponteiro de nome de domínio ip-10-xxx-xxx-xxx.ec2.internal. Como você pode ver, esse não é o nome do host exibido na mensagem de erro (appserver.mydomain.com) e isso me fez pensar que o MySQL não estava fazendo uma pesquisa inversa.
Luis Fernando Alen

Respostas:

13

Ele usa uma pesquisa DNS reversa. Ele pega o endereço IP do cliente e usa qualquer registro PTR retornado para esse nome.

Na minha opinião, fazer autenticação com base no nome não é muito útil, sugiro que você considere o uso de endereços IP.

Veja este documento sobre como Mysql usa DNS .

Zoredache
fonte
Obrigado pelo link, @Zoredache. Eu gostaria de evitar o uso de endereços IP, porque a interface interna da AWS usa DHCP e seu IP muda de tempos em tempos (sempre que o servidor inicializar, eu acho), bem como seu registro PTR. O estranho aqui é que, como ele usa pesquisas inversas, deveria dizer "Acesso negado para o usuário @ ip-10-xxx-xxx-xxx.ec2.internal". em vez de appserver.mydomain.com ...
Luis Fernando Alen
1
Você pode pular a autenticação IP / nome por completo, em vez disso, use um firewall baseado em host ou configure a autenticação baseada em SSL e Cert.
precisa
3

O MySQL fará uma pesquisa inversa de DNS no endereço IP para obter o nome do host. Se você estiver executando no AWS EC2, poderá atribuir um IP elástico ao seu servidor (isso não custa nenhum extra) e pedir à amazon que configure o DNS reverso para que o IP elástico vá para o seu nome de host.

O seu servidor de banco de dados também está no EC2? Porque, nesse caso, usará o endereço IP privado da instância, caso contrário, usará o endereço IP público. Parece que você postou como tu appserver-lan é o ip privado 10.XXX.XXX.XXX atribuído ao seu servidor, e não o endereço virtual.

Não tenho certeza de qual endereço IP seria usado se eu estivesse se comunicando com uma região diferente, pois eu só tinha servidores na mesma região.

Andy Hobbs
fonte
Sim, também está no EC2 e na mesma região. Obrigado pela dica, Andy. Eu não sabia que as instâncias do EC2 usam o ip interno para se comunicar entre eles, mesmo se você especificar o ip válido para a comunicação. Isso resolveu o meu problema =]
Luis Fernando Alen
3

Acabei de ter um problema semelhante, onde o servidor mysql parecia estar fazendo pesquisas inversas de DNS incorretamente.

O problema que tive foi que o servidor tinha permissões para 'user'@'1.2.3.4' e também para 'user'@'reverse.dns'. O usuário com apenas o endereço IP tinha permissões mínimas, mas o servidor mysql estava usando as permissões desse usuário em vez daquela com o nome do host e retornando a mensagem "Acesso negado para o usuário 'user'@'1.2.3.4'". A exclusão do usuário com o endereço IP corrigiu o problema e forçou o seridor a usar o outro usuário no nome do host.

Andy Beverley
fonte
0

Também vi problemas em que os nomes de host e endereços IP IPV4 e IPV6 não correspondem e onde apenas um nome de host é usado para a permissão do usuário. Por exemplo, onde há um DNS reverso IPV6, mas nenhum DNS IPV6 encaminhado.

Andy Beverley
fonte