【MySQL】MySQL权限管理

  • 权限范围
    • 管理权限
    • 动态权限
  • 授权
    • 显示 GRANT 权限
  • 撤销权限
  • 激活角色
    • 在服务器级别激活角色
    • 在用户级别激活角色
    • 在会话级别激活角色
  • 感谢

在上一篇文章【MySQL】MySQL里的用户账户和角色是什么?如何管理?中,我们了解了MySQL中用户与角色的基本管理,包括创建、删除、查看等操作。这篇文章我们来看下MySQL里对用户和角色的权限管理。

权限范围

MySQL允许我们在不同级别向用户帐户授予多种类型的权限。
也就是限制这个用户在什么范围内能做哪些事儿。

访问级别有:

  • Global 任何数据库中的任何表
  • Database 针对特定的数据库
  • Table 针对特定的表
  • Column 针对表中特定的列
  • Stored routine 针对特定的存储例程(一种数据库对象,用于封装一系列的SQL语句和逻辑操作)

根据不同的访问要求的用户权限:

  • 只读用户:全局、数据库或表级别权限,例如 SELECT
  • 修改数据库的用户:全局、数据库或表级别权限,例如 INSERT、UPDATE、DELETE、 CREATE、ALTER 和 DROP
  • 管理用户:全局级别权限,例如 FILE、 PROCESS、SHUTDOWN 和 SUPER

管理权限

在全局级别授予管理权限可以启用以下活动:

  • FILE:允许运行 SQL 语句,在服务器主机文件系统中读写文件
  • PROCESS:允许使用 SHOW PROCESSLIST 语句查看客户端正在执行的所有语句
  • SHOW DATABASES:允许使用 SHOW DATABASES 语句列出所有数据库信息
  • SHUTDOWN:允许使用 SHUTDOWN 和 RESTART 语句、mysqladmin shutdown 命令和mysql_shutdown() C API 函数
  • RELOAD:允许执行 FLUSH 语句以重新加载日志和权限表

动态权限

动态权限是在服务器启动期间或由服务器组件或插件定义的运行时权限。 部分动态权限包括:

  • AUDIT_ADMIN:允许在 audit_log 插件中配置审计日志设置
  • FIREWALL_ADMIN:允许在 MYSQL_FIREWALL 插件中管理防火墙规则
  • GROUP_REPLICATION_ADMIN:允许配置、启动和停止组复制
  • ROLE_ADMIN:允许授予和撤销角色并设置 mandatory_roles 系统变量的值
  • REPLICATION_SLAVE_ADMIN:允许配置从属服务器并启动和停止复制
  • SYSTEM_VARIABLES_ADMIN:允许使用 SET GLOBAL 和 SET PERSIST 语句更改全局系统变量

授权

我们使用GRANT 语句为 MySQL 用户帐户和角色分配权限或角色。

GRANT 语句的子句包括:

  • 要授予的权限
    • 例如:SELECT, UPDATE, DELETE
  • 权限级别:
    • 全局:*.*
    • 数据库:db_name.*
    • 表:db_name.table_name
    • 存储例程:db_name.routine_name
  • 被授予权限的帐户或角色

示例:

下面这条语句将授予本地主机上的kari用户对 “mysql” 数据库中的 “user” 表执行 SELECT 操作的权限。

GRANT SELECT(user,host) ON mysql.user TO kari@localhost;

将角色授予 MySQL 用户帐户和其他角色时, GRANT 语句不带 ON 子句。同时,加上WITH ADMIN OPTION 子句允许用户将角色授予其他用户帐户。

示例:

下面这条语句授予了一个角色 “r_world” 两个其他角色的权限,即 “r_viewer” 和 “r_updater”。这意味着 “r_world” 角色将继承 “r_viewer” 和 “r_updater” 角色的权限,使得具有 “r_world” 角色的用户能够执行这些角色所拥有的权限。

GRANT r_viewer, r_updater TO r_world;

下面这条语句将两个角色 “r_viewer” 和 “r_updater” 的权限授予了用户 “kari” 在 “localhost” 主机上,并使用了 WITH ADMIN OPTION 子句。这意味着用户 “kari” 将获得这两个角色的权限,同时还具有管理这两个角色的能力,即可以将这些角色授予其他用户。这样的操作需要谨慎使用,只应该赋予受信任的管理员,以确保角色的安全性和适用性。

GRANT r_viewer, r_updater TO kari@localhost WITH ADMIN OPTION;

MySQL 的授权功能允许我们细粒度地管理权限,从而确保用户和角色具有适当的权限来执行数据库操作。但请务必谨慎使用,遵循最佳实践,只授予必要的权限,以降低潜在的风险。

显示 GRANT 权限

  • 使用 SHOW GRANTS 显示可以自己的帐户权限。
  • 使用 SHOW GRANTS FOR 指定帐户名称可以查看该帐户的权限。

撤销权限

使用 REVOKE 语句可以从用户帐户和角色中撤销权限和角色。

REVOKE 语句的语法有以下子句:

  • REVOKE 关键字:指定要撤销的权限或角色列表
  • ON 子句:指示要撤销权限的级别,但撤销角色时不需要
  • FROM 子句:指定帐户名或角色名

在发出 REVOKE 之前,一定要使用 SHOW GRANTS 语句来确定要撤销哪些权限和角色,之后再次确认结果是否正确。

示例:

下面这条语句的作用是从用户 ‘Amon’ 在 ‘localhost’ 主机上撤销对 ‘world’ 数据库中所有表执行 DELETE、INSERT 和 UPDATE 操作的权限

REVOKE DELETE, INSERT, UPDATE ON world.* FROM 'Amon'@'localhost';

下面是从用户 ‘Sasha’ 在 ‘localhost’ 主机上撤销所有权限以及授予权限的能力。

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'Sasha'@'localhost';

激活角色

在用户可以利用特定角色授予的权限之前,这些角色需要被激活。激活实际上是为特定用户启用角色,以便他们可以使用其关联的权限。

角色可以在系统的不同级别上被激活:

  • 服务器级别: 可以在服务器级别激活角色。这可能意味着角色可以在整个系统或应用程序中使用
  • 用户级别: 可以为单个用户激活角色。这意味着特定用户被授予了与已激活角色相关联的权限
  • 会话级别: 角色还可以在会话级别激活。会话是用户与系统之间的交互期间。在会话级别激活角色意味着用户可以在会话期间使用关联的权限

用户只能激活已授予他们自己的角色

在服务器级别激活角色

将 activate_all_roles_on_login 系统变量设置为:

  • ON:服务器在登录时激活授予每个帐户的所有角色
  • OFF (默认值):服务器在登录时激活使用 SET DEFAULT ROLE 指定的默认角色(如果有的话)

示例:

SET PERSIST activate_all_roles_on_login = ON;

在用户级别激活角色

SET DEFAULT ROLE 语句定义当用户连接到服务器时哪些角色(可以是ALL或NONE)变为活动角色。或者在 CREATE USER 或 ALTER USER 语句中使用 DEFAULT ROLE 子句。

用户级默认角色存储在 mysql.default_roles 授权表中。

示例:

SET DEFAULT ROLE r_viewer, r_updater TO kari@localhost;
ALTER USER kari@localhost DEFAULT ROLE ALL;

在会话级别激活角色

使用 SET ROLE 语句可以修改当前会话中的活动角色列表。 它接受角色列表或以下角色说明符之一:

  • DEFAULT:激活帐户默认角色
  • NONE:禁用所有角色
  • ALL:激活授予该帐户的所有角色
  • ALL EXCEPT:激活授予帐户的所有角色,但指定的角色除外

感谢

好啦,这次的分享就到这里,感谢大家看到这里

你可能感兴趣的:(mysql,数据库)