Mysql访问控制-简述

By | 2022年12月21日

综述

mysql作为一个开源的数据库,有着一套完整的访问控制体系。整个过程分为两个阶段。第一个是Connection Verification 即连接验证;第二个是Request Verification即请求验证

阶段一 : 连接验证

当你想连接服务器的时候,是否可以是通过以下条件来判断的

  • 你的凭证和密码是否正确
  • 你的账户是否被锁定

服务器会先校验你的凭证,然后校验账户的锁定状态

凭证校验是基于user表的 (Host, User, and Password).只有这三列都验证通过才通过

凭证是由两部分组成的

  1. mysql用户
  2. 请求所在机器的host

如果user表中的user一列不为空,那么必须精确匹配,如果为空那么匹配任何用户。如果连接字符串的用户为空,那么意味着这一阶段不做校验,全交由第二阶段来完成校验。

password可以为空,但不是任意匹配的意思。他意味着在为空的时候连接字符串中不能传密码。
mysql不存储明文,存储的都是加密后的。从mysql的角度来看加密后的密码才是真正的密码。

user表中有多条记录匹配的时候,mysql需要选择其中一条来使用。解决过程如下:

  1. 当服务器读取user表内容到内存的时候,首先进行排序
  2. 当一个客户端尝试连接的时候,按照排列顺序进行尝试
  3. mysql使用第一个匹配到的规则

排序规则是根据host的精确度来排列的。

  • 主机名和ip地址是最精确的。
  • % 是最不精确的,它意味着任意host
  • 空字符串同%一样,但是排在%后
  • 如果host一样,那么根据user的精确度来完成。user为空最低

如果存在多条精确度一样的,那么采用顺序不能保证

账户说明

mysql的一个用户是有用户名和主机名来确定的

  • 类似 'user_name'@'host_name'.
  • 一个账户如果只考虑用户名,那么等同于'user_name'@'%'.

下面说下host的形式

  • host可以是hostname,也可以是ip(IPV4或者IPV6).'localhost'意味这本地地址,不走tcp/ip。127.0.0.1意味着ipv4本地循环地址,::1意味着ipv6本地循环地址
  • %_ 是通配符的意思,比如%.mysql.com
  • 对于host来讲,可以接受带有掩码的ip配置格式为 host_ip/netmask

服务器在校验host的时候,会使用DNS返回的值(hostname或者ip) 。除了用掩码配置的形式外,全部采用字符串匹配。所以必须保证配置的信息和DNS返回的格式一致。比如192.168.1.1192.168.01.1不是一个

注:本机通过hosts文件配置的解析和dns干的一样的事儿。

阶段二 : 请求校验

如果已经建立了连接,那么就进入第二阶段的权限校验。这些权限校验可以来自以下情况,user, db, tables_priv, columns_priv, or procs_priv tables。

  • user表用来配置全局的基础权限而不用限定默认数据库。如果配置了删除权限,那么意味着可以删除任何数据库中的任何表的记录
  • db表用来配置数据库级别的权限
  • tables_priv 表级
  • columns_priv 列级
  • procs_priv 存储过程级

通过以上两个阶段就完成了权限的校验。

确定当前连接用户信息

连接到mysql后输入\s,则可以查看用户信息,如下所示


mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.6.17, for linux-glibc2.5 (x86_64) using  EditLine wrapper

Connection id:          78
Current database:
Current user:           test@iz2ze8sexbgdravxyvdcsqz
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.38-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             172.17.96.65 via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               39306
Uptime:                 1 hour 28 min 14 sec

Threads: 41  Questions: 16240  Slow queries: 0  Opens: 1076  Flush tables: 1  Open tables: 477  Queries per second avg: 3.067
--------------

在输出的结果信息中 Current user: 就表示了当前的用户,那么授权的时候就可以通过这个来进行了

参考地址 https://dev.mysql.com/doc/refman/5.6/en/connection-access.html