MySQL Show Grants for... 与 mysql.db 和 information_schema.schema_privileges 不同

Posted

技术标签:

【中文标题】MySQL Show Grants for... 与 mysql.db 和 information_schema.schema_privileges 不同【英文标题】:MySQL Show Grants for... is different than mysql.db and information_schema.schema_privileges 【发布时间】:2012-03-01 10:08:25 【问题描述】:

我发现 user@host 和 mysql.db 表的显示授权之间存在差异。为什么是这样?

我该如何解决这个问题?我们担心安全问题。

我对 mysql.users 中的用户运行了一个 show grants。在 mysql.users 中,用户是 user@xxx.xxx.xxx.xx,当我运行 show grants 时,它说 GRANT USAGE TO user@xxx.xxx.xxx.xx

这让我很担心,因为这个用户似乎也能够访问数据库。

当我查看 mysql.db 和 information_schema.schema_privileges 时,我可以看到与拥有 xxx.xxx.% 主机的用户相同的用户,并且可以完全访问该数据库。

什么给了?

编辑 - 更深入的解释:

这是我所拥有的:

show grants for 'myuser'@'xxx.xxx.xxx.xxx';

返回:

GRANT USAGE ON *.* TO 'myuser'@'xxx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD 'xxxxxxxxxxxxxxxxx'

如果我跑步:

select host,db,user from mysql.db where user='myuser';

我明白了:

+----------+------------+------------+
| host     | db         | user       |
+----------+------------+------------+
|xxx.xxx.% | somedb     | myuser     |
+----------+------------+------------+

【问题讨论】:

【参考方案1】:

别担心。

mysql.user 表减轻了对所有数据库的特定全局权限。

如果用户受限于特定数据库,您将只能在 mysql.db 表中看到特定于数据库的授权。受限于数据库的用户不需要 SUPER、PROCESS、SHUTDOWN 和类似的权限。

如果您创建具有全局权限的用户(从而将用户登录到mysql.user),您不能仅将用户降级到特定数据库而撤销全局权限。如果您尝试使用 REVOKE 命令执行此操作,您将看到 mysql.user 中的用户在所有列上都具有原始 Y 值,而 mysql.db 中的同一用户在数据库特定权限上具有 Y 值。

您必须完全删除用户并以较低权限创建新用户。

这是一个基于 cmets 的示例

mysql> show grants for advdb@'%';
+-----------------------------------------------------------------------------+
| Grants for advdb@%                                                          |
+-----------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'advdb'@'%' IDENTIFIED BY PASSWORD '................' |
| GRANT ALL PRIVILEGES ON `advertpro`.* TO 'advdb'@'%'                        |
+-----------------------------------------------------------------------------+

GRANT USAGE 只是让您知道身份验证所涉及的 MD5 密码(如果密码不为空)。请注意,advdb 可以从任何 IP 地址登录,并且只能访问 advertpro 数据库。

用户不需要PROCESS 权限,除非您希望用户查看进程列表中的所有进程,甚至是属于其他人的进程。

用户不需要SUPER 权限,除非您希望用户写入只读 mysql 实例、启动和停止复制、zap 二进制日志等。

用户不需要SHUTDOWN 权限,除非您希望用户从操作系统命令行用户mysqladmin 客户端程序关闭mysql。

要复制您要查找的 priv,

SHOW GRANTS FOR 'user'@'xxx.xxx.xxx.%'; 将输出复制到文本文件 将主机编辑为 xxx.xxx.xxx.xx 添加分号 将其粘贴到其他服务器

好吧,让我们破解一下:

UPDATE mysql.db
    SET host='xxx.xxx.xxx.xxx'
    WHERE user='myuser'
    AND host='xxx.xxx.%'
    AND db='somedb';
FLUSH PRIVILEGES;

应该这样!!!

要在 SQL 中转储 MySQL 授权,您可以执行 pt-show-grants 使用pt-show-grants 移植mysql 授权要好得多。

这是我个人对 pt-show-grants 所做的模拟

mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -hhostaddr -umyuserid -pmypassword --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql

【讨论】:

是的,但我的问题是,“show grants for”只显示“grant usage on”,而不是用户对数据库拥有所有权限。* 这对于仅限于特定数据库的用户来说是正确的。 您应该会看到两行:一行来自 GRANT USAGE,另一行用于 DB privs GRANT USAGE 只是让您知道身份验证所涉及的 MD5 密码(如果密码不为空)。 谢谢。我意识到这一点。我的观点是它没有第二行。并且使用行中的主机与 mysql.db 和信息模式中列出的主机不同。没有其他同名用户。

以上是关于MySQL Show Grants for... 与 mysql.db 和 information_schema.schema_privileges 不同的主要内容,如果未能解决你的问题,请参考以下文章

[MySQL]查看用户权限与GRANT用法

MySQL导出所有账号的GRANTS语句

20. pt-show-grants

mysql root权限优化后没有grant权限

ORACLE导入导出命令 GRANTS=Y会是啥结果

mysql授权