MySQL管理——授权系统

2023-08-31 14:49:26 浏览数 (1)

MySQL的授权系统的一个重要功能是为数据库分配具有权限的用户。当用户通过认证后,MySQL将通过下记问题验证用户的权限:

  • 当前的用户是谁?
  • 用户具有哪些权限?
  • 权限的应用范围

DBA必须为用户配置正确的权限用于授权工作。MySQL的用户权限适用于不同的范围级别,包括,全局、数据库、表、列,及存储程序。为用户或角色授权时,需要考虑他们的访问要求:

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

管理员权限

管理员权限在全局范围内赋予,允许用户进行下记活动:

  • FILE:从主机的文件系统中的文件读取/写入SQL语句执行。
  • PROCESS:使用“SHOW PROCESSLIST”语句查看全部客户端正在执行的语句。
  • SHOW DATABASES:列出全部的数据库。
  • SHUTDOWN:使用“SHUTDOWN”或“RESTART”语句关闭或重启MySQL服务器。
  • RELOAD:执行“FLUSH”语句重新加载日志和权限表。
  • CREATE ROLE, CREATE TABLESPACE, CREATE USER,DROP ROLE, REPLICATION CLIENT
  • SUPER:SUPER权限允许云和执行服务器级别的任务,包括设置全局变量、控制日志和复制、断开客户端连接等。

上记管理员权限,涉及危及安全、访问隐私数据,或令服务器拒绝服务,因此需要确保为正确的账户赋予该权限。

动态权限

动态权限是服务器启动时或通过组件、插件定义的权限。为用户在有限的范围内赋予动态权限以代替“SUPER”权限,以执行最小权限原则。动态权限存储在mysql.global_grants表中,例如:

AUDIT_ADMIN:在审计日志插件中配置审计日志

FIREWALL_ADMIN:在防火墙插件中管理防火墙规则

GROUP_REPLICATION_ADMIN:配置、启动、停止组复制

ROLE_ADMIN:授予和撤销角色,并配置“mandatory_roles”变量值

REPLICATION_SLAVE_ADMIN:配置从服务器,并启动/停止复制功能

SYSTEM_VARIABLES_ADMIN:使用“SET GKIBAL”和“SET PERSIST”语句更改全局系统变量。

“GRANT”和“REVOKE”

DBA通过“GRANT”语句赋予权限,通过“REVOKE”语句撤销权限。“GRANT”语句可以为用户和角色授权,例如,

代码语言:javascript复制
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
GRANT 'role1', 'role2' TO 'user1'@'localhost', 'user2'@'localhost';
GRANT SELECT ON world.* TO 'role3';

语句中包含需要授予的权限,及权限的范围。权限范围如下:

  • 全局:*.*
  • 数据库:db_name.*
  • 表:db_name.table_name
  • 存储程序:db_name.routine_name

数据库级别的权限包括, CREATE, DROP, EVENT, GRANT OPTION, LOCK TABLES, 及REFERENCES。表级别的权限包括, ALTER, CREATE VIEW, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, REFERENCES, SELECT, SHOW VIEW, TRIGGER, 及 UPDATE。注意,表级别的权限不适用于“CREATE TEMPORARY TABLE”创建的表。存储程序中的权限包括, ALTER ROUTINE, CREATE ROUTINE, EXECUTE, 及GRANT OPTION。

此外,可以为用户和角色赋予表中列的权限,例如,

代码语言:javascript复制
GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';

DBA可以通过使用“SHOW GRANTS”语句查看赋予的权限,例如,

代码语言:javascript复制
mysql> SHOW GRANTS FOR u3;
 ---------------------------------------------------- 
| Grants for u3@%                                    |
 ---------------------------------------------------- 
| GRANT SELECT, INSERT, UPDATE ON *.* TO `u3`@`%`    |
| REVOKE INSERT, UPDATE ON `schema1`.* FROM `u3`@`%` |
| REVOKE SELECT ON `schema2`.* FROM `u3`@`%`         |
 ---------------------------------------------------- 

REVOKE语句可以撤销用户的全部或部分权限,例如,一个用户具有SELECT,DELETE,INSERT和UPDATE权限,如果DBA需要更改该用户的权限,使其仅具有SELECT权限,则执行下记语句:

代码语言:javascript复制
REVOKE DELETE, INSERT,UPDATE ON world.* FROM 'user1'@'localhost';

部分撤销

该功能在8.0.16版本加入,使用时需开启“partial_revokes”系统变量。该功能允许在全局范围内授权,并撤销一部分schema的权限。例如,

代码语言:javascript复制
mysql> CREATE USER u1;
mysql> GRANT SELECT, INSERT ON *.* TO u1;
mysql> REVOKE INSERT ON world.* FROM u1;

注意,MySQL的授权系统无法为一个指定的对象(例如,数据库,表等)分配一个密码,也无法显示地拒绝一个指定的用户访问指定的对象(可以通过撤销部分权限在schema级别实现),并且无法实现行级别的授权。

0 人点赞