Comment mysql détermine-t-il le nom d'hôte de ses clients?


14

J'essaie de créer un utilisateur MySQL qui ne sera autorisé à se connecter à la base de données MySQL qu'à partir d'un nom d'hôte spécifique.

accorder tout sur db_name. * à 'user_name'@'appserver-lan.mydomain.com' identifié par 'some_passwd'

En vérifiant la table des utilisateurs sur la base de données mysql, je peux voir que l'utilisateur a été créé avec succès:

utiliser mysql; sélectionnez * de l'utilisateur où User = 'nom_utilisateur' et Host = 'appserver-lan.mydomain.com'

ou

afficher les subventions pour 'username'@'appserver-lan.mydomain.com'

Le nom d'hôte que j'ai spécifié est un alias d'un nom amazon-ec2 qui, lorsqu'il est résolu par les serveurs DNS AWS, se traduit par une adresse LAN:

[root @ db_server ~] # hôte appserver-lan.mydomain.com

appserver-lan.mydomain.com est un alias pour ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com a l'adresse 10.xxx .xxx.xxx

Le problème est que lorsque j'essaie de me connecter à l'IP LAN de la base de données à partir de ce serveur d'applications, j'obtiens une erreur d'accès refusé, bien que le mot de passe soit correct. La chose étrange ici est que le nom d'hôte affiché dans l'erreur n'est pas le nom d'hôte que j'avais spécifié lors de la création de l'utilisateur:

ERREUR 1045 (28000): accès refusé pour l'utilisateur 'nom_utilisateur' @ ' appserver.mydomain.com ' (en utilisant le mot de passe: OUI)

Donc, ma question est: comment mysql détermine le nom d'hôte du client? Je crois qu'il ne le fait pas par une recherche DNS inversée, puisque j'ai vérifié et qu'il ne pointe pas sur "appserver.mydomain.com" ni sur "appserver-lan.mydomain.com". De plus, le serveur db n'a aucune entrée liée au serveur d'applications sur / etc / hosts.

En résumé, je suis à peu près sûr que c'est un problème de résolution de nom d'hôte, car l'octroi de privilèges pour l'hôte "%" ou l'IP LAN fonctionne très bien.

Des idées sur ce qui me manque?


Pourquoi pensez-vous qu'il ne s'agit pas d'un DNS inversé? Que se passe-t-il lorsque vous le faites host -t PTR 10.1.2.3?
Zoredache

hôte -t ​​PTR 10.xxx.xxx.xxx xxx.xxx.xxx.10.in-addr.arpa pointeur de nom de domaine ip-10-xxx-xxx-xxx.ec2.internal. Comme vous pouvez le voir, ce n'est pas le nom d'hôte affiché dans le message d'erreur (appserver.mydomain.com) et cela m'a fait penser que MySQL ne faisait pas de recherche inversée.
Luis Fernando Alen

Réponses:


13

Il utilise une recherche DNS inversée. Il prend l'adresse IP du client et utilise tout enregistrement PTR renvoyé pour ce nom.

À mon avis, l'authentification basée sur le nom n'est pas très utile du tout, je vous suggère d'envisager d'utiliser des adresses IP à la place.

Consultez ce document sur la façon dont Mysql utilise DNS .


Merci pour le lien, @Zoredache. Je voudrais éviter d'utiliser des adresses IP car l'interface interne AWS utilise DHCP et ses modifications IP de temps en temps (chaque fois que le serveur démarre, je suppose), ainsi que son enregistrement PTR. La chose étrange ici est que, comme il utilise des recherches inversées, il devrait indiquer «Accès refusé à l'utilisateur @ ip-10-xxx-xxx-xxx.ec2.internal». au lieu de appserver.mydomain.com ...
Luis Fernando Alen

1
Pouvez-vous ignorer l'authentification IP / nom ensemble, utilisez plutôt un pare-feu basé sur l'hôte ou configurez l'authentification SSL et Cert.
Zoredache

3

MySQL fera une recherche DNS inversée sur l'adresse IP pour obtenir le nom d'hôte. Si vous utilisez AWS EC2, vous pouvez attribuer une adresse IP élastique à votre serveur (cela ne coûte rien de plus), puis demander à amazon de configurer un DNS inversé pour que l'adresse IP élastique accède à votre nom d'hôte.

Est-ce que votre serveur DB est également en EC2? Parce que si c'est le cas, il utilisera l'adresse IP privée de l'instance, sinon il utilisera l'adresse IP publique. Il semble que vous postez sur le serveur d'applications car c'est l'IP privée 10.XXX.XXX.XXX assignée à votre serveur, pas celle de l'ail.

Je ne sais pas quelle adresse IP serait utilisée si je communiquais avec une région différente, car je n'ai eu que des serveurs dans la même région.


Oui, c'est également sur EC2 et dans la même région. Merci pour l'astuce, Andy. Je ne savais pas que les instances EC2 utilisent l'IP interne pour communiquer entre elles, même si vous spécifiez l'IP valide pour la communication. Cela a résolu mon problème =]
Luis Fernando Alen

3

Je viens d'avoir un problème similaire, où le serveur mysql semblait mal effectuer des recherches DNS inversées.

Le problème que j'avais était que le serveur avait des autorisations pour 'user'@'1.2.3.4' ainsi que 'user'@'reverse.dns'. L'utilisateur avec juste l'adresse IP avait des autorisations minimales, mais le serveur mysql utilisait les autorisations de cet utilisateur plutôt que celui avec le nom d'hôte et renvoyait le message "Accès refusé pour l'utilisateur 'user'@'1.2.3.4'". La suppression de l'utilisateur avec l'adresse IP a résolu le problème et forcé le sereur à utiliser l'autre utilisateur sur le nom d'hôte.


0

J'ai également vu des problèmes où les noms d'hôte IPV4 et IPV6 et les adresses IP ne correspondent pas, et où un nom d'hôte uniquement est utilisé pour l'autorisation utilisateur. Par exemple, lorsqu'il existe un DNS IPV6 inverse mais pas de DNS IPV6 direct.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.