¿Cómo determina mysql el nombre de host de sus clientes?

14

Estoy tratando de crear un usuario MySQL que solo podrá conectarse a la base de datos MySQL desde un nombre de host específico.

conceder todo en db_name. * a 'user_name'@'appserver-lan.mydomain.com' identificado por 'some_passwd'

Al verificar la tabla de usuario en mysql db, puedo ver que el usuario se creó con éxito:

usa mysql; seleccione * del usuario donde Usuario = 'nombre_usuario' y Host = 'appserver-lan.mydomain.com'

o

mostrar subvenciones para 'username'@'appserver-lan.mydomain.com'

El nombre de host que especifiqué es un alias para un nombre amazon-ec2, que cuando los servidores DNS de AWS resuelven da como resultado una dirección LAN:

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

appserver-lan.mydomain.com es un alias para ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com tiene la dirección 10.xxx .xxx.xxx

El problema es que cuando intento conectarme a la base de datos LAN IP de este servidor de aplicaciones, obtengo un error de acceso denegado, aunque la contraseña es correcta. Lo extraño aquí es que el nombre de host que se muestra en el error no es el nombre de host que había especificado cuando se creó el usuario:

ERROR 1045 (28000): acceso denegado para el usuario 'nombre_usuario' @ ' appserver.mydomain.com ' (usando la contraseña: SÍ)

Entonces, mi pregunta es: ¿cómo determina mysql el nombre de host del cliente? Creo que no lo hace mediante una búsqueda inversa de DNS, ya que verifiqué y no apunta a "appserver.mydomain.com" ni a "appserver-lan.mydomain.com". Además, el servidor db no tiene entradas relacionadas con el servidor de aplicaciones en / etc / hosts.

En resumen, estoy bastante seguro de que es un problema de resolución de nombre de host, ya que otorgar privilegios para el host "%" o para la LAN IP funciona bien.

¿Alguna idea de lo que me falta?

Luis Fernando Alen
fuente
¿Por qué crees que no es DNS inverso? ¿Qué pasa cuando lo haces host -t PTR 10.1.2.3?
Zoredache
host -t PTR 10.xxx.xxx.xxx xxx.xxx.xxx.10.in-addr.arpa puntero de nombre de dominio ip-10-xxx-xxx-xxx.ec2.internal. Como puede ver, este no es el nombre de host que se muestra en el mensaje de error (appserver.mydomain.com) y eso me hizo pensar que MySQL no estaba haciendo una búsqueda inversa.
Luis Fernando Alen

Respuestas:

13

Utiliza una búsqueda inversa de DNS. Toma la dirección IP del cliente y utiliza cualquier registro PTR que se devuelva para ese nombre.

En mi opinión, la autenticación basada en el nombre no es muy útil, le sugiero que considere usar direcciones IP.

Vea este documento sobre cómo Mysql usa DNS .

Zoredache
fuente
Gracias por el enlace, @Zoredache. Me gustaría evitar el uso de direcciones IP porque la interfaz interna de AWS usa DHCP y su IP cambia de vez en cuando (supongo que cada vez que se inicia el servidor), así como su registro PTR. Lo extraño aquí es que, dado que utiliza búsquedas inversas, debería decir "Acceso denegado para el usuario @ ip-10-xxx-xxx-xxx.ec2.internal". en lugar de appserver.mydomain.com ...
Luis Fernando Alen
1
¿Puede omitir la autenticación de IP / nombre por completo? En su lugar, use un firewall basado en host o configure la autenticación basada en SSL y Cert.
Zoredache
3

MySQL realizará una búsqueda inversa de DNS en la dirección IP para obtener el nombre del host. Si está ejecutando en AWS EC2, puede asignar una IP elástica a su servidor (esto no cuesta ningún extra) y luego pedirle a Amazon que configure un DNS inverso para que la IP elástica vaya a su nombre de host.

¿También está su servidor de base de datos también en EC2? Porque si es así, usará la dirección IP privada de la instancia, de lo contrario, usará la dirección IP pública. Se ve desde su publicación ya que su appserver-lan es la IP privada 10.XXX.XXX.XXX asignada a su servidor, no la putlic.

Sin embargo, no estoy seguro de qué dirección IP se usaría si me comunicara con una región diferente, ya que solo he tenido servidores dentro de la misma región.

Andy Hobbs
fuente
Sí, también está en EC2 y en la misma región. Gracias por el dato, Andy. No sabía que las instancias de EC2 usan la IP interna para comunicarse entre ellas, incluso si especifica la IP válida para la comunicación. Eso resolvió mi problema =]
Luis Fernando Alen
3

Acabo de tener un problema similar, donde el servidor mysql parecía estar haciendo búsquedas inversas de DNS incorrectamente.

El problema que tuve fue que el servidor tenía permisos para 'user'@'1.2.3.4', así como para 'user'@'reverse.dns'. El usuario con solo la dirección IP tenía permisos mínimos, pero el servidor mysql estaba usando los permisos de ese usuario en lugar del que tenía el nombre de host, y devolvía el mensaje "Acceso denegado para el usuario 'usuario'@'1.2.3.4'". La eliminación del usuario con la dirección IP solucionó el problema y obligó al seridor a usar al otro usuario en el nombre de host.

Andy Beverley
fuente
0

También he visto problemas en los que los nombres de host IPV4 e IPV6 y las direcciones IP no coinciden, y donde solo se usa un nombre de host para el permiso del usuario. Por ejemplo, donde hay un DNS inverso de IPV6 pero no un DNS de IPV6 directo.

Andy Beverley
fuente