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

时间:2012-02-08 22:17:06

标签: mysql mysql-management mysql5 mysql-5.0

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

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

我在mysql.users中对用户运行了一个show grants。在mysql.users中,用户是user@xxx.xxx.xxx.xx,当我运行show grants时,它表示GRANT USAGE到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 个答案:

答案 0 :(得分:3)

不要担心。

mysql.user表可以缓解所有数据库的特定全局权限。

如果用户被限制在特定数据库中,则只能在mysql.db表中看到特定于数据库的授权。限制在数据库中的用户不需要SUPER,PROCESS,SHUTDOWN和这些权限。

如果您创建具有全局权限的用户(从而将用户登陆到mysql.user),则无法撤消全局权限以将用户降级为特定数据库。如果您尝试使用REVOKE命令执行此操作,您将在mysql.user中看到所有列中的原始Y值以及mysql.db中具有数据库特定权限的Y值的同一用户的用户。

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

以下是基于评论的示例

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二进制日志以及类似的事情。

除非您希望用户从OS命令行用户mysqladmin客户端程序关闭mysql,否则用户不需要SHUTDOWN权限。

要复制您正在寻找的私人信息,

  • 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 Grants,您可以执行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