MySQL作为常用的关系型数据库,为不同应用分配合理的权限是数据库安全管理的核心工作。不同业务应用对数据库的访问需求存在差异,过度授予权限会增加数据泄露和误操作的风险,而权限不足则会影响应用正常运行。应用级权限设计需要结合业务场景,遵循最小权限原则,为每个应用分配刚好满足其需求的数据库操作权限。

MySQL权限体系基础
MySQL的权限控制分为全局权限、数据库级权限、表级权限、列级权限和存储过程权限等多个层级,权限生效遵循从宽泛到精细的匹配规则。权限信息存储在mysql系统库的user、db、tables_priv等表中,当用户发起数据库请求时,MySQL会依次检查对应层级的权限记录,只要有一个层级匹配到允许操作的权限,请求就会被放行。
常见权限类型说明
- SELECT:允许查询表数据
- INSERT:允许向表中插入新数据
- UPDATE:允许修改表中已有数据
- DELETE:允许删除表中数据
- CREATE:允许创建新的数据库或表
- DROP:允许删除数据库或表
- INDEX:允许创建或删除索引
- EXECUTE:允许执行存储过程
应用级权限设计原则
为不同应用分配权限时,需要遵循以下核心原则,保障权限分配的合理性:
- 最小权限原则:只授予应用完成自身功能必需的最小权限集合,避免授予不必要的全局权限或高级权限。
- 应用隔离原则:不同应用使用独立的数据库账号,避免多个应用共用同一个账号,方便后续权限审计和问题排查。
- 权限分层原则:根据应用的功能模块划分权限,比如只读模块只授予查询权限,写操作模块授予对应的增删改权限。
- 定期审计原则:定期检查各应用的权限使用情况,及时回收不再需要的权限,避免权限冗余。
不同应用场景的权限分配方案
场景一:只读数据应用
这类应用只需要查询数据库中的数据,比如数据报表系统、数据同步到数仓的采集程序,只需要授予对应库的查询权限即可。
首先创建专用的数据库账号,设置强密码:
-- 创建只读应用账号,允许从应用服务器IP登录 CREATE USER 'read_app'@'192.168.0.%' IDENTIFIED BY 'StrongPassword123';
然后授予指定库的查询权限:
-- 授予read_app账号对report_db库下所有表的查询权限 GRANT SELECT ON report_db.* TO 'read_app'@'192.168.0.%'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
场景二:业务写操作应用
这类应用需要完成数据的增删改查操作,比如核心业务系统的后端服务,需要授予对应业务库的常用操作权限,但不授予库表结构修改权限。
-- 创建业务写操作应用账号 CREATE USER 'write_app'@'192.168.0.%' IDENTIFIED BY 'StrongPassword456'; -- 授予业务库常用的增删改查权限 GRANT SELECT, INSERT, UPDATE, DELETE ON business_db.* TO 'write_app'@'192.168.0.%'; FLUSH PRIVILEGES;
场景三:运维管理类应用
这类应用需要执行库表结构变更、索引维护等操作,比如数据库运维平台,需要授予对应库的结构修改权限,同时限制登录IP范围。
-- 创建运维应用账号,只允许从运维服务器IP登录 CREATE USER 'ops_app'@'10.0.0.10' IDENTIFIED BY 'StrongPassword789'; -- 授予业务库的创建、修改、删除表权限和索引管理权限 GRANT CREATE, ALTER, DROP, INDEX ON business_db.* TO 'ops_app'@'10.0.0.10'; FLUSH PRIVILEGES;
权限验证与回收
权限分配完成后,需要验证权限是否生效,同时掌握权限回收的方法。
权限验证方法
可以使用新创建的账号登录MySQL,执行对应操作验证权限是否正确:
-- 使用read_app账号登录后执行查询,验证权限
SELECT * FROM report_db.user_info LIMIT 10;
-- 尝试执行插入操作,验证是否没有写权限
INSERT INTO report_db.user_info (name) VALUES ('test'); -- 该操作会报错,提示权限不足
也可以通过查询系统表查看账号的权限详情:
-- 查看read_app账号的所有权限 SHOW GRANTS FOR 'read_app'@'192.168.0.%';
权限回收方法
当应用不再需要某些权限时,需要及时回收,避免权限冗余:
-- 回收write_app账号的DELETE权限 REVOKE DELETE ON business_db.* FROM 'write_app'@'192.168.0.%'; -- 回收read_app账号的所有权限 REVOKE ALL PRIVILEGES ON report_db.* FROM 'read_app'@'192.168.0.%'; -- 删除不再使用的应用账号 DROP USER 'read_app'@'192.168.0.%'; FLUSH PRIVILEGES;
注意事项
- 所有应用账号的密码需要设置足够强度,避免使用弱密码,同时定期更换密码。
- 账号的登录IP范围尽量限制为应用服务器的IP段,避免使用%允许所有IP登录。
- 不要给应用账号授予
GRANT OPTION权限,避免应用账号可以自行给其他账号分配权限。 - 生产环境的权限变更需要走审批流程,变更前做好权限备份,方便回滚。