【问题标题】:Revoke access for one of the many databases in MySQL撤销对 MySQL 中众多数据库之一的访问权限
【发布时间】:2020-08-19 04:59:40
【问题描述】:

我在服务器上有多个 MySQL 数据库,DB 1、mysql 和 DB 2。我创建了一个用户用户 A。我只想撤销用户 A 对单个数据库(例如 mysql)的访问权限,因为这将有多个日志表。我尝试了无效的基本 REVOKE 语法。

revoke select on mysql.* from user@localhost;

请注意,撤销应该只发生在 mysql DB 而不是 DB 1 和 DB 2。

【问题讨论】:

  • 你能显示SHOW GRANTS FOR user@localhost;的输出吗
  • +----------------------------------------- -------------+ |授予 user@localhost | +-------------------------------------------------- -----+ |将 . 上的所有权限授予 'user'@'localhost' | +-------------------------------------------------- -----+ 1 行(0.00 秒)
  • 请添加您的 MySQL 版本。在 8.0.16 之前,您不能这样做,请参阅 How to “subtract” privileges in MySQL,因此您需要删除“所有”权限,然后为每个 db 添加权限。
  • @Solarflare,它的“Ver 14.14 Distrib 5.7.31”
  • 另外,根据您提供的帮助链接,“REVOKE INSERT, UPDATE ON mysql.* FROM user@localhost;”,它显示“ERROR 1141 (42000): Unknown error 1141”

标签: mysql


【解决方案1】:

Before MySQL 8.0.16,你不能substract privileges

用户对数据库、表、列或例程所拥有的权限由每个权限级别(包括全局级别)的帐户权限的逻辑 OR 相加形成。无法通过在较低级别缺少该特权来拒绝在较高级别授予的特权。

尝试这样做应该会给你一个错误

错误代码:1141。主机“localhost”上没有为用户“user”定义此类授权

您必须单独为所有数据库添加权限,例如专门允许 db1 和 db2,而不是允许全部和删除 mysql。

Starting with MySQL 8.0.16,您终于可以删除对单个数据库的访问权限(但目前仅在数据库上,而不是在单个表或列上):

从 MySQL 8.0.16 开始,如果启用了 partial_revokes 系统变量,则可以通过为特定数据库撤销在全局级别授予的权限来显式拒绝授予的权限:

GRANT SELECT, INSERT, UPDATE ON *.* TO u1;
REVOKE INSERT, UPDATE ON db1.* FROM u1;

partial_revokes 系统变量必须为此设置:

启用此变量可以部分撤销权限。具体来说,对于在全局级别具有权限的用户,partial_revokes 可以撤销特定模式的权限,同时保留其他模式的权限。例如,可以限制具有全局 UPDATE 权限的用户在 mysql 系统模式上行使此权限。 (或者,换一种说法,用户可以对除 mysql 架构之外的所有架构行使 UPDATE 权限。)从这个意义上说,用户的全局 UPDATE 权限被部分撤销。

粗体标记的部分正是你想要做的。

【讨论】:

  • 谢谢,这真的很有帮助。只是一个基本问题:默认情况下,用户是否对 MySQL 中的 mysql DB 具有插入/更新/删除权限?
  • 默认情况下,用户根本没有权限,您必须明确授予他们(例如添加授权)。就在 8.0.16 之前,你必须为每个数据库添加一个权限(并且不能更短地表示“除 mysql 之外的所有数据库”)
  • 如果我提到“GRANT ALL PRIVILEGES ON . TO user@localhost”,这是否也为该用户提供了 mysql DB 的更新权限?或者是否有限制不能由 root 以外的任何其他用户更新 mysql DB 及其表?
  • 是的,GRANT ALL PRIVILEGES ON *.* TO 创建了一个超级用户,它可以做任何事情,包括 mysql 数据库中的所有事情。 mysql 数据库与系统中的任何其他数据库没有什么不同(嗯,至少在授权等方面)。
  • 如果我们有一个加密的数据库并且我们希望存储加密密钥,密钥环,我们在哪里更新我们的数据库的密钥环路径??
猜你喜欢
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2013-04-20
  • 2021-07-07
  • 2016-05-04
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
相关资源
最近更新 更多