探索MySQL权限表
2015-08-05 12:58
701 查看
MySQL权限表是指在mysql数据库下的5张表:user, db, tables_priv, columns_priv, procs_priv,这5张表记录了所有的用户及其权限信息,MySQL就是通过这5张表控制用户访问的。本文将探索这5张权限表。
MySQL权限表的结构和内容
1、user:记录账号、密码、全局性权限信息等。
?
1)*_priv:适用MySQL服务器全局性的权限,假设某个账号拥有Delete_priv的全局性权限,则表示它可以对任何表进行删除数据的操作,这非常危险,所有一般只有超级用户root有这样的权限,其它普通用户没有。
2)max_*:资源管理列,用于规定账号的资源使用上限,其中:
max_questions:每小时发出的语句数上限
max_updates:每小时发出的修改类语句数上限
max_connections:每小时连接数上限
max_user_connections:允许保有的连接数上限
3)SSL相关列:
ssl_type,ssl_cipher,x509_isuser, x509_subject
2、db:记录数据库相关权限
?
上面的Column_priv比较奇怪,因为照理说tables_priv只显示表级别的权限,列级别的权限应该在columns_priv里显示才对。后来查了资料才知道,原来这是为了提高权限检查时的性能,试想一下,权限检查时,如果发现tables_priv.Column_priv为空,就不需要再检查columns_priv表了,这种情况在现实中往往占大多数。
4、columns_priv:列级别的权限
?
如何控制客户访问?
下面讲讲MySQL服务器如何通过以上介绍的5张权限表控制客户访问。
1、用户连接时的检查
1)当用户连接时,MySQL服务器首先从user表里匹配host, user, password,匹配不到则拒绝该连接
2)接着检查user表的max_connections和max_user_connections,如果超过上限则拒绝连接
3)检查user表的SSL安全连接,如果有配置SSL,则需确认用户提供的证书是否合法
只有上面3个检查都通过后,服务器才建立连接,连接建立后,当用户执行SQL语句时,需要如下检查。
2、执行SQL语句时的检查
1)从user表里检查max_questions和max_updates,如果超过上限则拒绝执行SQL
下面几步是进行权限检查:
2)首先检查user表,看是否具有相应的全局性权限,如果有,则执行,没有则继续下一步检查
3)接着到db表,看是否具有数据库级别的权限,如果有,则执行,没有则继续下一步检查
4)最后到tables_priv, columns_priv, procs_priv表里查看是否具有相应对象的权限
从以上的过程我们可以知道,MySQL检查权限是一个比较复杂的过程,所以为了提高性能,MySQL的启动时就会把这5张权限表加载到内存。
注意事项
1、尽量使用create user, grant等语句,而不要直接修改权限表。
虽然create user, grant等语句底层也是修改权限表,和直接修改权限表的效果是一样的,但是,对于非高手来说,采用封装好的语句肯定不会出错,而如果直接修改权限表,难免会漏掉某些表。而且,修改完权限表之后,还需要执行flush privileges重新加载到内存,否则不会生效。
2、把匿名用户删除掉。
匿名用户没有密码,不但不安全,还会产生一些莫名其妙的问题,强烈建议删除。
MySQL权限表的结构和内容
1、user:记录账号、密码、全局性权限信息等。
?
2)max_*:资源管理列,用于规定账号的资源使用上限,其中:
max_questions:每小时发出的语句数上限
max_updates:每小时发出的修改类语句数上限
max_connections:每小时连接数上限
max_user_connections:允许保有的连接数上限
3)SSL相关列:
ssl_type,ssl_cipher,x509_isuser, x509_subject
2、db:记录数据库相关权限
?
4、columns_priv:列级别的权限
?
下面讲讲MySQL服务器如何通过以上介绍的5张权限表控制客户访问。
1、用户连接时的检查
1)当用户连接时,MySQL服务器首先从user表里匹配host, user, password,匹配不到则拒绝该连接
2)接着检查user表的max_connections和max_user_connections,如果超过上限则拒绝连接
3)检查user表的SSL安全连接,如果有配置SSL,则需确认用户提供的证书是否合法
只有上面3个检查都通过后,服务器才建立连接,连接建立后,当用户执行SQL语句时,需要如下检查。
2、执行SQL语句时的检查
1)从user表里检查max_questions和max_updates,如果超过上限则拒绝执行SQL
下面几步是进行权限检查:
2)首先检查user表,看是否具有相应的全局性权限,如果有,则执行,没有则继续下一步检查
3)接着到db表,看是否具有数据库级别的权限,如果有,则执行,没有则继续下一步检查
4)最后到tables_priv, columns_priv, procs_priv表里查看是否具有相应对象的权限
从以上的过程我们可以知道,MySQL检查权限是一个比较复杂的过程,所以为了提高性能,MySQL的启动时就会把这5张权限表加载到内存。
注意事项
1、尽量使用create user, grant等语句,而不要直接修改权限表。
虽然create user, grant等语句底层也是修改权限表,和直接修改权限表的效果是一样的,但是,对于非高手来说,采用封装好的语句肯定不会出错,而如果直接修改权限表,难免会漏掉某些表。而且,修改完权限表之后,还需要执行flush privileges重新加载到内存,否则不会生效。
2、把匿名用户删除掉。
匿名用户没有密码,不但不安全,还会产生一些莫名其妙的问题,强烈建议删除。
相关文章推荐
- MySQL数据库管理基本命令
- Mybatis+Mysql 返回主键的值
- MySQL服务器最大连接数的合理设置
- mysql event
- mysql 导出数据到csv文件的命令
- MySQL主从同步读写分离的集群配置
- mysql学习
- mysql连接字符集
- MySQL The password hash doesn't have the expected format.
- mysql 违反注入 问题
- [资料收集]MySQL在线DDL工具pt-online-schema-change
- MySQLAdmin的用法
- Lost connection to MySQL server at ‘reading initial communication packet错误解决
- MySQL数据库连接超时(wait_timeout)问题的处理
- mysql中binlog_format模式与配置详解
- Mybatis连接mysql数据库出现乱码
- 用make编译方法安装mysql 出现的问题
- mysql查询速度慢的原因[整理版]
- mysql数据库单表只有一个主键自增id字段,ibatis实现id自增
- MySQL 5.6 for Windows 解压缩版配置安装