0%

MySQL中test库默认权限问题

前言

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

问题描述

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

test2用户权限

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

test2操作test库

为什么会这么奇怪呢?如果没有任何权限,应该不能做任何操作才对,怎么能在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表,得到如下信息:

mysql.db表

可以看到,对于test库以及’test_’开头的库,User字段为空,意味着所有的用户都可以对其进操作(权限字段为Y的那些操作),包括那些没有权限的用户。

  • 可以看到默认情况下,初始化的mysql环境中mysql.db表默认包含的2行test数据库相关的配置,导致任意用户可以随意操作test或者test_开头的数据库

mysql.db表

深入问题

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

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

变量定义

创建系统表

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

初始化系统表

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

后记

还有两个遗留问题:

  • 一直以来,MySQL为什么对test库及test_开头的库的权限如此’开放’呢?

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

不管怎样,鉴于此,在使用MySQL时,还是需要注意:

  • 正式环境千万别使用test数据库或者创建test_开头的数据库来存储业务数据;
  • 对用户的权限进行测试、验证的时候,千万别去test数据库,这可能误导你;
  • 如果想彻底避免以上问题,可以将mysql.db中test相关的数据delete掉;

参考链接

如果对您有帮助