【问题标题】:MySql : Grant read only options?MySql:授予只读选项?
【发布时间】:2013-11-30 22:33:18
【问题描述】:

我有一个用户,我想授予他对 db 架构的所有 READ 权限。

一种方法是这样的:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

有没有办法将所有读取操作分组到 grant 中?

【问题讨论】:

  • 特权是SHOW VIEW,而不是SHOW_VIEW,但您不需要将其授予用户,除非您希望他们能够在视图上SHOW CREATE VIEW...他们可以从只有SELECT 权限的视图中进行选择。 “将所有读取操作分组到授权中”是什么意思?
  • 如果有任何单一权限代表数据库上的所有读取操作。我知道他们提供了细粒度的访问,但方便的高级抽象会对我们有所帮助。

标签: mysql sql


【解决方案1】:

如果有任何单一权限代表数据库上的 ALL READ 操作。

这取决于您如何定义“全部阅读”。

从表和视图中“读取”是SELECT 权限。如果这就是您所说的“全部阅读”,那么是的:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

但是,听起来您的意思是“看”一切,“看但不摸”的能力。所以,下面是我想到的其他类型的阅读:

“阅读”视图的定义是SHOW VIEW权限。

“读取”其他用户当前正在执行的查询列表是PROCESS 权限。

“读取”当前复制状态是REPLICATION CLIENT 权限。

请注意,根据相关用户的性质,任何或所有这些可能会暴露比您打算暴露的更多的信息。

如果这是您想要阅读的内容,您可以将其中任何一个(或 the available privileges 的任何其他)组合到一个 GRANT 语句中。

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

但是,没有一个单一的特权可以授予其他特权的某些子集,这就是您所要求的。

如果您手动执行操作并寻找一种更简单的方法来解决此问题,而无需记住您通常为特定类别的用户所做的确切授权,您可以查找该语句以重新生成类似用户的授权,并且更改它以创建具有类似权限的新用户:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

更改 'not_leet' 和 'localhost' 以匹配您要添加的新用户以及密码,将生成可重复使用的 GRANT 语句来创建新用户。

当然,如果您想要一个操作来设置和授予用户有限的权限集,并且可能删除任何不值得的权限,可以通过创建一个封装了您想要执行的所有操作的存储过程来完成。在过程主体中,您将使用动态 SQL 构建 GRANT 语句和/或直接操作授权表本身。

this recent question on Database Administrators 中,发帖人希望非特权用户能够修改其他用户,这当然不是通常可以做到的事情——一个可以修改其他用户的用户,几乎按照定义,不能然而,存储过程在这种情况下提供了一个很好的解决方案,因为它们在其DEFINER 用户的安全上下文中运行,允许在该过程上具有EXECUTE 权限的任何人临时承担升级权限以允许他们做程序完成的具体事情。

【讨论】:

  • 谢谢。除了很好的答案,我还喜欢你的密码。 :)
  • 值得注意:PROCESS 和 REPLICATION CLIENT 是“全局”权限类型,因此在使用“每个数据库”排除项定义时语法将失败。 GRANT PROCESS ON mydb.* 无效,但 GRANT PROCESS ON *.* 就可以了。
  • GRANT SELECT ON db_name.* TO 'demo'@'%' WITH GRANT OPTION;
  • SHOW DATABASES 呢?
  • @MarinosAn 始终允许所有用户执行SHOW DATABASES但是, 唯一返回的数据库是 information_schema,除非用户对任何其他(或所有其他)数据库具有任何权限,在这种情况下,这些数据库也包含在列表中。
【解决方案2】:
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

这将为包括视图在内的所有数据库创建一个具有SELECT 权限的用户。

【讨论】:

    【解决方案3】:

    您可以授予用户的各种权限是

    ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
    CREATE- allows them to create new tables or databases
    DROP- allows them to them to delete tables or databases
    DELETE- allows them to delete rows from tables
    INSERT- allows them to insert rows into tables
    SELECT- allows them to use the Select command to read through databases
    UPDATE- allow them to update table rows
    GRANT OPTION- allows them to grant or remove other users' privileges
    

    要为特定用户提供权限,您可以使用此框架:

    GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;
    

    我发现this 的文章很有帮助

    【讨论】:

    • 如果用户甚至是远程访问,那么您应该将localhost 替换为%。所以你将拥有:GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'%’ IDENTIFIED BY '[password]';
    【解决方案4】:

    注意 MySQL 8 不同

    您需要分两步完成:

    CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
    GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
    flush privileges;
    

    【讨论】:

    • 这是唯一对我有用的解决方案。正如您所说,其他解决方案似乎已过时。感谢您提供此更新的解决方案。
    【解决方案5】:

    我找到了here 的分步指南。

    为 MySQL 创建一个只读数据库用户帐户

    在 UNIX 提示符下,运行 MySQL 命令行程序,然后键入以下命令以管理员身份登录:

    mysql -u root -p
    

    键入 root 帐户的密码。 在 mysql 提示符下,执行以下步骤之一:

    要让用户从任何主机访问数据库,请输入以下命令:

    grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';
    

    如果收集器将安装在与数据库相同的主机上,请键入以下命令:

    grant select on database_name.* to 'read-only_user_name' identified by 'password';
    

    此命令仅授予用户从本地主机对数据库的只读访问权限。 如果您知道将安装收集器的主机的主机名或 IP 地址,请键入以下命令:

    grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';
    

    主机名必须可由 DNS 或本地主机文件解析。 在 mysql 提示符下,键入以下命令:

    flush privileges;
    

    输入quit

    以下是示例命令和确认消息的列表:

    mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
    by 'pogo$23';
    Query OK, 0 rows affected (0.11 sec)
    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)
    mysql> quit
    

    【讨论】:

      【解决方案6】:

      甚至用户也得到了答案,@Michael - sqlbot 在他的帖子中已经很好地涵盖了大部分要点,但缺少一点,所以只是试图涵盖它。

      如果您想向简单用户(非管理员类型)提供读取权限-

      GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';
      

      注意:这里需要EXECUTE,以便用户可以读取数据,如果有一个产生报告的存储过程(选择语句很少)。

      将 localhost 替换为用户将从其连接到 DB 的特定 IP。

      额外的读取权限是-

      • SHOW VIEW : 如果你想显示视图模式。
      • REPLICATION CLIENT:如果用户需要检查复制/从属状态。 但需要授予所有数据库的权限。
      • PROCESS : 如果用户需要检查正在运行的进程。将与所有人合作 仅限数据库。

      【讨论】:

        【解决方案7】:

        如果您希望在授予读取权限后只读视图,您可以在视图 DDL 定义中使用 ALGORITHM = TEMPTABLE。

        【讨论】:

          猜你喜欢
          • 2017-04-07
          • 1970-01-01
          • 2019-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-18
          相关资源
          最近更新 更多