我正在尝试创建一个 MySQL 用户,该用户只允许从特定主机名连接到 MySQL 数据库。
授予 db_name.* 上的所有权限给 'user_name'@'appserver-lan.mydomain.com',标识为 'some_passwd'
通过检查 mysql db 上的用户表,我可以看到用户已成功创建:
使用 mysql;从用户中选择 *,其中 User='user_name' 和 Host='appserver-lan.mydomain.com'
或者
显示“用户名”@“appserver-lan.mydomain.com”的授权
我指定的主机名是 amazon-ec2 名称的别名,当由 AWS DNS 服务器解析时,会得到一个 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
问题是,当我尝试从这个 appserver-lan 连接到数据库 LAN IP 时,虽然密码正确,但还是出现访问被拒绝错误。奇怪的事情这里错误显示的主机名不是我创建用户时指定的主机名:
错误 1045 (28000):拒绝用户 'user_name'@' 访问appserver.mydomain.com'(使用密码:是)
因此,我的问题是:mysql 如何确定客户端主机名?我相信它不会通过反向 DNS 查找来确定,因为我检查过,它既不指向“appserver.mydomain.com”,也不指向“appserver-lan.mydomain.com”。此外,db 服务器在 /etc/hosts 上没有与应用服务器相关的条目。
总而言之,我很确定这是一个主机名解析问题,因为授予主机“%”或 LAN IP 权限就可以了。
知道我遗漏了什么吗?
答案1
它使用反向 DNS 查找。它获取客户端的 IP 地址并使用针对该名称返回的任何 PTR 记录。
在我看来,基于名称进行身份验证根本没有多大用处,我建议您考虑使用 IP 地址。
请参阅此文档以了解如何Mysql 使用 DNS。
答案2
MySQL 将对 IP 地址进行反向 DNS 查找以获取主机名。如果您在 AWS EC2 中运行,则可以为您的服务器分配一个弹性 IP(这不会产生任何额外费用),然后要求亚马逊为弹性 IP 设置反向 DNS 以转到您的主机名。
另外,您的数据库服务器是否也在 EC2 中?因为如果是这样,它将使用实例的私有 IP 地址,否则它将使用公共 IP 地址。从您的帖子来看,appserver-lan 是分配给您服务器的 10.XXX.XXX.XXX 私有 IP,而不是 putlic IP。
由于我只有同一地区内的服务器,因此我不确定与不同地区通信时会使用哪个 IP 地址。
答案3
我刚刚遇到过类似的问题,其中 mysql 服务器似乎错误地执行了反向 DNS 查找。
我遇到的问题是,服务器对 'user'@'1.2.3.4' 以及 'user'@'reverse.dns' 具有权限。仅具有 IP 地址的用户具有最低权限,但 mysql 服务器正在使用该用户的权限,而不是具有主机名的权限,并返回消息“拒绝用户 'user'@'1.2.3.4' 访问”。删除具有 IP 地址的用户解决了该问题,并强制服务器使用主机名上的其他用户。
答案4
我还看到了 IPV4 和 IPV6 主机名和 IP 地址不匹配的问题,以及主机名仅用于用户权限的问题。例如,有 IPV6 反向 DNS,但没有正向 IPV6 DNS。