一、为什么企业需要权限设计?
在个人学习环境:
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 SELECTDBA:
dba_role ALL PRIVILEGES为什么?
因为生产保存:
- 用户信息
- 订单数据
- 财务数据
任何错误都会影响业务。
五、为什么生产环境禁止开发人员使用 root?
很多公司规定:
开发人员不能拥有生产数据库 root 密码。
原因:
① 防止误操作
例如:
开发测试:
DELETE FROM user;忘记 WHERE:
DELETE 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 权限系统时会再次遇到。
RBAC:
Role Based Access Control
意思:
基于角色的权限控制。
结构:
用户(User) ↓ 角色(Role) ↓ 权限(Permission)数据库:
user | | role | | permission例如:
张三 ↓ 后端开发角色 ↓ 订单查询 订单修改这和 MySQL Role 的思想完全一致。
九、本节总结
| 原则 | 含义 |
|---|---|
| 最小权限原则 | 给用户最低必要权限 |
| 用户隔离 | 不同人员不同账号 |
| 角色管理 | 权限通过 Role 管理 |
| 环境隔离 | Dev/Test/Prod 权限不同 |
| 禁止共享账号 | 方便审计 |
| 禁止生产 root | 防止灾难性操作 |