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 权限分为系统权限和对象权限。系统权限允许用户执行某种数据库级操作,如 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 层需人工复核权限实际范围 |
DBA_USERS 的 COMMON 字段区分公共用户与本地用户;在 CDB 环境中,公共用户的权限管理需在 CDB 根容器中执行,本地用户则在 PDB 中管理。审计时务必确认当前会话所在的容器,避免遗漏或误判。
DBA_SYS_PRIVS、DBA_TAB_PRIVS 和 DBA_ROLE_PRIVS 三个视图,确认用户的实际权限集合已降至预期水平。
最后,最小权限原则的落地需要制度化:新用户创建时默认只授予 CREATE SESSION,业务权限通过角色按需申请;每季度执行一次权限复核,重点检查 DBA 角色、ADMIN OPTION 和长期未登录账户;离职或转岗时,先锁定账户再回收权限,最后删除用户。只有将技术手段与管理流程结合,才能真正实现“最小权限、按需授权、定期复核”的安全目标。