3. 用户与权限管理

Oracle 的用户与权限体系是数据库安全审计的根基。审计人员需要回答三个核心问题:谁可以登录数据库、登录后能做什么、这些能力是否被合理约束。Oracle 通过“用户—配置文件—权限”三层结构来回答这些问题:用户是身份载体,配置文件(Profile)是资源与口令策略的约束,权限则决定用户能访问哪些对象、执行哪些操作。理解这三者的关系,是实施最小权限原则的前提。

用户与配置文件:身份与约束的绑定

创建用户时,Oracle 要求同时指定认证方式和默认表空间。一个典型的创建语句如下:

CREATE USER app_user
  IDENTIFIED BY "Str0ng_P@ssw0rd"
  DEFAULT TABLESPACE app_data
  TEMPORARY TABLESPACE temp
  QUOTA 100M ON app_data
  PROFILE app_profile
  PASSWORD EXPIRE;

其中 PROFILE app_profile 将用户与配置文件绑定。配置文件是 Oracle 中用于限制用户资源使用和口令策略的命名对象,它不直接授予权限,而是设定“边界”。例如:

CREATE PROFILE app_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 5
  PASSWORD_LOCK_TIME 1
  PASSWORD_LIFE_TIME 90
  PASSWORD_GRACE_TIME 7
  PASSWORD_REUSE_MAX 5
  SESSIONS_PER_USER 3
  IDLE_TIME 30
  CONNECT_TIME 480;

这段配置的含义是:连续 5 次登录失败后锁定账户 1 天;口令 90 天过期,过期后 7 天内允许宽限登录;同一口令在最近 5 次修改中不得重复;每个用户最多 3 个并发会话;空闲超过 30 分钟或连接超过 8 小时自动断开。审计时,应重点检查 DBA_PROFILES 视图,确认是否存在使用 DEFAULT 配置文件的用户,因为默认配置通常不限制失败次数和口令生命周期,属于高风险配置。

Oracle 用户—配置文件—权限关系图 用户 (User) app_user 认证方式:口令 默认表空间:app_data 配额:100M 配置文件 (Profile) app_profile 失败 5 次锁定 1 天 口令 90 天过期 并发会话 ≤ 3 权限 (Privilege) 系统权限:CREATE SESSION 对象权限:SELECT ON orders 角色:app_readonly 列级:UPDATE(salary) 绑定 约束 权限授予与回收路径 GRANT 系统权限 GRANT 对象权限 GRANT 角色 REVOKE 回收 最小权限原则检查要点 • 是否存在直接授予 DBA 角色的普通用户? • 对象权限是否按列级最小化? • 配置文件是否使用 DEFAULT? • 是否存在 WITH ADMIN OPTION 的过度授权? • 角色是否嵌套过深导致权限膨胀? • 离职或转岗用户是否及时回收权限?

系统权限与对象权限:授予与回收的粒度

Oracle 权限分为系统权限和对象权限。系统权限允许用户执行某种数据库级操作,如 CREATE SESSION、CREATE TABLE、CREATE PROCEDURE;对象权限则针对具体对象,如 SELECT、INSERT、UPDATE、DELETE、EXECUTE。授予语法如下:

-- 系统权限
GRANT CREATE SESSION, CREATE TABLE TO app_user;

-- 对象权限
GRANT SELECT, INSERT ON hr.orders TO app_user;

-- 列级权限
GRANT UPDATE (order_status) ON hr.orders TO app_user;

-- 角色
CREATE ROLE app_readonly;
GRANT SELECT ON hr.orders TO app_readonly;
GRANT app_readonly TO app_user;

回收权限使用 REVOKE:

REVOKE INSERT ON hr.orders FROM app_user;
REVOKE CREATE TABLE FROM app_user;
REVOKE app_readonly FROM app_user;

审计时需注意:WITH ADMIN OPTION 允许被授权者将系统权限继续授予他人,形成权限扩散链;WITH GRANT OPTION 则针对对象权限。两者都会导致权限回收不彻底——回收上级权限时,下级已授予的权限不会自动级联撤销。因此,最小权限原则要求:除非确有管理需要,否则不应使用这两个选项。

最小权限原则的落地实践

最小权限原则不是一句口号,而是可操作的检查清单。以下是一份面向 Oracle 审计的最小权限核查表,可直接用于日常巡检:

检查项 检查方法 风险判定
用户是否使用 DEFAULT 配置文件 SELECT username, profile FROM dba_users WHERE profile='DEFAULT'; 存在即高风险,口令策略和资源限制缺失
是否存在直接授予 DBA 的用户 SELECT grantee FROM dba_role_privs WHERE granted_role='DBA'; 非管理员账户拥有 DBA 即为严重违规
系统权限是否带 ADMIN OPTION SELECT grantee, privilege FROM dba_sys_privs WHERE admin_option='YES'; 权限扩散风险,需逐条确认必要性
对象权限是否带 GRANT OPTION SELECT grantee, owner, table_name, privilege FROM dba_tab_privs WHERE grantable='YES'; 对象权限可被二次授予,回收不彻底
是否存在长期未登录的活跃账户 SELECT username, last_login FROM dba_users WHERE account_status='OPEN' AND last_login < SYSDATE-90; 僵尸账户应锁定或删除
角色嵌套层级是否过深 SELECT * FROM dba_role_privs WHERE granted_role IN (SELECT role FROM dba_roles); 嵌套超过 3 层需人工复核权限实际范围
实践提示:在 Oracle 12c 及以上版本中,可使用 DBA_USERS 的 COMMON 字段区分公共用户与本地用户;在 CDB 环境中,公共用户的权限管理需在 CDB 根容器中执行,本地用户则在 PDB 中管理。审计时务必确认当前会话所在的容器,避免遗漏或误判。
常见误区:许多管理员认为“回收角色就等于回收了角色中的所有权限”。实际上,如果用户在被授予角色之前已经直接获得了某些对象权限,回收角色后这些直接权限仍然保留。因此,权限回收后应再次查询 DBA_SYS_PRIVS、DBA_TAB_PRIVS 和 DBA_ROLE_PRIVS 三个视图,确认用户的实际权限集合已降至预期水平。

最后,最小权限原则的落地需要制度化:新用户创建时默认只授予 CREATE SESSION,业务权限通过角色按需申请;每季度执行一次权限复核,重点检查 DBA 角色、ADMIN OPTION 和长期未登录账户;离职或转岗时,先锁定账户再回收权限,最后删除用户。只有将技术手段与管理流程结合,才能真正实现“最小权限、按需授权、定期复核”的安全目标。