当前位置: 首页 > 科技观察

本文总结了MySQL数据库访问控制的实现原理

时间:2023-03-18 14:10:06 科技观察

MySQL访问控制实际上由两个功能模块组成,一个是负责“守卫MySQL大门”的用户管理模块,另一个是负责监控的访问控制访客模块的每一个动作。用户管理模块决定用户是否可以登录数据库,而访问控制模块决定数据库可以做什么。下面是一个在MySQL中实现访问控制的简单流程图。1.用户管理在MySQL中,用户权限控制的实现比较简单。所有授权用户都存储在一个系统表中:mysql.user。当然,这张表不仅存储了授权用户的基本信息,还存储了一些详细信息。自定义权限信息。用户管理模块需要的信息很少,主要是Host、User、Password这三项,都在mysql.user表中2.访问控制客户端连接通过用户管理模块的认证后,可以连接向MySQLServer发送各种Query和Command到MySQLServer,实现客户端应用的各种功能。MySQL收到客户端的请求后,访问控制模块需要检查用户是否满足提交的请求所需要的权限。权限验证过程是按照从权限范围大到权限范围小的顺序,对涉及的每个对象的各个权限进行验证。MySQL在验证所有需要的权限时,会先查找存储在内存结构中的权限数据,先查找GlobalLevel权限,如果需要的权限在GlobalLevel中定义(GRANT或REVOKE),则完成权限验证(passorreject),如果没有找到所有权限的定义,会继续寻找DatabaseLevel的权限,在GlobalLevel中检查没有定义的需要的权限。如果仍然没有找到所有所需权限的定义,MySQL将继续搜索更小范围的权限域,即TableLevel,最后是ColumnLevel或RoutineLevel。3.五个授权表mysql数据库包含五个主要的授权表。用户表:包含用户帐户和全局权限列。MySQL使用用户表来接受或拒绝来自主机的连接。用户表中授予的权限适用于MySQL服务器上的所有数据库。dbtable:包含数据库级别的权限。MySQL使用数据库表来确定用户可以访问哪个数据库和哪个主机。db表中数据库级别授予的权限适用于所有对象所属的数据库,如表、触发器、视图、存储过程等。table_priv和columns_priv表:包含表级和列级权限。在table_priv表中授予的权限适用于表及其列,而在columns_priv表中授予的权限仅适用于表的特定列。procs_priv表:包含存储函数和存储过程的权限。4、参考访问授权策略这里复制一份我平时mysql数据库的授权策略,仅供参考。//对于root账户setglobalvalidate_password_policy=0;--设置根据密码长度(validate_password_length)判断密码的标准grantallprivilgeson*.*toroot@'localhost'identifiedby'password';grantallprivilgeson*.*toroot@'%'identifiedby'password';--根据具体情况决定是否启用//对于日常运维账号grantselect,insert,update,deleteondatabase_name.*tohwb@'%'identifiedby'password';grantcreate,alter,drop,referencesondatabase_name.*tohwb@'%';grantcreatetemporarytablesondatabase_name.*tohwb@'%';grantindexondatabase_name.*tohwb@'%';grantcreateviewondatabase_name.*tohwb@'%';grantshowviewondatabase_name.*tohwb@'%';grantcreateroutineondatabase_name.*tohwb@'%';--查看存储过程,functionstatusgrantalterroutineondatabase_name.*tohwb@'%';--删除存储过程,functiongrantexecuteondatabase_name.*tohwb@'%';grantallprivilegesonmysql.*tohwb@'%'identifiedby'password';Functionorstoredproceduretooperate//Accountforapplicationconnectiongrantallprivilegesondatabase_name.*tohwb2@'applicationserverIP'identifiedby'password';grantallprivilegesonmysql.*tohwb2@'applicationserverIP';--不增加不能的函数或存储其他用户使用流程操作//用于只读账户(导出数据库权限)grantselectondatabase_name.*tohwbread@'%'identifiedby'hwbread123';grantselectonmysql.*tohwbread@'%';grantshowviewondatabase_name.*tohwbread@'%';grantfileon*.*tohwbread@'%';--ifdatabase_name.*willERROR1221(HY000):DBGRANT和GLOBALPRIVILEGES的不正确使用