就安全性而言,Oracle数据库最令我烦恼的是两件事,这是我执行安全审核的大多数Oracle数据库中大量的默认用户,以及默认情况下为所有用户提供的大量PUBLIC赠款。
保护Oracle的主要目标是阻止人们连接到数据库。如果可以,则仅允许进行连接工作所需的确切用户数。这可以通过网络控件,Oracle网络控件(例如有效节点检查)以及数据库控件(例如登录触发器或Database Vault CONNECT命令规则)来实现。如果您随后确保每个帐户仅具有执行其工作所需的确切权限,以及如此一来,您就可以拥有良好的数据安全性并锁定自己。然后,您可以锁定对数据本身的访问控制,甚至可以使用基于上下文的安全性,例如VPD或OLS,DV,编辑,屏蔽,TSDP等。这是最少的特权。
然后,您便有了一定程度的初始控制。然后,必须以少数几种通用方式之一进行攻击:
-
被允许连接的用户帐户可以利用数据库或数据控件的其他功能。这意味着,如果您拥有有效的帐户并可以连接到数据库,则需要在数据库设置,数据访问控制中发现空白,或者利用您实际上没有最少权限的事实
-
攻击者可以利用数据库访问协议(TNS,OLOGON等)中的远程漏洞,找到一种无需用户名或没有用户名和密码即可访问数据库的方法。这可以像猜测默认用户密码一样简单,也可以像网络堆栈缓冲区溢出一样极端,或者…
-
攻击者可以在应用程序堆栈中找到漏洞,并通过隧道传输到数据库。例如应用程序代码中的SQL注入。
-
其他可能…
所以,回到我的前两点。我们要阻止人们进行连接,对于那些我们允许连接的人,我们限制了他们可以使用的程序(程序),我们拥有强大的密码控制,然后我们将权限设置为最低限度,最后实现适当的数据域,数据访问控制,甚至基于上下文安全性但是,由于许多我们可能不需要的默认帐户以及数以万计的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!




