暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ORA-28050-我可以删除SYSTEM用户吗?

原创 Pete Finnigan 2020-04-16
1442

就安全性而言,Oracle数据库最令我烦恼的是两件事,这是我执行安全审核的大多数Oracle数据库中大量的默认用户,以及默认情况下为所有用户提供的大量PUBLIC赠款。

保护Oracle的主要目标是阻止人们连接到数据库。如果可以,则仅允许进行连接工作所需的确切用户数。这可以通过网络控件,Oracle网络控件(例如有效节点检查)以及数据库控件(例如登录触发器或Database Vault CONNECT命令规则)来实现。如果您随后确保每个帐户仅具有执行其工作所需的确切权限,以及如此一来,您就可以拥有良好的数据安全性并锁定自己。然后,您可以锁定对数据本身的访问控制,甚至可以使用基于上下文的安全性,例如VPD或OLS,DV,编辑,屏蔽,TSDP等。这是最少的特权。

然后,您便有了一定程度的初始控制。然后,必须以少数几种通用方式之一进行攻击:

  1. 被允许连接的用户帐户可以利用数据库或数据控件的其他功能。这意味着,如果您拥有有效的帐户并可以连接到数据库,则需要在数据库设置,数据访问控制中发现空白,或者利用您实际上没有最少权限的事实

  2. 攻击者可以利用数据库访问协议(TNS,OLOGON等)中的远程漏洞,找到一种无需用户名或没有用户名和密码即可访问数据库的方法。这可以像猜测默认用户密码一样简单,也可以像网络堆栈缓冲区溢出一样极端,或者…

  3. 攻击者可以在应用程序堆栈中找到漏洞,并通过隧道传输到数据库。例如应用程序代码中的SQL注入。

  4. 其他可能…

所以,回到我的前两点。我们要阻止人们进行连接,对于那些我们允许连接的人,我们限制了他们可以使用的程序(程序),我们拥有强大的密码控制,然后我们将权限设置为最低限度,最后实现适当的数据域,数据访问控制,甚至基于上下文安全性但是,由于许多我们可能不需要的默认帐户以及数以万计的PUBLIC赠款,我们处于困境。

如果我们可以拥有一个没有默认帐户且没有PUBLIC赠款的数据库,那么我们将有一个更强大的起点。不幸的是,我们在库存12.2c,18c,19c数据库中得到了44K,45K。

因此,在此讨论和探索的一部分中,我想研究一下SYSTEM用户。我去过DBA的大多数站点都使用SYSDBA进行日常工作,否则,他们将SYSTEM用作默认DBA帐户。但是SYSTEM有什么。首先,让我们连接到我的11.2.0.4数据库:

SQL> sho用户
USER是“ SYS” 
SQL>从v $ version选择标题;

横幅
------------------------------------------------- ------------------------------- 
Oracle Database 11g版本11.2.0.4.0-64位生产
PL / SQL版本11.2.0.4 
.0- 生产CORE 11.2.0.4.0 
Linux的生产TNS:版本11.2.0.4.0-生产
NLSRTL版本11.2.0.4.0-生产

SQL>

现在,SYSTEM具有哪些对象:

SQL>从dba_objects中选择count(*),object_type,其中owner ='SYSTEM'按object_type分组;

  COUNT(*)OBJECT_TYPE 
---------- ------------------- 
        64索引分区
        20序列
        45表分区
         4队列
         1程序
        25小叶
         1包
         1包体
         2触发器
       167表
       253索引

  计数(*)OBJECT_TYPE 
---------- ------------------- 
         8 SYNONYM 
        14视图
         4功能
         9 TYPE 

选择了15行。

SQL>

SYSTEM拥有的主要PL / SQL对象是什么:

SQL> a30的col object_name 
SQL>   a30的col object_type 
SQL> l 
1 *从dba_objects中选择object_name,object_type,其中owner ='SYSTEM'和object_type in('PROCEDURE','FUNCTION','PACKAGE','PACKAGE BODY')
SQL> / 

OBJECT_NAME OBJECT_TYPE 
------------------------------ --------------- --------------- 
ORA $ _SYS_REP_AUTH PROCEDURE 
DBMS_REPCAT_AUTH PACKAGE 
LOGMNR $ TAB_GG_TABF_PUBLIC FUNCTION 
LOGMNR $ COL_GG_TABF_PUBLIC FUNCTION 
LOGMNR $ SEQ_GG_TABF_PUBLIC FUNCTION 
LOGMNR $ KEY_GG_TABF_PUBLIC FUNCTION 
DBMS_REPCAT_AUTH PACKAGE BODY 

选择7行。

SQL>

这些是REPCAT和LogMiner对象,表格:

SQL>从dba_objects中选择object_name,object_type,其中owner ='SYSTEM'和object_type ='TABLE'; 

OBJECT_NAME OBJECT_TYPE 
------------------------------ ------------------ ------------ 
LOGMNR_SESSION_EVOLVE $表
LOGMNR_GLOBAL $表
LOGMNR_GT_TAB_INCLUDE $表
LOGMNR_GT_USER_INCLUDE $表
LOGMNR_GT_XID_INCLUDE $表
LOGMNR_UID $表
LOGMNRGGC_GTLO表
LOGMNRGGC_GTCS表
LOGMNRC_DBNAME_UID_MAP表
LOGMNR_LOG $表
LOGMNR_PROCESSED_LOG $表

OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------- ---------- 
LOGMNR_SPILL $表
LOGMNR_AGE_SPILL $表
LOGMNR_RESTART_CKPT_TXINFO $表
LOGMNR_ERROR $表
LOGMNR_RESTART_CKPT $表
LOGMNR_INTEGRATED_SPILL $表
LOGMNR_FILTER $表
LOGMNR_SESSION_ACTIONS $表
LOGMNR_PARAMETER $表
LOGMNR_SESSION $表
LOGMNRT_MDDL $表

OBJECT_NAME OBJECT_TYPE 
----- ------------------------- ------------------------- ----- 
MVIEW $ _ADV_WORKLOAD表格
MVIEW $ _ADV_BASETABLE表格
MVIEW $ _ADV_SQLDEPEND表
MVIEW $ _ADV_PRETTY表
MVIEW $ _ADV_TEMP表
MVIEW $ _ADV_FILTER表
MVIEW $ _ADV_LOG表
MVIEW $ _ADV_FILTERINSTANCE表
MVIEW $ _ADV_LEVEL表
MVIEW $ _ADV_ROLLUP表
MVIEW $ _ADV_AJG表

OBJECT_NAME OBJECT_TYPE 
------------ ------------------ ------------------------------ 
MVIEW $ _ADV_FJG表
MVIEW $ _ADV_GC表
MVIEW $ _ADV_CLIQUE表
MVIEW $ _ADV_ELIGIBLE表
MVIEW $ _ADV_OUTPUT表
MVIEW $ _ADV_EXCEPTIONS表
MVIEW $ _ADV_PARAMETERS表
MVIEW $ _ADV_INFO表
MVIEW $ _ADV_JOURNAL表
MVIEW $ _ADV_PLAN表
AQ $ _QUEUE_TABLES表

OBJECT_NAME OBJECT_TYPE 
------------------------ ------ ------------------------------ 
AQ $ _QUEUES表
AQ $ _SCHEDULES表
AQ $ _INTERNET_AGENTS表
AQ $ _INTERNET_AGENT_PRIVS表
OL $表
OL $ HINTS表
OL $ NODES表
DEF $ _ERROR表
DEF $ _DESTINATION表
DEF $ _CALLDEST表
DEF $ _DEFAULTDEST表

OBJECT_NAME OBJECT_TYPE 
------------------------------ ------ ------------------------ 
DEF $ _LOB表
DEF $ _PROPAGATOR表
DEF $ _ORIGIN表
DEF $ _PUSHED_TRANSACTIONS表
REPCAT $ _REPCAT表
REPCAT $ _FLAVORS表
REPCAT $ _REPSCHEMA表
REPCAT $ _SNAPGROUP表
REPCAT $ _REPOBJECT表
REPCAT $ _REPCOLUMN表
REPCAT $ _KEY_COLUMNS表

OBJECT_NAME OBJECT_TYPE 
------------------------------ ------------------ ------------ 
REPCAT $ _GENERATED表
REPCAT $ _REPPROP表
REPCAT $ _REPCATLOG表
REPCAT $ _DDL 
表
REPCAT $ _REPGROUP_PRIVS表
REPCAT $ _PRIORITY_GROUP表
REPCAT $ _PRIORITY表
REPCAT $ _COLUMN_GROUP_GROUP表
REPCAT $ _CONFLICT TABLE 
REPCAT $ _RESOLUTION_METHOD TABLE 

OBJECT_NAME OBJECT_TYPE 
------------------------------ ------------ ------------------ 
REPCAT $ _RESOLUTION表
REPCAT $ _RESOLUTION_STATISTICS表
REPCAT $ _RESOL_STATS_CONTROL表
REPCAT $ _PARAMETER_COLUMN表
REPCAT $ _AUDIT_ATTRIBUTE表
REPCAT $ _AUDIT_COLUMN表
REPCAT $ _FLAVOR_OBJECTS表
REPCAT $ _TEMPLATE_STATUS表
REPCAT $ _TEMPLATE_TYPES表
REPCAT $ _REFRESH_TEMPLATES表
REPCAT $ _USER_AUTHORIZATIONS表

OBJECT_NAME OBJECT_TYPE 
-------- ---------------------- ---------------------------- - 
REPCAT $ _OBJECT_TYPES表
REPCAT $ _TEMPLATE_REFGROUPS表
REPCAT $ _TEMPLATE_OBJECTS表
REPCAT $ _TEMPLATE_PARMS表
REPCAT $ _OBJECT_PARMS表
REPCAT $ _USER_PARM_VALUES表
REPCAT $ _TEMPLATE_SITES表
REPCAT $ _SITE_OBJECTS表
REPCAT $ _RUNTIME_PARMS表
REPCAT $ _TEMPLATE_TARGETS表
REPCAT $ _EXCEPTIONS表

OBJECT_NAME OBJECT_TYPE 
-------------------- ---------- ------------------------------ 
REPCAT $ _INSTANTIATION_DDL表
REPCAT $ _EXTENSION表
REPCAT $ _SITES_NEW TABLE 
LOGMNR_DICTSTATE $ TABLE 
LOGMNRC_GTLO TABLE 
LOGMNRC_GTCS TABLE 
LOGMNRC_SEQ_GG TABLE
LOGMNRC_CON_GG表
LOGMNRC_CONCOL_GG表
LOGMNRC_IND_GG表
LOGMNRC_INDCOL_GG表

OBJECT_NAME OBJECT_TYPE 
------------------------------ ---------- -------------------- 
LOGMNRC_GSII表
LOGMNRC_GSBA表
LOGMNR_SEED $表
LOGMNR_DICTIONARY $表
LOGMNR_OBJ $表
LOGMNR_TAB $表
LOGMNR_COL $表
LOGMNR_ATTRCOL $表
LOGMNR_TS $表
LOGMNR_IND $表
LOGMNR_USER $ TABLE 

OBJECT_NAME OBJECT_TYPE 
------------------------------ --------------- --------------- 
LOGMNR_TABPART $表
LOGMNR_TABSUBPART $表
LOGMNR_TABCOMPART $表
LOGMNR_TYPE $表
LOGMNR_COLTYPE $表
LOGMNR_ATTRIBUTE $表
LOGMNR_LOB $表
LOGMNR_CON $表
LOGMNR_CDEF $表
LOGMNR_CCOL $表
LOGMNR_ICOL $表

OBJECT_NAME OBJECT_TYPE 
------------------------------ -------------------- ----------
LOGMNR_LOBFRAG $表
LOGMNR_INDPART $表
LOGMNR_INDSUBPART $表
LOGMNR_INDCOMPART $表
LOGMNR_LOGMNR_BUILDLOG表
LOGMNR_NTAB $表
LOGMNR_OPQTYPE $表
LOGMNR_SUBCOLTYPE $表
LOGMNR_KOPM $表
LOGMNR_PROPS $表
LOGMNR_ENC $表

OBJECT_NAME OBJECT_TYPE 
---------------- -------------- ------------------------------ 
LOGMNR_REFCON $表
LOGMNR_PARTOBJ $表
LOGMNRP_CTAS_PART_MAP表
SCHEDULER_PROGRAM_ARGS_TBL表
SCHEDULER_JOB_ARGS_TBL表
LOGSTDBY $参数表
LOGSTDBY $事件表
LOGSTDBY $ APPLY_PROGRESS表
LOGSTDBY $ APPLY_MILESTONE表
LOGSTDBY $ SCN表
LOGSTDBY $ FLASHBACK_SCN表

OBJECT_NAME OBJECT_TYPE 
-------------------- ---------- ------------------------------ 
LOGSTDBY $ PLSQL表
LOGSTDBY $ SKIP_TRANSACTION TABLE 
LOGSTDBY $跳过表
LOGSTDBY $ SKIP_SUPPORT表
LOGSTDBY $ HISTORY表
LOGSTDBY $ EDS_TABLES表
DEF $ _AQCALL表
DEF $ _AQERROR表
SQLPLUS_PRODUCT_PROFILE表
帮助表
MVIEW $ _ADV_INDEX表

OBJECT_NAME OBJECT_TYPE 
------------------------------- ---------------------------- 
MVIEW $ _ADV_PARTITION表
MVIEW $ _ADV_OWB表已

选择167行。

SQL>

同样,很多LogMiner,repcat甚至是OL $中的轮廓。SYSTEM直接授予了哪些角色;不是授予角色等的角色,而是直接授予的角色:

SQL>从dba_role_privs中选择grant_role,其中grantee ='SYSTEM'; 

GRANTED_ROLE 
------------------------------ 
AQ_ADMINISTRATOR_ROLE 
DBA 
MGMT_USER 

SQL>

因此,最后对SYSTEM对象进行了哪些授权:

SQL> a30的col特权SQL> a30的
col受赠者SQL> a30的
col table_name 
SQL>设置第220行
SQL>从dba_tab_privs p,dba_objects o中选择p.privilege,p.grantee,p.table_name,o.object_type。 owner ='SYSTEM'和o.owner = p.owner和o.object_name = p.table_name; 

PRIANTLEGE GRANTEE TABLE_NAME OBJECT_TYPE 
------------------------------ ---------------- -------------- ------------------------------ ------ -------------- 
删除公共OL $表
插入公共OL $表
选择公共OL $表
更新公共OL $表
删除公共OL $ HINTS表
插入公共OL $ HINTS表
选择公共OL $ HINTS表
更新公共OL $ HINTS表
删除公共OL $ NODES表
插入公共OL $ NODES表
SELECT公共OL $ NODES表

特权GRANTEE TABLE_NAME OBJECT_TYPE 
------------------------------ ---- -------------------------- ------------------------ ------ -------------------- 
更新
公用OL $节点表选择系统REPCAT $ _REPSCHEMA表
选择系统REPCAT $ _REPPROP表
SELECT SYS DEF $ _CALLDEST表
的SELECT SYS DEF $ _ERROR表
的SELECT SYS DEF $ _DESTINATION表
的SELECT SELECT_CATALOG_ROLE SCHEDULER_PROGRAM_ARGS VIEW 
SELECT SELECT_CATALOG_ROLE SCHEDULER_JOB_ARGS VIEW 
SELECT SELECT_CATALOG_ROLE SCHEDULER_PROGRAM_ARGS_TBL表
的SELECT SELECT_CATALOG_ROLE SCHEDULER_JOB_ARGS_TBL表
SELECT SYS DEF $ _AQCALL TABLE 

特权列表TABLE_NAME OBJECT_TYPE 
------------------------------ ---------- -------------------- ------------------------------ -------------------- 
SELECT SYS DEF $ _AQCALL队列
SELECT PUBLIC PRODUCT_PRIVS VIEW 
SELECT SELECT PUBLIC HELP TABLE 
删除PUBLIC MVIEW $ _ADV_OWB TABLE
插入PUBLIC MVIEW $ _ADV_OWB表
选择PUBLIC MVIEW $ _ADV_OWB表
更新PUBLIC MVIEW $ _ADV_OWB表
删除PUBLIC MVIEW $ _ADV_PARTITION表
插入PUBLIC MVIEW $ _ADV_PARTITION表
选择PUBLIC MVIEW $ _ADVPITION TABLE 
PUBLIC MVIEW $ _ADVPITION

PRIANTLEGE GRANTEE TABLE_NAME OBJECT_TYPE 
------------------------------ ---------------- -------------- ------------------------------ ------ -------------- 
删除公开MVIEW $ _ADV_INDEX表
的INSERT PUBLIC MVIEW $ _ADV_INDEX表
选择公开MVIEW $ _ADV_INDEX表
更新公用MVIEW $ _ADV_INDEX TABLE 
DELETE OLAPSYS MVIEW $ _ADV_OUTPUT表
INSERT OLAPSYS MVIEW $ _ADV_OUTPUT表
的SELECT OLAPSYS MVIEW $ _ADV_OUTPUT表
UPDATE OLAPSYS MVIEW $ _ADV_OUTPUT TABLE 
DELETE OLAPSYS MVIEW $ _ADV_PARTITION表
的INSERT OLAPSYS MVIEW $ _ADV_PARTITION表
的SELECT OLAPSYS MVIEW $ _ADV_PARTITION表

PRIVILEGE GRANTEE TABLE_NAME OBJECT_TYPE
------------------------------ -------------------- ---------- ------------------------------ ---------- ---------- 
更新OLAPSYS MVIEW $ _ADV_PARTITION表
删除OLAPSYS MVIEW $ _ADV_INDEX表
插入OLAPSYS MVIEW $ _ADV_INDEX表
选择OLAPSYS MVIEW $ _ADV_INDEX表
更新OLAPSYS MVIEW $ _ADV_INDEX表已

选择49行。

SQL>                 

因此,SYSTEM看起来像一个DBA帐户,因为它具有DBA角色,并且多年来一直是Oracle中的默认DBA帐户,但它也具有诸如OL $和LogMiner对象之类的对象。这是冲突的典型案例。是DBA还是架构?就像我们创建Oracle数据库以及创建用户和模式的其他人一样,Oracle似乎对SYSTEM有点困惑。

理想情况下,任何人都不应使用SYSTEM。它是默认值,它与数据库中的最低权限相反,因此显然在设计良好且安全的数据库中没有用。因此,我们可以删除SYSTEM:

SQL>删除用户系统级联;
删除用户系统级联
* 
第1行出现错误:
ORA-28050:无法删除指定的用户或角色


SQL>

我们被SYSTEM困扰,这是个坏消息。理想情况下,我们应该能够拥有一个仅包含SYS而没有其他用户且没有PUBLIC授予的Oracle数据库,但这永远不会发生。我们应该机会在我们的数据库中获得最低权利。

更多精彩敬请期待!

Bye from WFH!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论