Oracle Database Vault

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 ******

# 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/