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级别实现),并且无法实现行级别的授权。