mysql采用“用户账户 + 权限粒度 + 连接上下文”三层访问控制机制,强制认证、最小权限授权、运行时约束及网络协同加固。

MySQL 通过分层的访问控制机制防止越权访问,核心是“用户账户 + 权限粒度 + 连接上下文”三者共同约束。单纯创建用户不等于开放权限,必须显式授权,且权限可精确到库、表、列甚至具体 SQL 操作。
用户认证:连接前的第一道防线
MySQL 在客户端连接时强制验证用户名、密码及来源主机(Host)。同一个用户名在不同主机上被视为不同账户,例如 ‘appuser’@’192.168.1.10′ 和 ‘appuser’@’localhost’ 可拥有完全不同的权限。
- 创建用户时必须指定 Host,推荐避免使用 ‘%’(通配所有主机),尤其生产环境应限定为具体 IP 或内网网段
- 密码强度由 validate_password 插件控制,建议启用并设置最低长度、复杂度策略
- 旧版空密码或匿名用户(如 ”@’localhost’)需清理,执行 DROP USER ”@’localhost’; 彻底移除
权限分配:按需授予最小必要权限
权限分为全局、数据库、表、列、存储过程等层级,遵循“显式授权才生效”原则,未授权即拒绝。系统自动拒绝跨库操作(如用 user_a 的账号查 user_b 的表),除非被明确授权。
- 应用账号应禁用高危权限:避免授予 FILE、SHUTDOWN、SUPER、PROCESS、REPLICATION CLIENT/SERVER
- 业务账号通常只需 select、INSERT、UPDATE、delete,且限制在指定数据库(如 GRANT SELECT, INSERT ON myapp.* TO ‘web’@’10.0.2.%’;)
- 敏感字段(如 password_hash、id_card)可通过视图 + 列级权限隔离:GRANT SELECT (name, email) ON myapp.users TO ‘report’@’%’;
运行时约束:连接属性与动态权限控制
MySQL 8.0+ 支持角色(ROLE)和动态权限管理,支持更灵活的权限生命周期控制;同时可通过 max_user_connections、max_questions 等资源限制防暴力试探或滥用。
- 用角色统一管理权限组:CREATE ROLE ‘app_reader’; GRANT SELECT ON sales.* TO ‘app_reader’;,再将角色赋予用户
- 启用 mandatory_roles 参数,确保所有用户默认 继承 审计或只读角色
- 对高风险账号启用 password_expired=1 或设置 PASSWORD EXPIRE INTERVAL 90 DAY 强制定期更新
- 监控异常登录:查询 performance_schema.accounts 或启用 general_log(仅调试)观察失败连接
补充加固手段
访问控制不能仅靠 MySQL 自身,需结合网络与 操作系统 层协同防御。