mysql查看初始权限用户_MySQL中test库默认权限问题

在MySQL 5.6中,即使新创建的用户没有权限,仍能操作test库。这是因为mysql.db表默认允许所有用户对test及'test_'开头的库进行某些操作。本文分析了这一现象的原因,涉及mysql系统表和初始化数据。建议正式环境中避免使用test库存储业务数据,测试权限时远离test库。

2ff34e647e2e3cdfd8dca593e17d9b0a.png

前言

最近在测试MySQL用户权限相关的事情,发现用户在无任何权限的情况下,是可以随意操作test库的。在此记录一下该问题及其原因。

问题描述

安装一个MySQL版本为5.6的新实例,创建了一个test2的用户。用户在创建后,默认是没有任何权限的,如下图:

50e4cfef838d4055a37344c00135727b.png

通过该test2用户登陆后,无法创建其他库,但是可以对test库进行操作:

4ab3609df5465475311cc11ecf9b741e.png

为什么会这么奇怪呢?如果没有任何权限,应该不能做任何操作才对,怎么能在test库下创建表呢?

问题排查

查看mysql官方文档,可以知道:mysql系统库下存在7个关于权限相关的表,分别是:mysql.user表,保存用户相关的权限;当创建用户时,会在该表中插入用户相关记录,后续对创建的用户执行Grant授权时,会修改该表中对应用户的权限信息;

mysql.db表,保存库的访问权限;当使用Grant限制某个用户访问指定的某些库时,会在该表中插入对应记录;

mysql.host表,该表在MySQL 5.6.7及以后版本中不再被创建;

mysql.tables_priv表,保存表级访问权限;当使用Grant限制某个用户访问特定库中的某个表时,会在该表中插入对应记录;

mysql.columns_priv表,保存列级访问权限;mysql允许用户可以限制只访问某个表中的某些列,当对列的权限有限制时,会在该表中插入记录;

mysql.procs_priv表,保存存储过程和存储函数相关权限;

mysql.proxies_priv表,包括代理用户相关权限;

我们查询mysql.db表,得到如下信息:

cd8d8442777acc0acbcf85fd0650118f.png

可以看到,对于test库以及’test_’开头的库,User字段为空,意味着所有的用户都可以对其进操作(权限字段为Y的那些操作),包括那些没有权限的用户。可以看到默认情况下,初始化的mysql环境中mysql.db表默认包含的2行test数据库相关的配置,导致任意用户可以随意操作test或者test_开头的数据库

c4addde3cb3c11ce5cb19947aa87c1e7.png

深入问题

由于mysql实例是新创建的,并且没有对test2用户执行过任何库级的grant,那么mysql.db中的这两条记录是什么时候insert的呢?

带着这个问题,我们查看了mysql安装工具mysql_install_db,在该pl工具中,会先使用mysql_system_tables.sql文件创建所有系统表,然后使用mysql_system_tables_data.sql文件初始化系统表数据。

9cd746d95976275f2f22cec8b1a29b44.png

d39f6669d81a900b05c83ce7be638875.png

既然这样,查看mysql_system_tables_data.sql文件可以清楚看到对mysql.db表的初始化数据,如下:

7a15d454c83bd353916cf7682aeefebc.png

至此,test库权限问题的原因已经找到。

后记

还有两个遗留问题:一直以来,MySQL为什么对test库及test_开头的库的权限如此’开放’呢?

到了MySQL 5.7版本,官方把默认的test库直接干掉了,是不是由于test库引发了某些安全性问题才这么做的呢?

不管怎样,鉴于此,在使用MySQL时,还是需要注意:正式环境千万别使用test数据库或者创建test_开头的数据库来存储业务数据;

对用户的权限进行测试、验证的时候,千万别去test数据库,这可能误导你;

如果想彻底避免以上问题,可以将mysql.db中test相关的数据delete掉;

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值