🍦 3.1 Oracle检查拥有DBA权限的用户
检查 Oracle 数据库中拥有 DBA 权限的用户,通常包括以下三种情况:
- 被授予 DBA 角色 的用户
- 被直接授予 DBA 相关系统权限(如
ALTER DATABASE,CREATE USER等)的用户(较少见) - 拥有 SYSDBA 或 SYSOPER 系统权限的用户(通常通过密码文件认证)
以下提供相应的检查 SQL:
一、检查被授予 DBA 角色的用户
SELECT grantee, granted_role, admin_option, default_role
FROM dba_role_privs
WHERE granted_role = 'DBA'
ORDER BY grantee;
grantee:被授予角色的用户或角色。admin_option:是否具有将 DBA 角色授予其他用户的权限。default_role:该角色是否为默认启用(YES表示登录时自动生效)。
注意:如果
grantee是角色,说明该角色被授予了 DBA 角色,再通过该角色间接授予用户,需进一步追踪。
二、检查所有被直接授予 DBA 相关系统权限的用户(含角色)
SELECT grantee, privilege, admin_option
FROM dba_sys_privs
WHERE privilege IN ('DBA', 'ALTER DATABASE', 'CREATE TABLESPACE', 'MANAGE TABLESPACE',
'UNLIMITED TABLESPACE', 'BECOME USER', 'CREATE USER')
OR privilege LIKE '%ANY%' -- 如 DROP ANY TABLE 等高级权限
ORDER BY grantee, privilege;
通常情况下,真正的 DBA 权限通过 DBA 角色授予,直接授予系统权限较少见。
三、检查拥有 SYSDBA / SYSOPER 权限的用户
这些用户可通过密码文件或操作系统认证以 SYSDBA 身份登录。
SELECT username, sysdba, sysoper
FROM v$pwfile_users
ORDER BY username;
sysdba:TRUE表示拥有 SYSDBA 权限。sysoper:TRUE表示拥有 SYSOPER 权限。
如果密码文件不存在或未配置,
v$pwfile_users 可能为空,但SYSDBA 仍可通过操作系统认证(如sqlplus / as sysdba)。
四、组合查询(显示所有拥有 DBA 角色或 SYSDBA 的用户)
-- 拥有 DBA 角色的用户
SELECT grantee AS username, 'DBA ROLE' AS priv_type
FROM dba_role_privs
WHERE granted_role = 'DBA'
UNION
-- 拥有 SYSDBA 的用户(来自密码文件)
SELECT username, 'SYSDBA' AS priv_type
FROM v$pwfile_users
WHERE sysdba = 'TRUE'
ORDER BY username;
五、进一步检查:通过角色链间接获得 DBA 权限
如果 DBA 角色被授予了其他角色,需递归查询。可用以下 SQL 找出所有最终继承 DBA 角色的用户:
WITH role_hierarchy (grantee, granted_role, lvl) AS (
SELECT grantee, granted_role, 1
FROM dba_role_privs
WHERE granted_role = 'DBA'
UNION ALL
SELECT rp.grantee, rp.granted_role, rh.lvl + 1
FROM role_hierarchy rh, dba_role_privs rp
WHERE rh.grantee = rp.granted_role
)
SELECT grantee, 'DBA (via role chain)' AS priv_type
FROM role_hierarchy
UNION
SELECT grantee, 'DBA (direct role)'
FROM dba_role_privs
WHERE granted_role = 'DBA'
ORDER BY grantee;
六、注意事项
- 权限过大:拥有 DBA 角色或 SYSDBA 的用户几乎可以执行任何操作,应严格控制用户列表。
阅读:142
发布时间: