在Oracle数据库的日常管理中,DBA通常拥有SYSDBA等最高权限,部分违规DBA可能通过特定手段盗用普通用户的身份执行操作,以此绕过针对普通用户的操作审计,掩盖自身的不当行为。这种操作不需要获取普通用户的明文密码,仅利用数据库自身的权限机制和特性即可实现。

利用代理用户机制盗用身份
Oracle支持代理用户功能,允许一个用户通过代理方式以另一个用户的身份连接数据库,这是DBA盗用用户身份最常见的方式。DBA可以先给自身账号授予代理目标用户的权限,之后就可以直接以目标用户身份建立会话。
首先,DBA需要执行以下SQL语句授予代理权限:
-- 授予DBA用户dba_user代理普通用户normal_user的权限 ALTER USER normal_user GRANT CONNECT THROUGH dba_user;
之后DBA连接数据库时,指定代理用户参数即可切换到普通用户身份:
-- 使用dba_user代理连接,实际身份为normal_user CONNECT dba_user[normal_user]/dba_password@orcl
连接成功后,执行USER函数查看当前用户,会显示为normal_user,所有操作都会以normal_user的身份记录,不会关联到dba_user。
通过会话切换盗用已登录用户身份
如果普通用户已经建立了活跃的数据库会话,DBA可以通过切换到该会话的方式,直接使用该用户的身份执行操作。这种方式需要DBA拥有管理会话的权限。
首先查询当前活跃会话的信息:
-- 查询所有活跃会话的SID、SERIAL#和用户名 SELECT SID, SERIAL#, USERNAME FROM V$SESSION WHERE USERNAME IS NOT NULL;
假设目标普通用户normal_user的会话SID为123,SERIAL#为456,DBA可以执行以下命令切换到该会话:
-- 切换到指定会话,注意该操作需要较高权限 EXEC DBMS_SYSTEM.SET_EV(123, 456, 10046, 0, '');
切换后执行的SQL操作都会归属到该normal_user的会话下,操作记录也会对应到normal_user的身份。
借助权限继承间接盗用身份
DBA还可以通过给普通用户授予特定角色,再让自己继承该角色的方式,间接获得普通用户的操作权限,虽然连接身份还是DBA自身,但操作权限和审计记录会和普通用户高度重合。
首先创建角色并授予普通用户:
-- 创建测试角色 CREATE ROLE test_role; -- 给角色授予普通用户的表操作权限 GRANT SELECT, INSERT ON normal_user.test_table TO test_role; -- 把角色授权给普通用户 GRANT test_role TO normal_user;
之后DBA给自己授予该角色:
-- DBA获取该角色权限 GRANT test_role TO dba_user; -- 激活角色 SET ROLE test_role;
此时DBA执行的相关操作,权限来源会显示为test_role,而该角色归属于normal_user,审计时容易被误关联到normal_user的操作。
相关风险与防范建议
上述盗用身份的操作会带来严重的安全风险,包括数据被违规篡改、越权访问敏感数据、操作追溯困难等问题。建议在Oracle数据库中做以下防范:
- 严格限制代理用户权限的授予,仅允许必要的场景使用,并且记录所有代理权限的授予操作
- 开启完善的操作审计,不仅记录操作用户,还要记录原始登录IP、客户端信息等关联信息
- 定期排查V$SESSION视图中的异常会话,检查是否存在会话切换、异常代理连接的情况
- 给DBA账号开启强制审计,所有SYSDBA权限的操作都要单独记录,不允许关闭审计
企业还需要建立明确的数据库操作规范,禁止DBA未经审批使用代理、会话切换等方式盗用普通用户身份,从管理和技术两个层面保障Oracle数据库的安全。