MySQL 作为最流行的开源关系型数据库,其权限体系与用户管理是保障数据安全的核心。无论是面试还是生产运维,深入理解 MySQL 的权限模型、用户管理机制以及安全加固手段,都是必备技能。本文将从权限体系、用户管理、安全加固三个维度展开,并穿插常见面试题,帮助你系统掌握这一主题。
一、MySQL 权限体系概述
MySQL 的权限体系采用 “用户 + 主机” 的组合来标识一个账户,即 user@host。这意味着同一个用户名从不同主机连接,可以被视为不同的账户,拥有不同的权限。
1.1 权限的层级
MySQL 权限可以作用在多个层级上,从全局到列级,粒度逐渐变细:
- 全局层级:作用于整个 MySQL 实例,存储在
mysql.user表中。例如SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、RELOAD、SHUTDOWN等。 - 数据库层级:作用于指定数据库,存储在
mysql.db表中。例如SELECT、INSERT、CREATE等。 - 表层级:作用于指定表,存储在
mysql.tables_priv表中。例如SELECT、INSERT、UPDATE、DELETE、CREATE、DROP等。 - 列层级:作用于指定表的特定列,存储在
mysql.columns_priv表中。例如SELECT(col1)、UPDATE(col2)。 - 子程序层级:作用于存储过程、函数,存储在
mysql.procs_priv表中。例如EXECUTE、ALTER ROUTINE。
1.2 权限验证流程
当客户端发起连接时,MySQL 的验证分为两个阶段:
- 连接验证:根据
user、host和密码验证用户身份。MySQL 会按照mysql.user表中host字段的精确度排序(越具体越优先),匹配第一条记录。 - 请求验证:用户连接成功后,每次执行操作时,MySQL 会检查该用户是否拥有对应权限。检查顺序为:全局权限 → 数据库权限 → 表权限 → 列权限。只要某一层级拥有权限,即可执行。
1.3 常见面试题
Q:MySQL 中 user@host 的匹配规则是什么?
A:MySQL 会先对 mysql.user 表中的记录按 host 字段排序,具体主机名优先于通配符。例如 'user'@'192.168.1.100' 优先于 'user'@'192.168.1.%',而 'user'@'192.168.1.%' 又优先于 'user'@'%'。如果存在多条匹配记录,只有第一条生效。
Q:GRANT 和 REVOKE 的区别?
A:GRANT 用于授予权限,REVOKE 用于回收权限。两者都会更新对应的权限表,并且需要执行 FLUSH PRIVILEGES 才能立即生效(如果直接修改权限表,则必须执行该命令)。
二、用户管理实践
2.1 创建用户
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongP@ssw0rd!';
- 推荐使用
CREATE USER而非GRANT语句隐式创建用户,因为前者更清晰且符合 SQL 标准。 - 密码应满足复杂度要求,避免使用弱密码。
2.2 授权与回收
-- 授予 app_db 数据库的读写权限
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.%';
-- 回收 DELETE 权限
REVOKE DELETE ON app_db.* FROM 'app_user'@'192.168.1.%';
-- 刷新权限
FLUSH PRIVILEGES;
2.3 查看权限
SHOW GRANTS FOR 'app_user'@'192.168.1.%';
2.4 修改密码
ALTER USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'NewStrongP@ss!';
2.5 删除用户
DROP USER 'app_user'@'192.168.1.%';
2.6 常见面试题
Q:FLUSH PRIVILEGES 的作用是什么?什么时候需要执行?
A:该命令会重新加载权限表到内存中。如果使用 GRANT、REVOKE、CREATE USER 等语句修改权限,MySQL 会自动刷新内存,无需手动执行。但如果直接使用 INSERT、UPDATE、DELETE 修改 mysql 库下的权限表,则必须执行 FLUSH PRIVILEGES 才能生效。
Q:如何查看当前用户的权限?
A:可以使用 SHOW GRANTS; 查看当前用户的权限,或 SHOW GRANTS FOR 'user'@'host'; 查看指定用户的权限。
三、安全加固实践
3.1 最小权限原则
- 只授予应用所需的最小权限,避免使用
ALL PRIVILEGES。 - 禁止应用使用
root账户连接数据库。 - 为每个应用创建独立账户,并限制来源 IP。
3.2 密码策略
- 启用
validate_password插件,强制密码复杂度。 - 定期更换密码,避免密码泄露。
- 使用
caching_sha2_password认证插件(MySQL 8.0 默认),替代旧的mysql_native_password。
-- 安装密码验证插件
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
-- 设置密码策略
SET GLOBAL validate_password.policy = 'MEDIUM';
SET GLOBAL validate_password.length = 12;
3.3 网络与连接安全
- 限制
bind-address为内网 IP,避免暴露到公网。 - 使用 SSL/TLS 加密连接,防止数据被窃听。
- 配置防火墙,只允许可信 IP 访问 3306 端口。
3.4 审计与监控
- 启用通用查询日志或审计插件(如
audit_log),记录所有操作。 - 监控异常登录行为,如频繁失败登录。
- 定期检查
mysql.user表,清理无用账户。
3.5 其他加固措施
- 禁用
LOCAL INFILE,防止文件读取攻击。 - 删除匿名账户和测试数据库。
- 定期更新 MySQL 版本,修复已知漏洞。
-- 删除匿名账户
DELETE FROM mysql.user WHERE User='';
-- 删除测试数据库
DROP DATABASE IF EXISTS test;
3.6 常见面试题
Q:如何防止 SQL 注入?
A:SQL 注入与权限体系密切相关。除了使用预编译语句(Prepared Statements)外,还应遵循最小权限原则,避免应用账户拥有 DROP、FILE 等高危权限。即使发生注入,攻击者也无法执行危险操作。
Q:MySQL 8.0 在权限管理上有哪些改进?
A:MySQL 8.0 引入了角色(Role)功能,可以像操作系统一样将权限授予角色,再将角色授予用户,简化权限管理。此外,默认认证插件改为 caching_sha2_password,并支持密码过期策略、密码重用限制等。
四、总结
MySQL 的权限体系以 user@host 为核心,通过全局、数据库、表、列等多层级权限实现精细控制。用户管理应遵循最小权限原则,结合密码策略、网络限制、审计监控等手段进行安全加固。在面试中,除了掌握基本语法,更要理解权限验证流程、FLUSH PRIVILEGES 的作用、以及 MySQL 8.0 的新特性。只有将理论与实践结合,才能真正保障数据库的安全稳定运行。
未经允许不得转载:任鹏个人博客 » MySQL 权限体系、用户管理与安全加固实践

