2021-05-03 09:33:54
MySQL的权限管理通过GRANT和REVOKE命令实现,其核心是遵循最小权限原则,确保用户仅拥有完成其任务所必需的最低权限。这一机制不仅能防止未授权访问,还能降低安全风险、保障系统稳定性,并满足合规性要求。
GRANT语句用于授予用户权限,支持从全局到列级别的多层次控制,并可指定用户来源和密码。其基本语法如下:
GRANT privileges ON database.table TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION];*.*:所有数据库和表。
database.*:指定数据库的所有表。
database.table:指定数据库的指定表。
database.table.column:指定表的特定列(最细粒度)。
全局权限 (.):作用于所有数据库、所有表。
ALL PRIVILEGES:授予用户所有权限,通常只用于DBA或高度信任的维护账户,且最好限制其连接来源(如localhost)。
SUPER:允许执行管理操作,如停止服务器、更改全局变量,非常危险,极少授予普通用户。
PROCESS:允许查看所有用户的进程。
实践场景:DBA账户创建时使用ALL PRIVILEGES ON *.*。
数据库权限 (database.*):作用于指定数据库的所有表。
CREATE、ALTER、DROP:创建、修改、删除数据库或表。
INSERT、UPDATE、DELETE、SELECT:数据操作权限。
CREATE VIEW、SHOW VIEW:创建和查看视图。
CREATE ROUTINE、ALTER ROUTINE、EXECUTE:存储过程和函数的权限。
实践场景:应用程序连接数据库,通常授予INSERT、UPDATE、DELETE、SELECT权限到其对应的业务数据库;开发人员需要对特定数据库进行表结构修改,可以授予CREATE、ALTER、DROP。
表权限 (database.table):作用于指定数据库的指定表。
权限类型与数据库权限类似,但更精细。
实践场景:某个报表工具只需要读取orders表的数据,可以授予SELECT ON sales_db.orders;一个微服务只负责更新用户状态,可以授予UPDATE ON user_db.users。
列权限 (database.table.column):对指定表的特定列授予SELECT、INSERT、UPDATE权限。
实践场景:较少使用,但当需要对敏感信息(如工资、电话号码)进行更细粒度的控制时会派上用场。比如,某个部门的员工只能查看用户ID和姓名,不能查看电话号码。
REVOKE语句用于撤销用户权限,需及时处理离职或变更用户的权限,防止权限滥用。其基本语法如下:
REVOKE privileges ON database.table FROM 'user'@'host';(注意:DROP USER会同时删除用户及其所有权限,但先REVOKE可以作为一种预防性措施,确保权限被正确处理,尤其是在复杂或有级联授权的情况下。)
这仅仅是阻止了admin_user未来再授予权限的能力。如果admin_user之前已经把SELECT权限授予了report_user,那么report_user的SELECT权限并不会因此而消失。这需要我们手动去跟踪和撤销。
示例MySQL的权限管理是一个动态的过程,随着业务的发展和人员的变动,权限矩阵也会不断演进。我们需要一套清晰的流程来处理权限的申请、审批、授予和撤销,而不是仅仅依赖于零散的命令执行。这才能真正避免权限滥用,确保数据库的安全防线坚不可摧。