MySQL 访问控制实际上由两个功能模块共同组成,一个是负责“看守 MySQL 大门”的用户管理模块,另一个就是负责监控来访者每一个动作的访问控制模块。用户管理模块决定用户是否能登陆数据库,而访问控制模块则决定在数据库中具体可以做的事。下面是一张 MySQL 中实现访问控制的简单流程图。
在 MySQL 中,用户访问控制部分的实现比较简单,所有授权用户都存放在一个系统表中:mysql.user,当然这个表不仅仅存放了授权用户的基本信息,还存放有部分细化的权限信息。用户管理模块需要使用的信息很少,主要就是Host,User,Password 这三项,都在 mysql.user 表中
当客户端连接通过用户管理模块的验证,可连接上 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。
mysql数据库包含五个主要的授权表。
这里附一份我平时做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