一文总结MySQL数据库访问控制实现原理

概述

MySQL 访问控制实际上由两个功能模块共同组成,一个是负责“看守 MySQL 大门”的用户管理模块,另一个就是负责监控来访者每一个动作的访问控制模块。用户管理模块决定用户是否能登陆数据库,而访问控制模块则决定在数据库中具体可以做的事。下面是一张 MySQL 中实现访问控制的简单流程图。

一文总结MySQL数据库访问控制实现原理


1、 用户管理

在 MySQL 中,用户访问控制部分的实现比较简单,所有授权用户都存放在一个系统表中:mysql.user,当然这个表不仅仅存放了授权用户的基本信息,还存放有部分细化的权限信息。用户管理模块需要使用的信息很少,主要就是Host,User,Password 这三项,都在 mysql.user 表中

一文总结MySQL数据库访问控制实现原理


2、 访问控制

当客户端连接通过用户管理模块的验证,可连接上 MySQL Server 之后,就会发送各种Query 和 Command 给 MySQL Server,以实现客户端应用的各种功能。当 MySQL 接收到客户端的请求之后,访问控制模块是需要校验该用户是否满足提交的请求所需要的权限。权限校验过程是从最大范围的权限往最小范围的权限开始依次校验所涉及到的每个对象的每个权限。

在验证所有所需权限的时候,MySQL 首先会查找存储在内存结构中的权限数据,首先查找 Global Level 权限,如果所需权限在 Global Level 都有定义(GRANT 或者 REVOKE),则完成权限校验(通过或者拒绝),如果没有找到所有权限的定义,则会继续往后查找Database Level 权限,进行 Global Level 未定义的所需权限的校验,如果仍然没有能够找到所有所需权限的定义,MySQL 会继续往更小范围的权限定义域查找,也就是 Table Level,最后则是 Column Level 或者 Routine Level。


3、五个授权表

mysql数据库包含五个主要的授权表。

  • user表:包含用户帐户和全局权限列。MySQL使用user表来接受或拒绝来自主机的连接。 在user表中授予的权限对MySQL服务器上的所有数据库都有效。
  • db表:包含数据库级权限。MySQL使用数据库表来确定用户可以访问哪个数据库以及哪个主机。在db表中的数据库级授予的特权适用于数据库,所有对象属于该数据库,例如表,触发器,视图,存储过程等。
  • table_priv和columns_priv表:包含表级和列级权限。 在table_priv表中授予的权限适用于表及其列,而在columns_priv表中授予的权限仅适用于表的特定列。
  • procs_priv表:包含存储函数和存储过程的权限。

4、参考访问授权策略

这里附一份我平时做mysql数据库授权的策略,仅供参考。

//针对root账号
set global validate_password_policy=0; --设置判断密码的标准基于密码的长度(validate_password_length)
grant all privilges on *.* to root@'localhost' identified by 'password';
grant all privilges on *.* to root@'%' identified by 'password'; --根据具体情况决定是否开启

//针对日常运维账号
grant select, insert, update, delete on database_name.* to hwb@'%' identified by 'password';
grant create,alter,drop,references on database_name.* to hwb@'%'; 
grant create temporary tables on database_name.* to hwb@'%'; 
grant index on database_name.* to hwb@'%'; 
grant create view on database_name.* to hwb@'%'; 
grant show view on database_name.* to hwb@'%'; 
grant create routine on database_name.* to hwb@'%'; -- 查看存储过程、函数状态 
grant alter routine on database_name.* to hwb@'%'; --删除存储过程、函数
grant execute on database_name.* to hwb@'%';
grant all privileges on mysql.* to hwb@'%' identified by 'password'; --不增加不能对其他用户的函数或存储过程做操作

//针对应用连接账号
grant all privileges on database_name.* to hwb2@'应用服务器IP' identified by 'password';
grant all privileges on mysql.* to hwb2@'应用服务器IP'; --不增加无法对其他用户的函数或存储过程做操作

//针对只读账号(导出数据库权限)
grant select on database_name.* to hwbread@'%' identified by 'hwbread123';
grant select on mysql.* to hwbread@'%';
grant show view on database_name.* to hwbread@'%';
grant file on *.* to hwbread@'%'; --if database_name.* will ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES

篇幅有限,关于mysql访问控制实现原理这块的内容就介绍到这里了,假设面试官问你这块内容,一定要做到心中有数,思路是最重要的,觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~

一文总结MySQL数据库访问控制实现原理

相关推荐