Oracle 用户、角色和权限怎么设计?系统权限和对象权限有什么区别?
简化版
Oracle 权限设计要区分用户、角色、系统权限和对象权限。系统权限控制“能不能做某类操作”,对象权限控制“能不能访问某个对象”。生产上不要给业务账号 DBA,应按最小权限给角色和对象授权。
详细版
用户是登录和对象归属主体;角色是一组权限集合,便于批量授权;系统权限如 CREATE SESSION、CREATE TABLE;对象权限如对某张表的 SELECT、INSERT。
常见授权示例:
GRANT CREATE SESSION TO app_user;
GRANT SELECT, INSERT ON order_owner.orders TO app_user;
GRANT report_role TO report_user;
面试要强调最小权限、职责分离、对象 owner 和应用访问账号分离。尤其要注意:存储过程、视图和 definer/invoker rights 会影响权限检查,不能只背 GRANT 语法。
完整版教学
一、为什么 Oracle 权限要分层理解
Oracle 里“能登录”“能建表”“能查某张表”不是一件事。把这些能力混在一起,很容易把业务账号授权过大。
例如应用只需要查询订单表,却被授予了 DBA,它就可能误删对象、修改系统参数或访问不该访问的数据。权限设计的第一原则是最小权限。
所以回答这题要先拆层:用户负责身份,角色负责权限集合,系统权限控制能力,对象权限控制具体对象。
二、系统权限和对象权限的区别
系统权限是数据库级能力,例如创建会话、创建表、创建过程。对象权限是针对某个 schema 对象的操作许可,例如查某张表或执行某个包。
系统权限:CREATE SESSION, CREATE TABLE, CREATE PROCEDURE
对象权限:SELECT ON hr.employees, EXECUTE ON pkg_order
这两个维度不能替代。给了 CREATE SESSION 只能登录,不代表能查业务表;给了表的 SELECT,如果不能登录也无法访问。
三、角色适合做权限集合
角色可以把一组权限打包,然后授给用户。比如报表角色包含若干只读权限,运维角色包含部分维护权限。
CREATE ROLE report_reader;
GRANT SELECT ON order_owner.orders TO report_reader;
GRANT SELECT ON order_owner.payments TO report_reader;
GRANT report_reader TO analyst_user;
如果有 20 个报表用户,角色能减少重复授权和漏授权。但角色不是越多越好,角色层级过深会让排查变困难。
四、对象 owner 和应用账号为什么要分开
一种常见设计是对象 owner 负责拥有表、索引、包;应用账号只被授予访问权限,不直接拥有核心对象。
这样应用账号被盗或误操作时,不容易直接 drop 自己拥有的对象。部署变更也可以由 owner 或专门发布账号执行。
| 账号类型 | 作用 | 权限特点 |
|---|---|---|
| owner | 拥有对象 | DDL 权限强 |
| app_user | 应用访问 | 只给 DML/执行权限 |
| report_user | 报表查询 | 只读 |
| dba_user | 运维管理 | 严格审计 |
这种职责分离是生产权限设计的核心。
五、存储过程里的权限检查要注意
Oracle 存储过程有 definer rights 和 invoker rights 的差异。默认 definer rights 下,过程执行时使用定义者权限;invoker rights 则使用调用者权限。
这会影响安全边界。比如只给应用账号执行某个包的权限,而包内部由 owner 访问表,可以隐藏底层表结构并收敛访问入口。
但如果过程里拼动态 SQL,权限和注入风险又要额外控制。面试里补到这一点,会显得你知道 Oracle 权限不只是表级授权。
六、常见误区与追问
- 误区:给业务账号 DBA 最省事。 这会扩大误操作和攻击面,生产应最小授权。
- 误区:系统权限和对象权限是一回事。 系统权限控制能力,对象权限控制具体对象访问。
- 误区:角色越多权限越清晰。 角色过多、嵌套过深会增加排查成本。
- 追问:为什么 owner 和 app_user 要分开? 分离对象归属和应用访问,降低误删和越权风险。
- 追问:存储过程执行时用谁的权限? 默认 definer rights,也可使用 invoker rights,需要按安全边界选择。
七、加强记忆
记忆钩子:Oracle 权限像公司门禁,用户是员工,角色是岗位,系统权限是能不能进机房,对象权限是能不能打开某个柜子。
回答这题按“用户、角色、系统权限、对象权限、最小权限、owner/app 分离、过程权限”来讲。不要停留在 GRANT SELECT,要讲出生产安全边界。