2

我发现了 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     |
+----------+------------+------------+
4

1 回答 1

2

不用担心。

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 二进制日志等。

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

要复制您正在寻找的 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-grantspt-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
于 2012-02-08T22:23:31.700 回答