freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

等保测评2.0:Oracle访问控制(下)
2020-07-16 15:49:31

 1. 说明

本篇文章主要说一下Oracle数据库中身份鉴别控制点中d、e、f、g测评项的相关知识点和理解。

 2. 测评项

d)应授予管理用户所需的最小权限,实现管理用户的权限分离;
e)应由授权主体配置访问控制策略,访问控制策略规定主体对客体的访问规则;
f)访问控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级;
g)应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问。

 3. oracle的权限结构

在数据库权限方面,对方很可能完全不清楚某用户是用来干什么的,或者容易给出错误的判断。
所以实际上,这个控制点下的测评项,依靠用户访谈的得出的结论可靠性极差。
所以,掌握Oracle的基本权限方面的知识,在不依靠用户访谈的情况下,能够判断出某用户的大概用途,从而合情合理的写在结果记录里,是很有必要的。

3.1. 特殊角色、特殊权限

这部分其实在等保测评2.0:Oracle身份鉴别(上)中有提到过一些,这里就大概的简单的引用下。

这里就存在一个和其它数据库不大一样的地方,比如SqlServer,我要启动SqlServer,用命令行也好,用图形化界面也好,我只要在windows中把SqlServer的相关服务启动起来就可以了。
但是在oracle这里,却需要使用oracle数据库中的用户去连接它然后启动它。
所以这里就会存在一种特殊的数据库的角色,它可以在数据库没有启动的时候,对数据库执行一些操作,比如启动数据库,也可以关闭数据库。
同时必然的,对于属于这列特殊角色的用户,它的身份验证和权限判定肯定不是依靠数据库中相关字段的对比(因为数据库没启动前,无法查询到表中的数据)。

这里的角色主要包括sysdba和sysoper1594885160.png!small

那么由于其角色身份的认定信息不是存储在数据库中,而是存储在密码文件中,在linux中,这个文件在$ORACLE_HOME/dbs/目录中,以orapw开头,其内容是加密的:

1594885175.png!small

通过查询这个文件,可以知道哪些用户拥有相关的特殊角色:

1594885184.png!small

这里就能看到,口令文件中仅存在SYS用户,且SYS用户同时拥有sysdba和sysoper角色。

至于具体它拥有的是sysdba还是sysoper角色的情况,要看它每次登录的时候的连接语句是如何写的,如:

sqlplus / as sysdba;

连接语句中可以在最后加一个关键词as,即以什么样的角色登录数据库,as后面可以跟三个单词,分别是sysdba、sysoper、normal。
这里有三种情况:

  1. 不加as关键词、as normal是一个意思,即以数据库内的普通的用户身份登录,这个时候你拥有什么权限,就是看你在数据库内有哪些权限了;

  2. as sysdba,那么你就是以sysdba这个特殊角色的身份登录数据库;

  3. as sysoper,那么你就是以sysoper这个特殊角色的身份登录数据库。

注意,同样一个用户如sys用户,使用as sysdba,那么它就具有sysdba的权限,但是如果使用as sysoper,那么它就具有sysoper的权限(相较于sysdba权限大幅下降了)。

3.2. 普通角色、普通权限

权限大概也分成两种,一种是启动数据库、关闭数据库这类权限,一种就是普通的数据库的权限了(如查询、创建表等权限)。

如果说普通数据库的权限的话,以sysdba的身份登录,从普通权限的角度说,因为它是sys用户,则它具备dba角色的权限,以sysoper的身份登录,则它则具备public的权限。
注意,dba角色拥有数据库内的绝大部分的权限(是不是拥有所有权限不清楚,反正就是权限最高的一个角色)

以sysoper的身份登录,使用show user,结果是public

SQL> show user;
User is "PUBLIC"

sys和system都拥有dba角色:

1594885208.png!small

3.3. 普通权限的结构

Oracle的权限结构是这样的,某一个权限可以直接授予给某一个角色或用户,某个角色也可以授予给某个角色或用户(被授予的角色或用户就拥有这个角色的所有权限了)。
数据库内,权限分成两种,一种是系统权限,一种是对象权限。

3.4. 普通权限中的系统权限

系统权限就是创建表、创建索引这类权限。

查询某用户或某角色的所拥有的被直接授予的系统权限的语句如下(这里查询的是sys用户):

select * from dba_sys_privs where grantee='sys' ORDER BY GRANTEE

1594885221.png!small

grantee:被授权的用户或者角色,如图中的dba
privilege:具体的授予的系统权限
admin_option:即在使用授权语句时,是否使用了with admin option关键词,如果使用,则代表被授予该权限的用户或者角色,可以将被授予的这个权限再次授予给其它的用户或角色

注意,这个表仅代表某一个权限可以直接授予给某一个角色或用户的结果,如将dba角色授予给某用户X,那么在dba_sys_privs表中,仅会存在X用户被直接授予的系统权限行,而并不会存在通过拥有dba继承的权限行。。

Oracle中拥有很多方便使用者查询当前用户信息的视图,通常以user开头,比如可以查询user_sys_privs,他会显示当前用户(sys用户,我使用sys用户登录)所拥有的被直接授予的系统权限

 select * from user_sys_privs;

1594885236.png!small

查询某角色或某用户拥有的角色,语句如下(这里查的是sys用户):

select * from dba_role_privs where grantee='SYS'  ORDER BY GRANTEE

1594885245.png!small

grantee:被授予角色的用户或者角色,如图中的dba
granted_role:具体授予的角色
admin_option:具体意思和dba_sys_privs表的解释差不多,如果为YES,则应该代表授予的角色以及这个角色拥有的权限都可以再授予给其他角色或用户
default_role:代表是否为默认角色,如果是则代表正常,如果不是,则被授予者不默认拥有授予的角色,每次需要显示的开启,具体大家可以百度搜索下

同样,可以查询user_role_privs视图,它会显示当前用户拥有的角色(还存在session_roles视图,其与user_role_privs的区别在下文进行说明):

1594885258.png!small

3.5. 查询某用户拥有的全部系统权限

结合dba_sys_privs、dba_role_privs,查询某个用户拥有的所有的系统权限(包括直接授予、间接授予),语句如下:

SELECT *
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'SYS'
UNION ALL
SELECT *
FROM DBA_SYS_PRIVS
WHERE GRANTEE IN
(SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'SYS');

1594885273.png!small

你将某角色A赋予给某用户B,同时又直接将某权限a直接赋予给某用户B,如果角色A也拥有a权限的话,那么这里会查出重复的权限。

同样,也可以查询session_privs,它会显示当前用户被激活可使用的所有的系统权限(包括直接授予、间接授予):

select * from session_privs order by privilege;

1594885284.png!small

我对比同时查询dba_sys_privs、dba_role_privs表(然后去重)和查询session_privs视图的结果,对于sys用户,发现不完全一致,后者比前者多了6个权限,但是对于自己创建的普通账户,又是一致的……

所有的系统权限,可以查询system_privilege_map得知:

select * from session_privs order by privilege;

1594885293.png!small
里面的这个PROPERTY字段不清楚是什么意思。

3.6. 常见的系统权限

create session 连接数据库;
create view 建视图;
create procedure 建过程、函数、包;
create cluster 建簇;
create table 建表;
create public synonym 建同义词;
create trigger 建触发器;

其中create session是最基本的权限了,具备该权限才可以连接数据库。

带any关键词的权限,如UPDATE ANY TABLE,顾名思义,这类权限比较重要,授予要谨慎。
另外,还存在一个参数o7_dictionary_accessibility,当其为false(9i以及之后的版本默认值都是false,之前为true)的时候,此类带有any关键词的权限,对sys用户的Schema是一部分对象是没有效果的,sys用户的Schema里好像存着Oracle数据库的系统表、视图等(可百度oracle数据字典了解详情),如sys.dba_users,具备dba角色的普通用户也无法查询,不过类似于sys.AUD$又
可以查询到,我也不知道具体对哪些sys的对象有限制,哪些没有。

当o7_dictionary_accessibility为true的时候,sys Schema对于any关键词例外的限制就没有了。
更多内容可以自行搜索o7_dictionary_accessibility。

3.7. 普通权限中的对象权限

也就是对具体的数据库对象的权限,如对某个表的权限等。
select, update, insert, alter, index, delete, all //all代表前面这6权限

查询某用户拥有的被直接授予的对象权限

select * from dba_tab_privs where grantee='SYS'  ORDER BY GRANTEE

1594885307.png!small

至于与dba_tab_privs对应的user_tab_privis,不能理解为当前用户拥有的被直接授予的对象权限
查看Oracle官方文档可以知道,它会将owner, grantor, or grantee为当前user的列都查询出来:

1594885321.png!small

select * from user_tab_privs ORDER BY GRANTEE

1594885341.png!small

查询某用户直接拥有的表

select * from dba_tables where owner='SYS';

1594885353.png!small

查询当前用户拥有的表

select * from user_tables;

1594885361.png!small

3.8. 查询某用户拥有的所有对象权限

有三个地方要查:

某用户被直接授予的对象的权限(如某个表的select权限),语句略。

某用户直接拥有的对象(如某个表的所有者为这个用户,则该用户拥有该表的所有权限),语句略。

某用户被授予的角色,从而间接获得某角色拥有的对象权限(角色可以被直接授予某对象的权限,但是角色不能像用户那样成为某对象的所有者),语句如下:

SELECT *
FROM DBA_tab_PRIVS
WHERE GRANTEE = 'SYS'
UNION ALL
SELECT *
FROM DBA_tab_PRIVS
WHERE GRANTEE IN
(SELECT GRANTED_ROLE FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'SYS');

这里实验了一下public,发现就算把dba角色授予给public,其权限没有半点变化,无法创建表:

1594885371.png!small1594885382.png!small

当然,所有的用户也确实活得了dba的权限。

这里的session_roles代表当前用户被激活的角色,和user_role_privs有点区别吧,后者代表授予你哪些角色,但是授予了不一定就激活了。
比如default_role为false,或者public这种特殊的存在。

 4. 测评项d

d)应授予管理用户所需的最小权限,实现管理用户的权限分离;

这里比较简单了,对于状态为OPEN的用户,按照第3节的方式,把它的所有权限都查出来,就大概可以判断出其作用和是否做到了基本的权限分离了。
数据库系统中主要是业务用户居多,比如某用户只拥有某个数据库的权限,或者某用户只拥有查询权限,大家自己斟酌吧。

 5. 测评项e

e)应由授权主体配置访问控制策略,访问控制策略规定主体对客体的访问规则;

这里其实就是看是否有专门的或者兼职的安全管理员账户吧,能够授予或者撤销用户、角色的权限。

这里说一说授权,前面说过存在with admin option,同时也存在with grant option,决定被授予的权限的用户能否将该权限授予给他人。
网上说得很清楚了,我直接截图了:

1594885398.png!small

另外还有一种很违规的系统权限:GRANT ANY OBJECT PRIVILEGE、GRANT ANY PRIVILEGE、GRANT ANY ROLE
比如GRANT ANY PRIVILEGE,有了这个权限后,你可以授予任何(至少大部分)系统权限给他人,甚至你本身不具备该权限也可以。
嗯,我试了下,还能把自己不具备的权限授予给自己……

 6. 测评项 f

f)访问控制的粒度应达到主体为用户级或进程级,客体为文件、数据库表级;

至少到数据库表级,其实oracle还能到列的级别,这个自己查询下即可,有就是有,没有就是没有。

 7. 测评项g

g)应对重要主体和客体设置安全标记,并控制主体对有安全标记信息资源的访问。

初级教材上提到了Oracle_Label_Security,这里就不对起做出说明了,因为基本没有哪家测评机构会用这个插件。
碰到这个测评项,99%就是不符合的,如果真有使用该插件的,现场查资料也来得及的。
Oracle_Label_Security说明

 8. 总结

我说到的oracle权限方面的查询肯定不全,大家有想详细了解的可以去看一看oracle的官方文档,其实说得还是很好的:
https://docs.oracle.com/cd/E11882_01/network.112/e36292/guidelines.htm#DBSEG10004

 

# 等级保护2.0 # 等级保护测评 # 等级保护实施
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者