暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的权限控制过程

原创 quantumdb 2022-07-08
1039

用户经认证后成功登录数据库,之后服务器将通过系统权限表检测用户发出的每个请求操作,判断用户是否有足够的权限来实施该操作,这就是 MySQL 的权限控制过程。


1 MySQL 权限信息以及权限表

MySQL 数据库给一个合法用户赋予的权限分为 5 个级别:全局级(全局访问)、数据库级(指定数据库的访问)、表级(指定表的访问)、列级(指定列的访问)、存储过程和函数级(指定存储过程和函数的访问),权限从全局到局部的级别依次递减。下表显示了数据库的 29 种权限信息以及各权限的级别。



MySQL 数据库中权限级别的划分是通过系统权限表来实现的。系统中有 6 张权限表与 5 个权限级别相对应,分别为:user 表、db 表、host 表、tables_priv 表、columns_priv 表以及 procs_priv 表。这些表默认存放在 mysql 数据库中。该 6 个表的主要信息为:
1) user 表称为全局表。user 表除了用于前面的登录验证外,还用于判定合法登录用户是否拥有数据库服务器的全局操作权限。该表包含用户信息列 (Host, User,Password),权限列(数据库操作中 29 个全局权限 29 列,通过 N/Y 断定用户是否有该权 限 ) , 安 全 列 (ssl_type,ssl_cipher,x509_issuer,x509_subject) , 资 源 控 制 列(max_questions, max_updates, max_connections, max_user_connections)。user 表又被称为超级用户表,因为默认情况下 root 用户具有所有的权限。
2) db 表是针对某个数据库的,它用来指定用户对某个指定的数据库中的对象具有哪些操作权限。该表中包含用户信息列(Host, Db,User),权限列(数据库级权限 19列)。
3) host 表作为 db 表一个辅助表,大部分情况下不用。如果想要用户能在从若干主机使用一个数据库,在用户的 db 表行的 Host 值设为空值,然后将那些主机的信息存入 host 表。host 表没有 user 字段,其他和 db 表一样。
4) tables_priv 表,用来指定用户对某个表格所具有的权限。包含用户信息列(Host,Db, User, Table_name),权限列(表级权限 Table_priv,Column_priv 用户所拥有对该表的所有列级权限,如果该列为空,那么 columns_priv 表中用户就没有对该表的列级权限记录),其他( 授权时间 Timestamp,授权者 Grantor)。
5) columns_priv 表,用于指定用户对某个字段所拥有的权限。包含用户信息列(Host, Db, User, Table_name),权限列(column_priv 列级权限),其他列(授权时间timestamp)。
6) procs_priv 表,该表用于指定用户对某一个单独的存储过程或函数。包含用户信息列(Host, Db, User, Routine_name, Routine_type),权限列(Proc_priv 存储过程权限),其他列( 授权时间 Timestamp,授权者 Grantor)。


2 MySQL 授权规则

MySQL 数据库授权过程由系统管理员以及权限转授者完成。系统拥有一套比较简单的授权管理规则:
规则 1:管理员 root 用户或拥有全局 grant_priv 的用户可以将系统资源的任何权限授予任何用户,能从任何用户回收任何权限。
如果用户拥有全局的 grant_priv 权限,用户就可以将全局/数据库级/表级/列级/存储过程级所有的权限授予他人,比如系统中的超级用户 root 就有全局的 grant_priv权限,他就可能生成更多的超级用户。这样如果一个普通用户创建了自己的数据库或表并且包含一些机密信息,就很容易被超级授权者将权限授予其他人,容易泄漏用户的信息。
规则 2:数据库对象(数据库/表)创建者,没有所创建对象的任何操作权限(存储过程或函数除外),必须通过 root 用户统一授权。
规则 3:普通用户如果要将权限授予其他用户或回收该权限,必须拥有该权限的使用权以及转授权。


3 MySQL 权限检查机制


MySQL 用户访问请求的处理也是根据用户所拥有的权限的级别来实现的,具体规则为:如果高优先级的表中用户具有所请求的操作权限,那么就无需查阅优先级较低的授权表了,但是如果高优先级的表中对应权限的值为 N,那么就需要进一步查看低优先级的授权表。也就是说,如果某个用户发送一个的某一个请求,将作如下处理:
1) 首先检查 user 表,如果表中相应权限字段为“Y”,则不用考虑其他四个表,访问接受;如果为“N”且请求的权限为全局级权限,访问拒绝;如果为“N”但请求的权限不是全局级权限,则需要继续查找 db 表。
2) 检查 db 表中用户所指定数据库的相应权限信息,如果表中相应权限字段为“Y”,不再考察低优先级表,访问接受;如果为“N” 且请求的权限为数据库级权限,访问拒绝;如果为“N”但请求的权限不是数据库级权限,继续检查tables_priv表。
3) 检查 tables_priv 表中用户所指定表格的相应权限信息,查看用户指定表格记录的表级权限字段 Table_privs 是否包含该请求权限,如果包含,访问接受,如果没有,判断请求的权限是否为表级权限,如果请求的是列级权限,查看查看用户指定表格记录的表级权限字段 Column_privs 是否包含该请求权限,如果有,继续检查columns_privs 表格,如果没有,访问拒绝。

4) 检查 colums_priv 表,查看表中是否有对表格指定字段的请求操作权限,如果有相关权限记录,访问接受,如果没有访问拒绝。





「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论