查alter system权限最直接的方法是查询dba_sys_privs视图,执行select grantee, admin_option from dba_sys_privs where privilege = 'alter system';它仅记录直接授予的权限,不包含角色继承权限,且大小写不敏感。

查DBA_SYS_PRIVS里带ALTER SYSTEM的记录最直接
ALTER SYSTEM是Oracle中极敏感的系统权限,拥有它等于能动态修改数据库运行参数、杀会话、甚至触发实例重启。查它不能靠猜或翻角色,必须直击DBA_SYS_PRIVS视图——这是唯一记录「谁被直接授予了什么系统权限」的地方。
执行这条语句就能定位所有高危用户:
SELECT grantee, admin_option FROM DBA_SYS_PRIVS WHERE privilege = 'ALTER SYSTEM';
-
grantee可能是用户名,也可能是角色名(如'DBA'),需进一步判断是否为真实操作账号 -
admin_option = 'YES'表示该用户还能用WITH ADMIN OPTION把ALTER SYSTEM再授给别人,风险加倍 - 注意大小写:权限名必须写成
'ALTER SYSTEM',写成'alter system'或'Alter System'也能匹配(Oracle对权限名不区分大小写),但写错字母就查不到
别漏掉通过角色继承获得ALTER SYSTEM的用户
只查DBA_SYS_PRIVS会漏掉大量实际拥有该权限的人——因为ALTER SYSTEM常被包含在DBA、EXP_FULL_DATABASE等预定义角色里。这些角色本身不直接出现在DBA_SYS_PRIVS中,得递归查角色链。
先确认哪些角色有这个权限:
SELECT role FROM ROLE_SYS_PRIVS WHERE privilege = 'ALTER SYSTEM';
再查这些角色被授予了哪些用户(排除中间角色):
SELECT r.grantee FROM DBA_ROLE_PRIVS r JOIN (SELECT role FROM ROLE_SYS_PRIVS WHERE privilege = 'ALTER SYSTEM') p ON r.granted_role = p.role WHERE r.grantee IN (SELECT username FROM DBA_USERS);
- 最后的
IN (SELECT username FROM DBA_USERS)很关键,否则grantee可能是另一个角色(比如'APP_ADMIN'),你得继续往下挖 -
ROLE_SYS_PRIVS不需要DBA权限,普通有SELECT_CATALOG_ROLE的账号就能查 - 如果结果为空,不代表没人有权限——可能用了外部认证或口令文件登录后手动授权,这类行为不会留痕在数据字典里
警惕V$PWFILE_USERS里的SYSDBA用户
ALTER SYSTEM不是必须通过系统权限才能执行。任何能以SYSDBA身份登录的用户,哪怕没被显式授予ALTER SYSTEM,也能无条件执行它。所以V$PWFILE_USERS必须同步检查。
执行:
SELECT username, sysdba FROM V$PWFILE_USERS WHERE sysdba = 'TRUE';
- 返回的每个
username都具备等同于ALTER SYSTEM的实际能力,且绕过常规审计(除非启用了AUDIT_SYS_OPERATIONS) - 这个视图需要
SELECT ANY DICTIONARY或SELECT_CATALOG_ROLE权限,普通DBA账号默认没有,得切到SYS下查 - 注意:
V$PWFILE_USERS只反映口令文件中的条目,不包括通过操作系统认证(OS auth)或LDAP登录的SYSDBA用户,后者更难追踪
为什么SESSION_PRIVS查不到ALTER SYSTEM
有人会想用SESSION_PRIVS看当前会话生效的权限,但它对ALTER SYSTEM无效。原因很实在:
-
SESSION_PRIVS只返回「当前会话已激活的角色所携带的系统权限」,而ALTER SYSTEM属于「直接授予用户的系统权限」,不依赖角色激活状态 - 即使你刚
SET ROLE dba;,SESSION_PRIVS也不会多出ALTER SYSTEM——因为它本来就不在DBA角色的定义里(Oracle 12c+起DBA角色默认不含ALTER SYSTEM) - 真正起作用的是
DBA_SYS_PRIVS里的记录,或者SYSDBA登录态,这两者都不受会话角色开关影响
最容易被忽略的是:一个用户可能既没出现在DBA_SYS_PRIVS里,也没在V$PWFILE_USERS中,但他刚被别人用GRANT ALTER SYSTEM TO ... WITH ADMIN OPTION授过权,而你查的是授权前的快照——权限视图不实时刷新,得重新执行查询。











