Я пытаюсь создать пользователя 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-адресу локальной сети базы данных с этого сервера приложений, я получаю сообщение об ошибке отказа в доступе, хотя пароль правильный. Странная вещь вот что имя хоста, показанное в ошибке, не является именем хоста, которое я указал при создании пользователя:
ОШИБКА 1045 (28000): доступ запрещен для пользователя user_name '@'appserver.mydomain.com'(используя пароль: ДА)
Итак, мой вопрос: как mysql определяет имя хоста клиента? Я считаю, что это не происходит с помощью обратного поиска DNS, поскольку я проверил, и он не указывает ни на «appserver.mydomain.com», ни на «appserver-lan.mydomain.com». Кроме того, на сервере db нет записей, связанных с сервером приложений, в / etc / hosts.
Подводя итог, я почти уверен, что это проблема разрешения имени хоста, поскольку предоставление привилегий для хоста «%» или IP-адреса LAN работает нормально.
Любые идеи о том, что мне не хватает?
Он использует обратный поиск в DNS. Он принимает IP-адрес клиента и использует любую запись PTR, возвращаемую для этого имени.
На мой взгляд, проверка подлинности на основе имени не очень полезна, я предлагаю вам вместо этого рассмотреть возможность использования IP-адресов.
См. Этот документ о том, как Mysql использует DNS.
MySQL будет выполнять обратный DNS-поиск IP-адреса, чтобы получить имя хоста. Если вы работаете в AWS EC2, вы можете назначить эластичный IP-адрес своему серверу (это не требует дополнительных затрат), а затем попросить Amazon настроить обратный DNS, чтобы эластичный IP-адрес перешел к вашему имени хоста.
Ваш сервер БД также находится в EC2? Потому что в этом случае он будет использовать частный IP-адрес экземпляра, в противном случае он будет использовать общедоступный IP-адрес. Судя по вашему сообщению, ваш appserver-lan - это частный IP-адрес 10.XXX.XXX.XXX, назначенный вашему серверу, а не putlic.
Я не уверен, какой IP-адрес будет использоваться при связи с другим регионом, хотя у меня были серверы только в том же регионе.
У меня была аналогичная проблема, когда сервер mysql, казалось, неправильно выполнял обратный поиск DNS.
Проблема, с которой я столкнулся, заключалась в том, что у сервера были разрешения для «user'@'1.2.3.4», а также «user'@'reverse.dns». У пользователя только с IP-адресом были минимальные разрешения, но сервер mysql использовал разрешения этого пользователя, а не тот, у которого было имя хоста, и возвращал сообщение «Доступ запрещен для пользователя 'user'@'1.2.3.4'». Удаление пользователя с IP-адресом устранило проблему и вынудило сервер использовать другого пользователя с именем хоста.
Я также видел проблемы, когда имена хостов и IP-адреса IPV4 и IPV6 не совпадают, и когда имя хоста используется только для разрешения пользователя. Например, если есть обратный DNS IPV6, но нет прямого DNS IPV6.