能,dba用户可绕过常规权限控制;database vault是唯一能从内核层拦截dba访问特定对象的机制,连sys也无法绕过策略,需单独安装配置并创建realm与rule set实现真正隔离。

DBA用户能绕过常规权限控制吗?
能。只要拥有DBA角色,用户就默认具备EXECUTE ANY PROCEDURE,可直接调用任意模式下的包(包括DBMS_LOB、UTL_FILE、DBMS_SCHEDULER等高危系统包),常规GRANT/REVOKE对这类用户无效。
accessible by子句能限制DBA直接调用吗?
能,但仅限Oracle 12.1+,且必须配合AUTHID CURRENT_USER使用。它不是权限控制,而是编译期白名单机制:只有显式列在accessible by里的程序单元才能调用目标过程。
create or replace procedure sensitive_pkg.auth_proc authid current_user accessible by (wrapper_proc) as begin ... end;- DBA用户执行
exec sensitive_pkg.auth_proc会报ORA-06550错误,提示“not accessible” - 但DBA仍可创建自己的
wrapper_proc并绕过——所以该机制防的是误用,不是恶意绕过
如何让DBA调用时主动拒绝?
靠运行时角色检查。在包内部查询SESSION_ROLES视图,发现DBA或指定高危角色就抛异常。
- 必须用
AUTHID CURRENT_USER,否则SESSION_ROLES返回的是定义者角色,不是调用者角色 - 示例逻辑:
for r in (select role from session_roles where role in ('DBA', 'DATAPUMP_IMP_FULL_DATABASE')) loop raise_application_error(-20001, 'Unauthorized role detected'); end loop; - 注意:此检查可被禁用角色后绕过(如
SET ROLE NONE),需配合审计日志补位
真正可靠的方案只有Database Vault
Oracle Database Vault是唯一能从内核层拦截DBA访问特定对象的机制,它不依赖SQL层逻辑,连SYS也无法绕过策略。
- 需要单独安装和配置,不是开箱即用功能
- 典型配置:为敏感包所在Schema创建Realm,添加Rule Set限制“仅允许APP_ADMIN角色执行”,再把
DBA从Realm成员中排除 - 一旦启用,即使
conn / as sysdba执行call sensitive_pkg.do_dangerous_thing()也会被拦截并记录到DV$AUDIT_TRAIL
所有技术手段都建立在“不给DBA角色”这个前提上。如果必须分配DBA,那就没有真正安全的限制——只有审计+隔离+监控这一条路可走。











