一、为什么企业需要权限设计在个人学习环境root | | 所有操作很简单。但是企业数据库 | -------------------------------- | | | 开发人员 测试人员 数据分析师 | | | 不同权限 不同权限 不同权限因为不同人员职责不同所以权限必须隔离。二、企业权限设计核心原则1. 最小权限原则Least Privilege⭐⭐⭐⭐⭐这是数据库安全最重要原则。含义用户只拥有完成工作所需要的最低权限。例如数据分析师工作查看销售数据需要SELECT不需要INSERT UPDATE DELETE DROP为什么因为如果分析师账号泄露攻击者只能查询数据不能删除订单表 修改用户信息三、企业常见角色设计真实项目通常不会直接创建Tom Jack Lucy这样的权限。而是设计角色① DBA角色数据库管理员dba_role权限ALL PRIVILEGES可以创建数据库创建用户修改权限优化数据库备份恢复② 后端开发角色developer_role开发环境权限较高SELECT INSERT UPDATE DELETE CREATE ALTER生产环境通常SELECT或者SELECT EXECUTE原因开发不能直接修改生产数据。③ 测试角色tester_role一般SELECT INSERT UPDATE DELETE为什么测试需要创建测试数据修改测试数据删除测试数据④ 数据分析角色analyst_role权限SELECT只能读取。四、不同环境权限设计企业通常有三个环境开发环境 测试环境 生产环境1. 开发环境Dev目的写代码、调试。权限比较宽松。例如developer_role SELECT INSERT UPDATE DELETE CREATE ALTER DROP为什么允许因为开发数据库数据可以随便重建。2. 测试环境Test目的模拟真实业务。权限中等。例如tester_role SELECT INSERT UPDATE DELETE限制不允许DROP DATABASE CREATE USER GRANT3. 生产环境Prod最严格。例如开发人员developer_prod_role SELECTDBAdba_role ALL PRIVILEGES为什么因为生产保存用户信息订单数据财务数据任何错误都会影响业务。五、为什么生产环境禁止开发人员使用 root很多公司规定开发人员不能拥有生产数据库 root 密码。原因① 防止误操作例如开发测试DELETE FROM user;忘记 WHEREDELETE FROM user;结果所有用户删除。② 防止权限扩大root 可以CREATE USER hacker;创建超级账号。③ 符合审计要求企业需要知道谁什么时候 执行了什么操作如果大家都是 root无法追责。六、数据库账号规范企业一般不会这样root 123456推荐按用途命名例如数据库管理员db_admin应用程序app_order_service数据分析data_analyst不要test admin user1这种没有意义的账号。七、应用程序为什么不使用 root例如 NestJS 项目错误{ username:root, password:123456 }正确创建专用账号order_service只拥有订单相关权限。原因如果应用服务器被攻击攻击者拿到数据库账号影响范围有限。八、企业权限模型RBAC你后面学习 NestJS 权限系统时会再次遇到。RBACRole Based Access Control意思基于角色的权限控制。结构用户(User) ↓ 角色(Role) ↓ 权限(Permission)数据库user | | role | | permission例如张三 ↓ 后端开发角色 ↓ 订单查询 订单修改这和 MySQL Role 的思想完全一致。九、本节总结原则含义最小权限原则给用户最低必要权限用户隔离不同人员不同账号角色管理权限通过 Role 管理环境隔离Dev/Test/Prod 权限不同禁止共享账号方便审计禁止生产 root防止灾难性操作