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. 最佳实践
- DBA 与业务隔离:DV 核心价值
- Realm 保护敏感表:HR、财务等
- Command Rule 限制时间:业务时间
- Factor 多因素授权:IP、时间等
- DV Owner 独立:不与 SYS 重合
- 定期审计 DV 操作:合规
- 备份 DV 配置:防止丢失
- PDB 中独立配置:多租户
- 生产前测试:避免锁死
- 结合 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/