10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.9 mb
PDF (A4)- 42.0 mb
手册页(TGZ)- 266.1 kb
手册页(邮政编码)- 376.0 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

6.2.12使用部分撤销的权限限制

在MySQL 8.0.16之前,除了某些模式外,不可能授予应用于全局的特权。从MySQL 8.0.16开始,如果partial_revokes启用系统变量。具体来说,对于拥有全局级别特权的用户,partial_revokes允许撤销特定模式的特权,同时保留其他模式的特权。这样施加的特权限制可能对具有全局特权但不允许访问某些模式的帐户的管理有用。例如,可以允许帐户修改表中的表以外的任何表mysql系统模式。

请注意

为简便起见,创建用户这里显示的语句不包括密码。对于生产使用,总是分配帐户密码。

使用部分撤销

partial_revokes系统变量控制是否可以对帐户设置特权限制。默认情况下,partial_revokes禁用,并试图部分撤销全局特权会产生错误:

CREATE USER u1;mysql>授权SELECT, INSERT *。* u1;mysql> REVOKE INSERT ON world。从u1 *;错误1141(42000):在主机“%”上没有为用户“u1”定义这样的授权

允许的撤销操作,使partial_revokes

SET PERSIST partial_revokes = ON;

设置保存为正在运行的MySQL实例设置一个值。它还会保存该值,使其保留到后续服务器重新启动时。要更改正在运行的MySQL实例的值,而不将其保留到后续重启时,请使用全球关键字,而不是坚持.看到第13.7.6.1节“变量赋值的SET语法”

partial_revokes启用后,部分失效成功:

mysql> REVOKE INSERT ON world。从u1 *;mysql> SHOW grant FOR u1;+------------------------------------------+ | 资助u1 @% | +------------------------------------------+ | 格兰特选择、插入*。对' u1 ' @ ' % ' | |撤销插入' world '。*从“u1 `@`%` | +------------------------------------------+

秀奖助金将部分撤销列出为撤销语句。结果表明:u1具有全球选择而且插入特权,除了插入中的表无法执行世界模式。也就是说,通过u1世界表是只读的。

中通过部分调用实现的特权限制被服务器记录mysql.user系统表。如果账户有部分撤销,其User_attributes列值具有限制属性:

mysql> SELECT User, Host, User_attributes->>'$。“从mysql的限制。用户WHERE User_attributes->>'$.Restrictions' <> ''; +------+------+------------------------------------------------------+ | User | Host | User_attributes->>'$.Restrictions' | +------+------+------------------------------------------------------+ | u1 | % | [{"Database": "world", "Privileges": ["INSERT"]}] | +------+------+------------------------------------------------------+
请注意

虽然可以对任何模式强制部分调用,但对mysql系统模式作为防止常规帐户修改系统帐户的策略的一部分尤其有用。看到保护系统帐户免受普通帐户的操纵

部分撤销操作服从以下条件:

  • 可以使用部分撤销对不存在的模式施加限制,但只有在全局授予被撤销的特权时才可以。如果没有全局授予特权,则为不存在的模式撤销该特权会产生错误。

  • 部分调用只应用于模式级别。不能对仅全局应用的特权使用部分撤销(例如文件BINLOG_ADMIN),或用于表、列或例程特权。

  • 在特权分配中,启用partial_revokes导致MySQL解释unescaping的出现_而且模式名中的SQL通配符作为文字字符,就好像它们被转义为\ _而且\ %.因为这改变了MySQL解释权限的方式,所以建议在安装时避免未转义的通配符partial_revokes可能会启用。

如前所述,模式级特权的部分撤销出现在秀奖助金输出为撤销语句。这不同于秀奖助金代表平原级特权:

  • 授予时,模式级特权由它们自己的特权表示格兰特输出中的语句:

    CREATE USER u1;mysql>授权更新mysql。* u1;mysql>授权DELETE ON world。* u1;mysql> SHOW grant FOR u1;+---------------------------------------+ | 资助u1 @% | +---------------------------------------+ | 格兰特使用*。对' u1 ' @ ' % ' | |授权更新' mysql '。给' u1 ' @ ' % ' | |删除' world '。*“u1 `@`%` | +---------------------------------------+
  • 当撤销时,模式级特权就会从输出中消失。它们看起来不像撤销声明:

    mysql> REVOKE UPDATE ON mysql。从u1 *;mysql> REVOKE DELETE ON world。从u1 *;mysql> SHOW grant FOR u1;+--------------------------------+ | 资助u1 @% | +--------------------------------+ | 格兰特使用*。*“u1 `@`%` | +--------------------------------+

当用户授予特权时,授予人对该特权的任何限制都将由被授予人继承,除非被授予人已经拥有该特权而不受限制。考虑以下两个用户,其中一个具有全局变量选择特权:

创建用户u1, u2;授权选择*。* u2;

假设一个管理用户管理全局但部分撤销了吗选择特权:

创建用户admin;mysql> GRANT SELECT ON *。*管理与授予选项;mysql> REVOKE SELECT ON mysql。*管理;mysql> SHOW grant FOR admin+------------------------------------------------------+ | 资助管理 @% | +------------------------------------------------------+ | 格兰特选择*。对“admin”@“%”的权限设置为| |。*从“管理 `@`%` | +------------------------------------------------------+

如果管理奖助金选择在全球范围内u1而且u2,每个用户的结果是不同的:

  • 如果管理奖助金选择在全球范围内u1,谁没有选择首先是特权,u1继承了管理特权的限制:

    mysql> GRANT SELECT ON *。* u1;mysql> SHOW grant FOR u1;+------------------------------------------+ | 资助u1 @% | +------------------------------------------+ | 格兰特选择*。*到' u1 ' @ ' % ' | | REVOKE SELECT ' mysql '。*从“u1 `@`%` | +------------------------------------------+
  • 另一方面,u2已经拥有全局选择没有限制的特权。格兰特只能增加被授权人现有的特权,而不能减少它们,那么如果管理奖助金选择在全球范围内u2u2不继承管理限制:

    mysql> GRANT SELECT ON *。* u2;mysql> SHOW GRANTS FOR u2;+---------------------------------+ | 授予对u2 @% | +---------------------------------+ | 格兰特选择*。*“u2 `@`%` | +---------------------------------+

如果一个格兰特声明中包括一个作为用户子句中,应用的特权限制是对子句指定的用户/角色组合的特权限制,而不是对执行语句的用户的特权限制。有关作为条款,请参阅第13.7.1.6节“GRANT声明”

对授予帐户的新特权的限制被添加到该帐户的任何现有限制中:

CREATE USER u1;mysql>授权SELECT, INSERT, UPDATE, DELETE ON *。* u1;mysql> REVOKE INSERT ON mysql。从u1 *;mysql> SHOW grant FOR u1;+---------------------------------------------------------+ | 资助u1 @% | +---------------------------------------------------------+ | 格兰特选择、插入、更新、删除*。*到' u1 ' @ ' % ' | |撤销插入' mysql '。*从“u1 `@`%` | +---------------------------------------------------------+ 在db2上mysql >撤销删除、更新。从u1 *;mysql> SHOW grant FOR u1;+---------------------------------------------------------+ | 资助u1 @% | +---------------------------------------------------------+ | 格兰特选择、插入、更新、删除*。*对' u1 ' @ ' % ' | |撤销更新,删除' db2 '。从' u1 ' @ ' % 1 ' | |撤销插入' mysql '。*从“u1 `@`%` | +---------------------------------------------------------+

当显式地部分撤销特权(如前所述)和从执行语句的用户或类中提到的用户隐式继承限制时,将应用特权限制聚合作为用户条款。

如果一个帐户在某个模式上有权限限制:

  • 帐户不能将受限制的模式或其中任何对象的权限授予其他帐户。

  • 另一个不具有该限制的帐户可以将受限制的模式或其中的对象的特权授予受限制帐户。假设一个不受限制的用户执行以下语句:

    创建用户u1;授予*上的选择、插入、更新权限。* u1;取消mysql上的SELECT, INSERT, UPDATE。从u1 *;GRANT SELECT ON mysql。用户u1;grant SELECT(Host,User) ON mysql.db TO u1;——授予列权限

    生成的帐户拥有这些特权,能够在受限模式中执行有限的操作:

    mysql> SHOW grant FOR u1;+-----------------------------------------------------------+ | 资助u1 @% | +-----------------------------------------------------------+ | *格兰特选择、插入、更新。取消对“mysql”的SELECT, INSERT, UPDATE。*从“u1 `@`%` | | 格兰特选择(“主机”,“用户”)“mysql”。' db ' TO ' u1 ' @ ' % ' | | GRANT SELECT ' mysql '。“用户”到“u1 `@`%` | +-----------------------------------------------------------+

如果一个帐户对全局特权有限制,则通过以下任何操作取消该限制:

  • 由对权限没有限制的帐户全局授予该帐户权限。

  • 在模式级别授予特权。

  • 全局撤销特权。

考虑一个用户u1谁在全球拥有多个特权,但有限制插入更新而且删除

CREATE USER u1;mysql>授权SELECT, INSERT, UPDATE, DELETE ON *。* u1;mysql>取消插入,更新,删除mysql。从u1 *;mysql> SHOW grant FOR u1;+----------------------------------------------------------+ | 资助u1 @% | +----------------------------------------------------------+ | 格兰特选择、插入、更新、删除*。撤销' mysql '上的INSERT, UPDATE, DELETE操作。*从“u1 `@`%` | +----------------------------------------------------------+

授予全局特权u1从没有限制的帐户删除特权限制。例如,要删除插入限制:

mysql>授权插入* u1;mysql> SHOW grant FOR u1;+---------------------------------------------------------+ | 资助u1 @% | +---------------------------------------------------------+ | 格兰特选择、插入、更新、删除*。删除' mysql '上的更新。*从“u1 `@`%` | +---------------------------------------------------------+

将模式级别的特权授予u1删除权限限制。例如,要删除更新限制:

mysql>授权更新mysql。* u1;mysql> SHOW grant FOR u1;+---------------------------------------------------------+ | 资助u1 @% | +---------------------------------------------------------+ | 格兰特选择、插入、更新、删除*。删除' mysql '上的数据。*从“u1 `@`%` | +---------------------------------------------------------+

撤销全局特权将删除该特权,包括对其的任何限制。例如,要删除删除限制(以取消一切为代价。删除访问):

mysql> REVOKE DELETE ON *。从u1 *;mysql> SHOW grant FOR u1;+-------------------------------------------------+ | 资助u1 @% | +-------------------------------------------------+ | *格兰特选择、插入、更新。*“u1 `@`%` | +-------------------------------------------------+

如果一个帐户同时具有全局和模式级别的特权,则必须在模式级别两次撤销它,以实现部分撤销。假设u1有这些特权,在哪里插入在全球和世界模式:

CREATE USER u1;mysql>授权SELECT, INSERT *。* u1;mysql> GRANT INSERT ON world。* u1;mysql> SHOW grant FOR u1;+-----------------------------------------+ | 资助u1 @% | +-----------------------------------------+ | 格兰特选择、插入*。向' u1 ' @ ' % ' | |授权插入' world '。*“u1 `@`%` | +-----------------------------------------+

撤销插入世界撤销模式级特权(秀奖助金不再显示模式级格兰特声明):

mysql> REVOKE INSERT ON world。从u1 *;mysql> SHOW grant FOR u1;+-----------------------------------------+ | 资助u1 @% | +-----------------------------------------+ | 格兰特选择、插入*。*“u1 `@`%` | +-----------------------------------------+

撤销插入世界再次执行局部撤销全局特权(秀奖助金现在包括模式级撤销声明):

mysql> REVOKE INSERT ON world。从u1 *;mysql> SHOW grant FOR u1;+------------------------------------------+ | 资助u1 @% | +------------------------------------------+ | 格兰特选择、插入*。对' u1 ' @ ' % ' | |撤销插入' world '。*从“u1 `@`%` | +------------------------------------------+

部分撤销与显式模式授予

为了为某些模式提供对帐户的访问,部分调用提供了一种替代方法,即显式授予模式级访问而不授予全局特权。这两种方法各有优缺点。

授予模式级特权而不是全局特权:

  • 添加新模式:默认情况下,现有帐户无法访问该模式。对于应该访问模式的任何帐户,DBA必须授予模式级访问权限。

  • 添加新帐户:DBA必须为帐户应该具有访问权的每个模式授予模式级访问权。

在部分撤销的同时授予全局特权:

  • 添加新模式:该模式可由具有全局特权的现有帐户访问。对于模式应该不可访问的任何这样的帐户,DBA必须添加部分撤销。

  • 添加新帐户:DBA必须授予全局特权,以及对每个受限模式的部分撤销。

使用显式模式级授予的方法对于访问限制在少数模式的帐户更方便。对于对除少数模式外的所有模式具有广泛访问权的帐户,使用部分调用的方法更方便。

禁用部分撤销

一旦启用,partial_revokes如果任何帐户有特权限制,则不能禁用。如果存在,则禁用partial_revokes失败:

禁用partial_revokes当存在限制时,首先必须取消限制:

  1. 确定哪些账户有部分撤销:

    SELECT User, Host, User_attributes->>'$。“从mysql的限制。用户WHERE User_attributes->>'$.Restrictions' <> '';
  2. 对于每个这样的帐户,删除其特权限制。假设前面的步骤显示帐户u1有这些限制:

    [{“数据库”:“世界”、“特权”(“插入”,“删除”)

    限制消除可以通过多种方式进行:

    • 全局授予特权,不受限制:

      允许在*上插入,删除。* u1;
    • 在模式级别授予特权:

      允许在世界上插入,删除。* u1;
    • 全局撤销特权(假设不再需要):

      撤销*上的插入、删除操作。从u1 *;
    • 删除帐户本身(假设它不再需要):

      删除用户u1;

在删除所有特权限制后,可以禁用部分撤销:

SET PERSIST partial_revokes = OFF;

部分撤销和复制

在复制场景下,如果partial_revokes在任何主机上启用,则必须在所有主机上启用。否则,撤销部分撤销全局特权的语句对所有发生复制的主机没有相同的效果,这可能导致复制不一致或错误。