MySQL8安全指南之账号控制与账户管理:访问控制第一阶段_连接验证

访问控制第一阶段_连接验证

当你尝试访问MySQL服务器的时候,服务器根据这些条件来控制接收或者拒绝连接。

  • 您的身份以及您是否可以通过提供适当的凭据来验证它。

  • 您的帐户是否被锁定或解锁。

服务器首先检查凭据,然后是帐户锁定状态。任一步骤的失败都会导致服务器完全拒绝您的访问。否则,服务器接受连接,然后进入第 2 阶段并等待请求。

服务器使用用户表中的列进行执行身份和凭据检查,仅在满足以下条件时才接受连接:

  • 客户端主机名和用户名与某些用户表行中的HostUser列匹配。
  • 客户端提供与指定行中authentication_string列值相匹配的身份验证信息。身份验证信息使用plugin列中命名的认证插件来进行解释。
  • 该行表名该账户未被锁定。锁定状态被记录在account_locked列中,并且该列的值必须是N。账户状态可以通过CREATE USER或者ALTER USER语句来设置或者修改。

你的身份信息是基于两个信息:

  • 你的MySQL用户名
  • 连接客户端主机

如果User列非空,传入进来的用户名必须与之完全匹配。如果User为空,可以匹配任何用户名。如果user表行匹配了传入进来的空用户名,该用户被认为是一个没有名字的匿名用户,而不是客户端实际指定的用户。这意味着在连接期间,将使用空白用户名进行后续所有的访问检查。

authentication_string列可以为空。这不是通配符,也不意味着任何密码匹配。这意味着用户必须在不指定密码的情况下进行连接。对客户端进行身份验证的插件可能使用也可能不使用 authentication_string 列中的密码。在这种情况下,外部密码也可能用于对 MySQL 服务器进行身份验证。

存储在user表的 authentication_string 列中的非空白密码值是加密的。MySQL 不会将密码存储为任何人都可以看到的明文。相反,尝试连接的用户提供的密码是加密的(使用帐户身份验证插件实现的密码散列方法)。然后在连接过程中使用加密的密码检查密码是否正确。这是在没有通过连接传输加密密码的情况下完成的。

下表显示了user表中UserHost值的各种组合如何应用于传入连接。

User ValueHost ValuePermissible Connections
'fred''h1.example.net'fred, connecting from h1.example.net
'''h1.example.net'Any user, connecting from h1.example.net
'fred''%'fred, connecting from any host
'''%'Any user, connecting from any host
'fred''%.example.net'fred, connecting from any host in the example.net domain
'fred''x.example.%'fred, connecting from x.example.net, x.example.com, x.example.edu, and so on; this is probably not useful
'fred''198.51.100.177'fred, connecting from the host with IP address 198.51.100.177
'fred''198.51.100.%'fred, connecting from any host in the 198.51.100 class C subnet
'fred''198.51.100.0/255.255.255.0'Same as previous example

传入连接的客户端主机名和用户名可能与用户表中的多行匹配

当可能有多个匹配项时,服务器必须确定使用其中的哪个匹配项。它利用以下方式解决此问题:

  • 每当服务器将user表读入内存时,它就会对行进行排序。

  • 当客户端尝试连接时,服务器按排序顺序查看行。

  • 服务器使用与客户端UserHost匹配到的第一行。

服务器使用的排序规则,首先对最具体放入 的Host 值行进行排序:

  • 文字IP地址和主机名是最具体的。

  • 在MySQL8.0.23之前,文本IP地址的特殊性不受其是否具有网络掩码的影响,因此198.51.100.13198.51.100.0/255.255.255.0被认为是同等特殊的。从MySQL 8.0.23开始,在主机部分具有IP地址的帐户具有以下特定顺序:

    • 将主机部分指定为 IP 地址的帐户:

      CREATE USER 'user_name'@'127.0.0.1';
      CREATE USER 'user_name'@'198.51.100.44';
      
    • 使用 CIDR 表示法将主机部分指定为 IP 地址的帐户:

      CREATE USER 'user_name'@'192.0.2.21/8';
      CREATE USER 'user_name'@'198.51.100.44/16';
      
    • 将主机部分指定为带有子网掩码的 IP 地址的帐户:

      CREATE USER 'user_name'@'192.0.2.0/255.255.255.0';
      CREATE USER 'user_name'@'198.51.0.0/255.255.0.0';
      
  • 模式'%' 的意思是“任何主机”并且是最不具体的。

  • 空字符串 '' 也表示“任何主机”,但在 '%' 之后排序。

具有相同 Host 值的行首先使用最具体的 User 值进行排序。空白的 User 值意味着“任何用户”并且是最不具体的,因此对于具有相同 Host 值的行,非匿名用户在匿名用户之前排序。

对于具有同样特定 HostUser 值的行,顺序是不确定的。

要查看它是如何工作的,假设用户表如下所示:

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| %         | root     | ...
| %         | jeffrey  | ...
| localhost | root     | ...
| localhost |          | ...
+-----------+----------+-

当服务器将表读入内存时,它使用刚刚描述的规则对行进行排序。排序后的结果是这样的:

+-----------+----------+-
| Host      | User     | ...
+-----------+----------+-
| localhost | root     | ...
| localhost |          | ...
| %         | jeffrey  | ...
| %         | root     | ...
+-----------+----------+-

如果您能够连接到服务器,但是您的特权不是您所期望的,那么您可能正在被验证为其他帐户。要找出服务器用来对您进行身份验证的帐户,请使用CURRENT_USER()函数。它返回一个user_name@host_name格式的值,该值指示来自匹配的用户表行中的UserHost值。假设jeffrey连接并发出以下查询:

mysql> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| @localhost     |
+----------------+

此处显示的结果表明匹配的用户表行有一个空白的用户列值。换句话说,服务器将 jeffrey 视为匿名用户。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值