数据库权限管理(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 流水线加入权限检查脚本防止再次出现。

相关推荐
笃行3508 小时前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3509 小时前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3509 小时前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库
SelectDB1 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
这个DBA有点耶1 天前
GROUP BY优化全解:如何写出既不丢数据又飞快的分组查询
数据库·mysql·架构
掉头发的王富贵1 天前
【StarRocks】极限十分钟入门StarRocks
数据库·sql·mysql
Nturmoils1 天前
WHERE 条件别凭习惯写,常用查询先跑一遍
数据库
Databend2 天前
在 AWS 中国峰会逛了一天,我在 Databend 展台看到了 Agent 数据基础设施的新思路
数据库·人工智能·agent
ClouGence4 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle