然后,我开始想我应该问每个人这个问题:
多年来,我注意到在安装 MySQL 5.0+ 后,mysql.db
会填充两个条目,允许匿名用户访问测试数据库。
您可以通过运行以下查询来查看它:
mysql> select * from mysql.db where SUBSTR(db,1,4) = 'test'\G
*************************** 1. row ***************************
Host: %
Db: test
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
*************************** 2. row ***************************
Host: %
Db: test\_%
User:
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Grant_priv: N
References_priv: Y
Index_priv: Y
Alter_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: N
Execute_priv: N
2 rows in set (0.00 sec)
这些条目是否mysql.db
存在安全风险,如果是,为什么默认将它们添加到新安装中?
更新 2013-06-14 10:13 EDT
今天早上有人否决了我的问题,我真的不明白。鉴于此事件,这就是我花时间进行反驳的原因:
本周我在他们的 Staging Cluster 中为一个客户端安装了 MySQL 5.6.12。我决定检查一下这是否仍然是一个持续存在的问题:
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.12-log |
+------------+
1 row in set (0.00 sec)
mysql> select db,user,host from mysql.db where LEFT(db,4)='test';
+---------+------+------+
| db | user | host |
+---------+------+------+
| test | | % |
| test\_% | | % |
+---------+------+------+
2 rows in set (0.10 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2013-06-14 10:10:13 |
+---------------------+
1 row in set (0.00 sec)
mysql>
你猜怎么着?直到今天这仍然是个问题!!!
故事的寓意:请在安装后立即检查您的mysql.db
并删除匿名登录并立即删除这些测试条目mysql.db
。
请注意MySQL 5.0 认证学习指南
在第 498 页第 6 段的要点中说:
要摆脱这些不良条目,请运行以下命令:
正如@DTest 在他对该问题的评论中提到的那样,您也可以为您运行mysql_secure_installation。
如果匿名用户可以远程登录 MySQL,则可以发起简单的磁盘攻击来破坏 mysql 安装。这是一个例子:
运行 insert 30 次,你得到一个 7GB 的表
mysql.db
MySQL AB 尚未完全记录保护 mysql 安装的严重性,我认为 Oracle 今天没有兴趣这样做。
更新 2012-02-18 16:45 EDT
@atxdba 的评论建议只运行 'DROP DATABASE test;' 应该是触摸 mysql.db 的首选方法。删除命名的数据库
test
只会删除打开潜在安全漏洞管道的数据库。请注意此查询:
基于此,匿名用户可以完全访问以下数据库:
虽然匿名用户无法完全访问以下数据库:
Test
不同test
,但对于在 Windows 中运行的 MySQL 仍然存在问题)你必须记住这个基于
mysql.db
表格的微妙规则。如果您不记得这一点,创建一个名为test
或前 5 个字符为的数据库名称的测试数据库test_
将重新打开相同类型的安全漏洞。不必记住这些事情的最安全方法是在初始安装后运行这些行:
然后任何名称的任何数据库都可以进行适当的身份验证设置。您仍然可以随时运行这两行。
更新 2012-02-24 15:20 EDT
为了公开展示匿名用户的危险
mysql.db
,我想创建一个只有使用权限的用户。我将在我的桌面上使用 MySQL 5.5.12
首先看一下mysql.db
据此,任何匿名的 Joe 都可以访问这些数据库。
我将创建一个数据库 test_mysqldb
让我们创建一个名为 vanilla@localhost 的普通用户(无密码)
接下来,从 DOS 命令行,让我们连接到 mysql 模式
好,很好。这就是我所期望的。
接下来,从 DOS 命令行,让我们连接到 test_mysqldb 模式,创建一个表,并用数字加载它
你看见了吗?具有
USAGE
权限的用户可以在测试数据库中创建一个表并用数据填充它。这是一个明显而现实的危险。这就是为什么我强烈建议从 mysql.db 中删除这些测试条目以阻止匿名用户访问测试数据库或访问新创建的测试数据库(通过在 default 下创建一个子文件夹datadir
)。提醒一下,这就是你的做法:
更新 2013-09-14 20:05 EDT
为了证明
DELETE FROM mysql.db WHERE SUBSTR(db,4) = 'test' AND user='';
实际工作,我今天在 MySQL 5.6.13 上运行了这个:就像公共服务公告一样,请运行
或者只是运行mysql-secure-installation并将这个潜在的危险放在床上。