数据库权限管理(Privilege Management)

1.1、系统权限

系统权限控制用户可以在数据库中执行的操作类型。

|-------------------------|-----------------|
| 系统权限 | 说明 |
| CREATE SESSION | 连接数据库 |
| CREATE TABLE | 创建表 |
| CREATE VIEW | 创建视图 |
| CREATE PROCEDURE | 创建存储过程/函数/包 |
| CREATE SEQUENCE | 创建序列 |
| CREATE TRIGGER | 创建触发器 |
| CREATE USER | 创建用户 |
| ALTER USER | 修改用户 |
| DROP USER | 删除用户 |
| CREATE ANY TABLE | 在任何 Schema 中创建表 |
| ALTER SYSTEM | 修改系统参数 |
| SYSDBA | 数据库管理员权限(最高权限) |
| SYSOPER | 数据库操作员权限 |
| SELECT ANY TABLE | 查询任何 Schema 的表 |
| GRANT ANY PRIVILEGE | 授予任何系统权限 |

授予系统权限:

GRANT CREATE SESSION TO hr_user;

GRANT CREATE TABLE, CREATE VIEW TO app_user;

GRANT SELECT ANY TABLE TO readonly_user WITH ADMIN OPTION;

撤销系统权限:

REVOKE CREATE TABLE FROM hr_user;

REVOKE SELECT ANY TABLE FROM readonly_user;

CONTAINER 子句控制权限范围:

GRANT CREATE SESSION TO c##admin CONTAINER = ALL;

GRANT CREATE SESSION TO local_user CONTAINER = CURRENT;

1.2、对象权限

对象权限控制用户对特定数据库对象的操作能力。

|------------------------|---------------|
| 对象权限 | 说明 |
| SELECT | 查询表/视图/物化视图 |
| INSERT | 插入数据 |
| UPDATE | 更新数据 |
| DELETE | 删除数据 |
| EXECUTE | 执行存储过程/函数/包 |
| ALTER | 修改对象结构 |
| REFERENCES | 创建外键引用 |
| READ | 读取目录对象(12c+) |
| WRITE | 写入目录对象(12c+) |
| INHERIT PRIVILEGES | 继承调用者权限(18c+) |

授予对象权限
GRANT SELECT ON hr.employees TO readonly_user;
GRANT INSERT, UPDATE ON hr.employees TO hr_user;
GRANT EXECUTE ON hr.raise_salary TO app_user;

授予列级别权限(更精细的控制)
GRANT SELECT (employee_id, first_name, last_name, salary) ON hr.employees TO report_user;
GRANT UPDATE (salary, commission_pct) ON hr.employees TO hr_manager;

撤销对象权限
REVOKE SELECT ON hr.employees FROM readonly_user;
REVOKE UPDATE (salary) ON hr.employees FROM hr_manager;

撤销传播(CASCADE CONSTRAINTS)
REVOKE REFERENCES ON hr.employees FROM fin_user CASCADE CONSTRAINTS;

1.3、权限委托与授权链

WITH GRANT OPTION:允许被授权者将权限转授给他人
GRANT SELECT ON hr.employees TO hr_user WITH GRANT OPTION;

hr_user 可以继续授权 CONNECT AS hr_user
GRANT SELECT ON hr.employees TO readonly_user;

撤销时使用 CASCADE 级联撤销所有转授权限
REVOKE SELECT ON hr.employees FROM hr_user CASCADE;

WITH ADMIN OPTION:允许管理角色
GRANT app_developer TO admin_user WITH ADMIN OPTION;

1.4、权限级联效应

|----------|-------------------|-------------------|
| 特性 | 系统权限 | 对象权限 |
| 传递授权 | WITH ADMIN OPTION | WITH GRANT OPTION |
| 回收级联 | 不级联(第三方权限保留) | 级联(第三方权限也被回收) |
| 授权者 | 任意有权限的用户 | 对象所有者或被授权者 |
| 影响范围 | 数据库级别 | 特定对象 |

权限依赖关系查询

查看谁有 GRANT OPTION:

SELECT GRANTEE, PRIVILEGE, TABLE_NAME, GRANTABLE FROM DBA_TAB_PRIVS WHERE GRANTABLE = 'YES';

查看谁有 ADMIN OPTION:

SELECT GRANTEE, PRIVILEGE, ADMIN_OPTION FROM DBA_SYS_PRIVS WHERE ADMIN_OPTION = 'YES';

查看权限传递链(以某表为例):

SELECT GRANTEE, PRIVILEGE, GRANTABLE FROM DBA_TAB_PRIVS WHERE OWNER = 'HR' AND TABLE_NAME = 'EMPLOYEES' ORDER BY GRANTEE;

1.5、权限查询视图

|--------------------|-----------|-----------------------|
| 视图 | 用途 | 常用查询条件 |
| DBA_SYS_PRIVS | 系统权限 | WHERE GRANTEE = :user |
| DBA_TAB_PRIVS | 对象权限(表级) | WHERE GRANTEE = :user |
| DBA_COL_PRIVS | 列级权限 | WHERE GRANTEE = :user |
| DBA_ROLE_PRIVS | 用户拥有的角色 | WHERE GRANTEE = :user |
| ROLE_SYS_PRIVS | 角色的系统权限 | WHERE ROLE = :role |
| ROLE_TAB_PRIVS | 角色的对象权限 | WHERE ROLE = :role |
| SESSION_PRIVS | 当前会话的有效权限 | 直接查询 |
| SESSION_ROLES | 当前会话激活的角色 | 直接查询 |

实例:权限过度------CREATE ANY TABLE 安全整改

**S --- Situation(场景):**安全审计发现 MES 开发账号 mes_dev 拥有 CREATE ANY TABLE,可在任意 Schema 建表,存在越权风险。

**T --- Task(任务):**回收过度权限,按最小权限重新分配。

A --- Action(行动):

1、查询 mes_dev 所有系统权限;

2、回收 CREATE ANY TABLE,改为 CREATE TABLE;

3、需要跨 Schema 操作通过专用角色+视图;

4、验证应用功能不受影响。

**R --- Result(结果):**权限回收后应用测试通过,越权风险消除。CI/CD 流水线加入权限检查脚本防止再次出现。

相关推荐
m0_702036531 小时前
如何从Oracle Java调用外部API_HTTP请求在数据库Java Source中的实现
jvm·数据库·python
aisifang002 小时前
企业级GPT-Image2实战测评:从生成到生产
大数据·数据库·人工智能
TO_WebNow2 小时前
MySQL 索引的相关知识
数据库·mysql
神明9312 小时前
如何处理ORA-01152报错_恢复未完成导致的数据文件仍需介质恢复
jvm·数据库·python
许长安2 小时前
Redis 跳表实现详解
数据库·c++·经验分享·redis·笔记·缓存
m0_596749092 小时前
mysql如何导出特定条件的查询数据_使用mysqldump加where参数
jvm·数据库·python
赢乐2 小时前
大模型学习笔记:LangChain核心组件-记忆(memory)
数据库·langchain·长短时记忆网络·长期记忆·短期记忆·智能体agent·记忆(memory)
jieyucx2 小时前
Go语言通透教程:结构体定义与方法
服务器·数据库·golang·结构体
m0_690825822 小时前
c++ RAII机制详解 c++如何利用RAII管理资源
jvm·数据库·python