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 不同的主要内容,如果未能解决你的问题,请参考以下文章