作为一个oracle运维人员,我们日常需要排查,看系统中的用户是否都是我们正在使用的用户,以防止有人恶意建立用户,从而使得业务数据的系统。 我们一般都是通过查询dba_users来查看当前系统中的用户。如:select username from dba_users;
其实这种并不能完全显示我们系统中存在的用户,我来做如下演示:SQL> select username from dba_users;
USERNAME
------------------------------
SYS
SYSTEM
SCOTT
OUTLN
MGMT_VIEW
MDSYS
ORDSYS
CTXSYS
ANONYMOUS
EXFSYS
DMSYS
USERNAME
------------------------------
DBSNMP
WMSYS
SYSMAN
XDB
ORDPLUGINS
SI_INFORMTN_SCHEMA
OLAPSYS
MDDATA
DIP
TSMSYS
21 rows selected.
SQL> conn xlh/oracle
Connected.
SQL> show user
USER is "XLH"
从这个演示过程中,我们不难发现,我们在DBA_USERS中检查是没有发现XLH这个用户的,而我们却用这个账户登录成功。
这个用户我们就称之为匿藏用户。
在这里我给大家提供一种检测隐藏用户的方法:SQL> select USER# AS USERID,NAME,TYPE# AS TYPE FROM SYS.USER$ WHERE TYPE#=1 AND (NAME NOT IN (SELECT USERNAME AS NAME FROM ALL_USERS) OR NAME NOT IN (SELECT USERNAME AS NAME FROM DBA_USERS) );
USERID NAME TYPE
---------- ------------------------------ ----------
55 XLH 1
这里查询出来的即为匿藏用户,那我们就需要分析一下为什么会出现这种情况,首先我们取出DBA_USERS的定义:SQL> select dbms_metadata.get_ddl('VIEW','DBA_USERS','SYS') FROM dual;
DBMS_METADATA.GET_DDL('VIEW','DBA_USERS','SYS')
--------------------------------------------------------------------------------
CREATE OR REPLACE FORCE VIEW "SYS"."DBA_USERS" ("USERNAME", "USER_ID", "PASSWO
RD", "ACCOUNT_STATUS", "LOCK_DATE", "EXPIRY_DATE", "DEFAULT_TABLESPACE", "TEMPOR
ARY_TABLESPACE", "CREATED", "PROFILE", "INITIAL_RSRC_CONSUMER_GROUP", "EXTERNAL_
NAME") AS
select u.name, u.user#, u.password,
。。。
。。。
and u.type# = 1
and u.resource$ = pr.profile#
and dp.profile# = 0
DBMS_METADATA.GET_DDL('VIEW','DBA_USERS','SYS')
--------------------------------------------------------------------------------
and dp.type#=1
and dp.resource#=1
and pr.type# = 1
and pr.resource# = 1
and u.name !='XLH'
注意看高亮部门,系统视图呗篡改,有木有?
这种情况下,我们需要将篡改的视图改回去,即可正常使用DBA_USERS来查询出所有的用户。