Oracle自主访问控制机制系统表研究

日期: 2011-03-15 作者:nocode 来源:TechTarget中国 英文

  访问控制是允许或者禁止某人访问某资源的过程,数据库中就是限制用户对数据库客体(如表、试图等)的访问。实现这种访问控制一般是基于访问控制列表(ACL),ACL一般记录了who能访问what以及how访问。大多数据库的将ACL以数据库系统表的形式进行实现。下面具体介绍下ORACLE中的权限相关系统表的设计。

  ORACLE中的权限分为两种:系统权限和对象权限。

  系统权限

  系统权限包括数据库管理权限和带有ANY的权限。管理权限如ALTER DATABASE,CREATE USER等权限,这类权限是和DDL相关的权限。另一类带有ANY的权限,如SELECT ANY TABLE,表示可以查询所有表的权限,这类权限是全局DML相关的权限。查看所有的系统权限可以通过表SYSTEM_PRIVILEGE_MAP,该视图显示了权限名称及其对应的值,通过表可以看出所有的系统权限的权限值均为负数。

  记录用户的系统权限授权的信息主要存储在系统表SYS.SYSAUTH$表中,可以通过DBMA_METADATA包获取表的创建信息。

1SQL> select dbms_metadata.get_ddl(‘TABLE’,’SYSAUTH$’,’SYS’) from dual;
 2DBMS_METADATA.GET_DDL(‘TABLE’,’SYSAUTH$’,’SYS’)
 3————————————————————————
 4  CREATE TABLE “SYS”.”SYSAUTH$”
 5   (    “GRANTEE#” NUMBER NOT NULL ENABLE,
 6        “PRIVILEGE#” NUMBER NOT NULL ENABLE,
 7        “SEQUENCE#” NUMBER NOT NULL ENABLE,
 8        “OPTION$” NUMBER
 9   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
10  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
11  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
12  TABLESPACE “SYSTEM”

  可以看到表字段信息,包含GRANTEE#,PRIVILEGE#,SEQUENCE#和OPTION$。GRANTEE#表示被授权者的UID,PRIVILEGE#表示被授权的权限值,OPTION$表示是此权限否可被转授,SEQUENCE#个人感觉是时间戳的概念,对于这个的验证放在后面。由此可见,系统权限和角色的授予,并不记录授权者的信息。通过查询这张表,可以看到PRIVILEGE#字段并不是上面所说的全是负数,还存在正数,不错,这是因为这张表不仅仅存放了系统权限,还存放了角色的授予信息,如果授予角色的时候,PRIVILEGE#字段即为角色的ID,当然角色也可能被授予角色和系统权限,因此想通过简单的SQL语句获取一个用户所拥有的所有的角色或所有的系统权限,会涉及到递归的查询,大家可以想下如何构造这个SQL语句,(提示下:ORACLE特有的CONNECT BY语法)。

  由系统权限的系统表可以看出,对于系统权限,ORACLE中并不记录授权者的概念,这说明对系统权限的回收肯定是特定用户进行的,由于没有授权者的概念,当然也就没有了级联回收系统权限的情况,这里SEQUENCE#字段作为时间戳貌似也没有太大的意义了。

  对象权限

  对象权限主要记录用户被赋予某对象的某种权限,如用户A被授予表TB1的SELECT权限。由此可见,对象权限系统表需要具有如下几个字段:授权者,被授予者,对象,权限类型,转授标记。对象权限系统表是SYS.OBJAUTH$,首先来看表定义。  

1SQL> select dbms_metadata.get_ddl(‘TABLE’,’OBJAUTH$’,’SYS’) from dual;
 2
 3DBMS_METADATA.GET_DDL(‘TABLE’,’OBJAUTH$’,’SYS’)
 4———————————————————————-
 5  CREATE TABLE “SYS”.”OBJAUTH$”
 6   (    “OBJ#” NUMBER NOT NULL ENABLE,
 7        “GRANTOR#” NUMBER NOT NULL ENABLE,
 8        “GRANTEE#” NUMBER NOT NULL ENABLE,
 9        “PRIVILEGE#” NUMBER NOT NULL ENABLE,
10        “SEQUENCE#” NUMBER NOT NULL ENABLE,
11        “PARENT” ROWID,
12        “OPTION$” NUMBER,
13        “COL#” NUMBER
14   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

  系统表中存在并不是所猜想的那么几个字段,除了对象(OBJ#),授权者(GRANTOR#),被授予者(GRANTEE#),具体权限(PRIVELGE#),转授标志(OPTION$)外,还具有SEQUENCE#,PARENT和COL#,SEQUENCE#应该还是时间戳,COL#是指在进行列级授权时记录的列号,在对表进行授权时,可以指定列,如GRANT SELECT(C1) ON T1 TO U1。至于PARENT还有待考证啊

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

nocode
nocode

相关推荐