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?
fonte
host -t PTR 10.1.2.3
?Respostas:
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 .
fonte
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.
fonte
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.
fonte
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.
fonte