MySQL 权限体系、用户管理与安全加固实践

MySQL 作为最流行的开源关系型数据库,其权限体系与用户管理是保障数据安全的核心。无论是面试还是生产运维,深入理解 MySQL 的权限模型、用户管理机制以及安全加固手段,都是必备技能。本文将从权限体系、用户管理、安全加固三个维度展开,并穿插常见面试题,帮助你系统掌握这一主题。

一、MySQL 权限体系概述

MySQL 的权限体系采用 “用户 + 主机” 的组合来标识一个账户,即 user@host。这意味着同一个用户名从不同主机连接,可以被视为不同的账户,拥有不同的权限。

1.1 权限的层级

MySQL 权限可以作用在多个层级上,从全局到列级,粒度逐渐变细:

  • 全局层级:作用于整个 MySQL 实例,存储在 mysql.user 表中。例如 SELECTINSERTUPDATEDELETECREATEDROPRELOADSHUTDOWN 等。
  • 数据库层级:作用于指定数据库,存储在 mysql.db 表中。例如 SELECTINSERTCREATE 等。
  • 表层级:作用于指定表,存储在 mysql.tables_priv 表中。例如 SELECTINSERTUPDATEDELETECREATEDROP 等。
  • 列层级:作用于指定表的特定列,存储在 mysql.columns_priv 表中。例如 SELECT(col1)UPDATE(col2)
  • 子程序层级:作用于存储过程、函数,存储在 mysql.procs_priv 表中。例如 EXECUTEALTER ROUTINE

1.2 权限验证流程

当客户端发起连接时,MySQL 的验证分为两个阶段:

  1. 连接验证:根据 userhost 和密码验证用户身份。MySQL 会按照 mysql.user 表中 host 字段的精确度排序(越具体越优先),匹配第一条记录。
  2. 请求验证:用户连接成功后,每次执行操作时,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:GRANTREVOKE 的区别?

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:该命令会重新加载权限表到内存中。如果使用 GRANTREVOKECREATE USER 等语句修改权限,MySQL 会自动刷新内存,无需手动执行。但如果直接使用 INSERTUPDATEDELETE 修改 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)外,还应遵循最小权限原则,避免应用账户拥有 DROPFILE 等高危权限。即使发生注入,攻击者也无法执行危险操作。

Q:MySQL 8.0 在权限管理上有哪些改进?

A:MySQL 8.0 引入了角色(Role)功能,可以像操作系统一样将权限授予角色,再将角色授予用户,简化权限管理。此外,默认认证插件改为 caching_sha2_password,并支持密码过期策略、密码重用限制等。

四、总结

MySQL 的权限体系以 user@host 为核心,通过全局、数据库、表、列等多层级权限实现精细控制。用户管理应遵循最小权限原则,结合密码策略、网络限制、审计监控等手段进行安全加固。在面试中,除了掌握基本语法,更要理解权限验证流程、FLUSH PRIVILEGES 的作用、以及 MySQL 8.0 的新特性。只有将理论与实践结合,才能真正保障数据库的安全稳定运行。

未经允许不得转载:任鹏个人博客 » MySQL 权限体系、用户管理与安全加固实践

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏