分类: Oracle
2008-05-05 15:51:59
来源:赛迪网 作者:Role |
(3)列级安全性
Oracle列级安全性可以由视图实现,也可以直接在基本表上定义。
用视图定义表的垂直子集就可以实现列级安全性,方法与上面类似。
直接在基本表上定义和回收列级权限也是使用GRANT和REVOKE语句。目前Oracle的列级权限只有UPDATE,回收列级UPDATE权限时,Oracle不允许一列一列地回收,只能回收整个表的UPDATE权限。例如,
GRANT UPDATE(Sno,Cno)ON SC TO U2;
把对SC表中Sno列和Cno列的UPDATE权限授予U2用户。
REVOKE UPDATE ON SC FROM U2;
回收了U2用户对SC表中Sno列和Cno列的UPDATE权限。
在Oracle中,表、行、列三级对象自上而下构成一个层次结构,其中上一级对象的权限制约下一级对象的权限。例如当一个用户拥有了对某个表的UPDATE权限,即相当于在表的所有列都拥有了UPDATE权限。
Oracle对数据库对象的权限采用分散控制方式,允许具有WITH GRANT OPTION的用户把相应权限或其子集传递授予其他用户,但不允许循环授权,即被授权者不能把权限再授回给授权者或其祖先。
Oracle把所有权限信息记录在数据字典中,当用户进行数据库操作时,Oracle首先根据数据字典中的权限信息,检查操作的合法性。在Oracle中,安全性检查是任何数据库操作的第一步。
三、Oracle的审计技术
在Oracle中,审计分为用户级审计和系统级审计。用户级审计是任何Oracle用户可设置的审计,主要是用户针对自己创建的数据库表或视图进行审计,记录所有用户对这些表或视图的一切成功和(或)不成功的访问要求以及各种类型的SQL操作。
系统级审计只能由DBA设置,用以监测成功或失败的登录要求、监测GRANT和REVOKE操作以及其他数据库级权限下的操作。
Oracle的审计功能很灵活,是否使用审计,对哪些表进行审计,对哪些操作进行审计等都可以由用户选择。为此,Oracle提供了AUDIT语句设置审计功能,NOAUDIT语句取消审计功能。设置审计时,可以详细指定对哪些SQL操作进行审计。例如,
对修改SC表结构或数据的操作进行审计可使用如下语句:
AUDIE ALTER,UPDATE ON SC;
取消对SC表的一切审计可使用如下语句:
NOAUDIT ALL ON SC;
在Oracle中,审计设置以及审计内容均存放在数据字典中。其中审计设置记录在数据字典表SYS.TABLES中,审计内容记录在数据字典表SYS.AUDIT_TRAIL中。
四、用户定义的安全性措施
除了系统级的安全性措施外,Oracle还允许用户用数据库触发器定义特殊的更复杂的用户级安全措施。例如,规定只能在工作时间内更新Student表,可以定义如下触发器,其中sysdate为系统当前时间: CREATE OR REPLACE TRIGGER secure_student
BEFORE INSERT OR UPDATE OR DELETE
ON student
BEGIN
IF (TO_CHAR (SYSDATE, 'DY') IN ('SAT', 'SUN'))
OR (TO_NUMBER (SYSDATE, 'HH24') NOT BETWEEN 8 AND 17)
THEN
raise_application_error
(-20506,
'You may only change data during normal business hours.'
);
END IF;
END;
触发器一经定义便存放在数据字典中。用户每次对Student表执行INSERT,UPDATE或DELETE操作时都会自动触发该触发器,由系统检查当时的系统时间,如果是周六或周日,或者不是8点至17点,系统会拒绝执行用户的更新操作,并提示出错信息。
类似的,用户还可以利用触发器进一步细化审计规则,使审计操作的粒度更细。
综上所述,Oracle提供了多种安全性措施,提供了多级安全性检查,其安全性机制与操作系统的安全机制彼此独立,数据字典在Oracle的安全性授权和检查以及审计技术中起着重要作用。 |