首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL显示授权...与mysql.db和information_schema.schema_privileges不同

MySQL显示授权...与mysql.db和information_schema.schema_privileges不同
EN

Stack Overflow用户
提问于 2012-02-09 06:17:06
回答 1查看 6.6K关注 0票数 2

我发现了user@host和mysql.db表的show grants之间的区别。为什么会这样呢?

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

我对mysql.users中的用户进行了一次授权展示。在mysql.users中,用户是user@xxx.xx,当我运行show grants时,它显示GRANT USAGE TO user@xxx.xx

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

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

怎么回事?

编辑-更深层次的解释:

这就是我所拥有的:

代码语言:javascript
复制
show grants for 'myuser'@'xxx.xxx.xxx.xxx';

它返回:

代码语言:javascript
复制
GRANT USAGE ON *.* TO 'myuser'@'xxx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD 'xxxxxxxxxxxxxxxxx'

如果我运行:

代码语言:javascript
复制
select host,db,user from mysql.db where user='myuser';

我得到了:

代码语言:javascript
复制
+----------+------------+------------+
| host     | db         | user       |
+----------+------------+------------+
|xxx.xxx.% | somedb     | myuser     |
+----------+------------+------------+
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-09 06:23:32

别担心。

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

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

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

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

下面是一个基于注释的示例

代码语言:javascript
复制
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数据库。

用户不需要权限,除非您想让用户看到进程列表中的所有进程,甚至是属于其他进程的进程。

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

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

要复制您正在查找的priv,

将输出编辑为

  • SHOW GRANTS FOR 'user'@'xxx.xxx.xxx.%';
  • Copy to xxx.xxx.xxx.xx
  • Add a semicolon
  • Paste

将输出编辑为文本文件

好的,让我们破解一下:

代码语言:javascript
复制
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。使用移植mysql授权要好得多。

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

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9202372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档