Как mysql определяет имя хоста своих клиентов?

14

Я пытаюсь создать пользователя MySQL, которому будет разрешено подключаться к базе данных MySQL только с определенного имени хоста.

предоставить все в db_name. * для user_name'@'appserver-lan.mydomain.com, идентифицированного как some_passwd

Проверяя пользовательскую таблицу в базе данных mysql, я вижу, что пользователь был успешно создан:

использовать mysql; выберите * от пользователя, где User = 'user_name' и Host = 'appserver-lan.mydomain.com'

или

показать гранты для 'username'@'appserver-lan.mydomain.com'

Указанное мною имя хоста является псевдонимом имени amazon-ec2, которое при разрешении DNS-серверами AWS приводит к адресу LAN:

[root @ db_server ~] # хост appserver-lan.mydomain.com

appserver-lan.mydomain.com является псевдонимом для ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com имеет адрес 10.xxx .xxx.xxx

Проблема в том, что когда я пытаюсь подключиться к IP-адресу локальной сети базы данных с этого appserver-lan, я получаю сообщение об ошибке отказа в доступе, хотя пароль правильный. Странная вещь здесь в том, что имя хоста, показанное в ошибке, не является именем хоста, которое я указал при создании пользователя:

ОШИБКА 1045 (28000): доступ запрещен для пользователя 'user_name' @ ' appserver.mydomain.com ' (используя пароль: ДА)

Итак, мой вопрос: как mysql определяет имя хоста клиента? Я полагаю, что это не происходит при обратном поиске DNS, так как я проверил и не указывает ни на appserver.mydomain.com, ни на appserver-lan.mydomain.com. Кроме того, на сервере базы данных нет записей, связанных с сервером приложений в / etc / hosts.

Подводя итог, я почти уверен, что это проблема разрешения имени хоста, так как предоставление привилегий для хоста "%" или для IP-адреса локальной сети работает просто отлично.

Есть идеи о том, что мне не хватает?

Луис Фернандо Ален
источник
Почему вы думаете, что это не обратный DNS? Что происходит, когда вы делаете host -t PTR 10.1.2.3?
Zoredache
host -t PTR 10.xxx.xxx.xxx xxx.xxx.xxx.10.in-addr.arpa указатель доменного имени ip-10-xxx-xxx-xxx.ec2.internal. Как видите, это не имя хоста, указанное в сообщении об ошибке (appserver.mydomain.com), и это заставило меня подумать, что MySQL не выполняет обратный поиск.
Луис Фернандо Ален

Ответы:

13

Он использует обратный поиск DNS. Он берет IP-адрес клиента и использует любую запись PTR, возвращенную для этого имени.

По моему мнению, аутентификация на основе имени не очень полезна, я советую вам вместо этого использовать IP-адреса.

Посмотрите этот документ о том, как Mysql использует DNS .

Zoredache
источник
Спасибо за ссылку, @Zoredache. Я хотел бы избегать использования IP-адресов, поскольку внутренний интерфейс AWS использует DHCP и его IP-адреса время от времени меняются (я думаю, всякий раз, когда сервер загружается), а также его PTR-запись. Странная вещь здесь в том, что, поскольку он использует обратный поиск, он должен сказать «Доступ запрещен для пользователя @ ip-10-xxx-xxx-xxx.ec2.internal». вместо appserver.mydomain.com ...
Луис Фернандо Ален
1
Можете ли вы вообще пропустить аутентификацию по IP / имени, вместо этого использовать либо брандмауэр на основе хоста, либо настроить SSL и аутентификацию на основе сертификата.
Зоредаче
3

MySQL будет выполнять обратный поиск DNS по IP-адресу, чтобы получить имя хоста. Если вы работаете в AWS EC2, вы можете назначить эластичный IP-адрес вашему серверу (это не потребует дополнительных затрат), а затем попросить amazon настроить обратный DNS для эластичного IP-адреса, чтобы перейти к вашему имени хоста.

Также ваш сервер БД также в EC2? Потому что в этом случае он будет использовать частный IP-адрес экземпляра, в противном случае он будет использовать публичный IP-адрес. Из вашего поста видно, что ваш appserver-lan является частным ip 10.XXX.XXX.XXX, назначенным вашему серверу, а не путликом.

Я не уверен, какой IP-адрес будет использоваться при связи с другим регионом, хотя у меня были только серверы в одном регионе.

Энди Хоббс
источник
Да, это также на EC2 и в том же регионе. Спасибо за совет, Энди. Я не знал, что экземпляры EC2 используют внутренний ip для связи между ними, даже если вы указали действительный ip для связи. Это решило мою проблему =]
Луис Фернандо Ален
3

У меня была похожая проблема, когда сервер mysql неправильно выполнял обратный поиск DNS.

Проблема, с которой я столкнулся, заключалась в том, что у сервера были права для 'user'@'1.2.3.4', а также 'user'@’verse.dns'. Пользователь с только IP-адресом имел минимальные разрешения, но сервер mysql использовал разрешения этого пользователя, а не пользователя с именем хоста, и возвращал сообщение «Доступ запрещен для пользователя 'user'@'1.2.3.4'". Удаление пользователя с IP-адресом устранило проблему и заставило serer использовать другого пользователя на имени хоста.

Энди Беверли
источник
0

Я также видел проблемы, когда имена хостов и IP-адреса IPV4 и IPV6 не совпадают, и где только имя хоста используется только для разрешения пользователя. Например, если есть обратный DNS IPV6, но нет прямого IPV6 DNS.

Энди Беверли
источник