Oracle Database Vault

适用版本:Oracle Database 11g / 12c / 19c / 23ai
文档版本:v1.0 / 2026-07


1. 概述

Oracle Database Vault(DV) 是 Oracle 的高级安全产品[1],限制 DBA 访问敏感数据:

核心特性:

  • 限制 DBA 权限:防止 SYS/SYSDBA 访问业务数据
  • 职责分离:DBA 与业务数据隔离
  • 多因素授权:时间/IP/认证
  • 强制访问控制

典型场景:

  • 合规要求(SOX、PCI-DSS)
  • 防止内部威胁
  • DBA 与数据隔离

2. DV 架构

2.1 核心组件

组件 作用
Realm(领域) 保护对象集合
Command Rule 命令规则
Factor 环境因子
Rule Set 规则集
Account Lockdown 账户锁定

2.2 工作流程

SQL 命令
    ↓
检查 Realm
    ↓
检查 Command Rule
    ↓
检查 Factor
    ↓
执行或拒绝

3. 启用 Database Vault

3.1 安装

# DBCA 启用 DV
$ORACLE_HOME/bin/dbca -silent -configureDatabase \
  -sid ORCL \
  -addOption DV

# 或手动
SQL> @?/rdbms/admin/catmac.sql

3.2 配置 DV Owner 和 Account Manager

-- 创建 DV Owner
BEGIN
  DVSYS.DBMS_MACADM.CREATE_OWNER(
    username => 'dvowner',
    password => 'pwd'
  );
END;
/

-- 创建 Account Manager
BEGIN
  DVSYS.DBMS_MACADM.CREATE_ACCT_MGR(
    username => 'dv_acctmgr',
    password => 'pwd'
  );
END;
/

3.3 启用 DV

-- 启用
ALTER SYSTEM SET dv = TRUE SCOPE=SPFILE;
-- 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;

4. Realm(领域)

4.1 创建 Realm

-- 创建 Realm
BEGIN
  DBMS_MACADM.CREATE_REALM(
    realm_name => 'HR Realm',
    description => 'Protect HR data',
    enabled => DBMS_MACUTL.G_YES,
    audit_options => DBMS_MACUTL.G_REALM_AUDIT_FAIL,
    realm_type => 1,  -- 1=常规, 2=强制
    realm_scope => 0  -- 0=本地, 1=通用
  );
END;
/

4.2 添加对象到 Realm

BEGIN
  DBMS_MACADM.ADD_OBJECT_TO_REALM(
    realm_name => 'HR Realm',
    object_owner => 'hr',
    object_name => '%',  -- 所有对象
    object_type => '%'   -- 所有类型
  );
END;
/

4.3 添加授权用户

-- 添加授权用户
BEGIN
  DBMS_MACADM.ADD_AUTH_TO_REALM(
    realm_name => 'HR Realm',
    grantee => 'hr_user',
    auth_options => DBMS_MACUTL.G_REALM_AUTH_OWNER
  );
END;
/

4.4 Realm 类型

类型 说明
1 (常规) 默认,仅保护对象
2 (强制) 强制保护,包括查询

5. Command Rule(命令规则)

5.1 创建 Command Rule

-- 创建规则集
BEGIN
  DBMS_MACADM.CREATE_RULE_SET(
    rule_set_name => 'Allow Business Hours',
    description => 'Only business hours',
    enabled => DBMS_MACUTL.G_YES,
    eval_options => DBMS_MACUTL.G_RULESET_EVAL_ALL,
    audit_options => DBMS_MACUTL.G_RULESET_AUDIT_FAIL,
    fail_options => DBMS_MACUTL.G_RULESET_FAIL_SHOW,
    fail_message => 'Not business hours',
    fail_code => 20000
  );
END;
/

-- 添加规则
BEGIN
  DBMS_MACADM.CREATE_RULE(
    rule_name => 'Business Hours Rule',
    rule_expr => 'TO_CHAR(SYSDATE, ''HH24'') BETWEEN ''09'' AND ''18'''
  );

  DBMS_MACADM.ADD_RULE_TO_RULESET(
    ruleset_name => 'Allow Business Hours',
    rule_name => 'Business Hours Rule'
  );
END;
/

-- 创建 Command Rule
BEGIN
  DBMS_MACADM.CREATE_COMMAND_RULE(
    command => 'SELECT',
    rule_set_name => 'Allow Business Hours',
    object_owner => 'hr',
    object_name => '%',
    enabled => DBMS_MACUTL.G_YES
  );
END;
/

5.2 常用命令

命令 说明
SELECT 查询
INSERT 插入
UPDATE 更新
DELETE 删除
CREATE 创建
DROP 删除
ALTER 修改
SYSTEM 系统命令

6. Factor(因子)

6.1 创建 Factor

-- IP 地址因子
BEGIN
  DBMS_MACADM.CREATE_FACTOR(
    factor_name => 'Client IP',
    description => 'Client IP address',
    factor_type => 'Context',
    factor_scope => 'SESSION',
    validations => '',
    eval_options => DBMS_MACUTL.G_EVAL_PRE,
    audit_options => DBMS_MACUTL.G_AUDIT_ALWAYS,
    fail_options => 0
  );

  -- 设置获取方式
  DBMS_MACADM.SET_FACTOR_EXPR(
    factor_name => 'Client IP',
    factor_expr => 'SYS_CONTEXT(''USERENV'', ''IP_ADDRESS'')'
  );
END;
/

6.2 因子类型

类型 说明
Context 上下文
Database 数据库信息
Environment 环境变量
Session 会话信息

7. 监控 DV

7.1 Realm 信息

SELECT * FROM dba_dv_realm;
SELECT * FROM dba_dv_realm_object;
SELECT * FROM dba_dv_realm_auth;

7.2 Command Rule

SELECT * FROM dba_dv_command_rule;

7.3 Factor

SELECT * FROM dba_dv_factor;
SELECT * FROM dba_dv_factor_link;

7.4 Rule Set

SELECT * FROM dba_dv_rule_set;
SELECT * FROM dba_dv_rule;

7.5 审计

SELECT * FROM dvsys.dv$audit;

8. DV 与多租户

8.1 PDB 中的 DV

-- 切换到 PDB
ALTER SESSION SET CONTAINER = hrpdb;

-- 在 PDB 中配置 DV
-- DV 仅在当前 PDB 生效

8.2 Common DV

DV 不能跨 PDB 配置,每个 PDB 独立。


9. 常见坑与排错

9.1 ORA-01031: insufficient privileges

现象:SYS 无法访问数据。

原因:DV 限制 SYS 访问。

修复:

-- 1. 检查 DV 是否启用
SELECT * FROM dba_dv_status;

-- 2. 临时禁用 DV(仅维护时)
ALTER SYSTEM SET dv = FALSE SCOPE=SPFILE;
-- 重启

-- 3. 或将 SYS 添加到 Realm 授权

9.2 ORA-47999: Realm 保护

现象:用户无法访问 Realm 保护对象。

修复:

-- 1. 检查 Realm
SELECT * FROM dba_dv_realm_auth WHERE realm_name='HR Realm';

-- 2. 添加授权
BEGIN
  DBMS_MACADM.ADD_AUTH_TO_REALM(
    realm_name => 'HR Realm',
    grantee => 'app_user',
    auth_options => DBMS_MACUTL.G_REALM_AUTH_PARTICIPANT
  );
END;
/

9.3 Command Rule 阻止操作

修复:

-- 1. 检查 Command Rule
SELECT * FROM dba_dv_command_rule;

-- 2. 禁用 Command Rule
BEGIN
  DBMS_MACADM.UPDATE_COMMAND_RULE(
    command => 'SELECT',
    rule_set_name => 'Allow Business Hours',
    object_owner => 'hr',
    object_name => '%',
    enabled => DBMS_MACUTL.G_NO
  );
END;
/

9.4 DV Owner 锁定

修复:

-- 用 Account Manager 解锁
sqlplus dv_acctmgr/pwd
ALTER USER dvowner ACCOUNT UNLOCK;

9.5 忘记 DV Owner 密码

修复:

# 1. 以 SYSDBA 登录
sqlplus / as sysdba

# 2. 重置密码
ALTER USER dvowner IDENTIFIED BY new_pwd;

# 3. 重新启用

10. 最佳实践

  1. DBA 与业务隔离:DV 核心价值
  2. Realm 保护敏感表:HR、财务等
  3. Command Rule 限制时间:业务时间
  4. Factor 多因素授权:IP、时间等
  5. DV Owner 独立:不与 SYS 重合
  6. 定期审计 DV 操作:合规
  7. 备份 DV 配置:防止丢失
  8. PDB 中独立配置:多租户
  9. 生产前测试:避免锁死
  10. 结合 OLS/VPD:多层防护

11. 参考资料

[1] Oracle Database Vault Administrator’s Guide 19c
https://docs.oracle.com/en/database/oracle/oracle-database/19/dvadm/

[2] Oracle Database Security Guide 19c, “Database Vault”
https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/