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?
fuente
host -t PTR 10.1.2.3
?Respuestas:
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 .
fuente
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.
fuente
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.
fuente
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.
fuente