|
oracle的安全措施主要有三个方面,一是用户标识和鉴定;二是授权和检查机制;三是审计技术(是否使用审计技术可由用户灵活选择);除此之外,oracle还允许用户通过触发器灵活定义自己的安全性措施。
一、用户标识和鉴定
在oracle中,最外层的安全性措施是让用户标识自己的名字,然后由系统进行核实。oracle允许用户重复标识三次,如果三次未通过,系统自动退出。
二、授权与检查机制
oracle的权限包括系统权限和数据库对象的权限两类,采用非集中的授权机制,即dba负责授予与回收系统权限,每个用户授予与回收自己创建的数据库对象的权限。
oracle允许重复授权,即可将某一权限多次授予同一用户,系统不会出错。oracle也允许无效回收,即用户没有某种权限,但回收此权限的操作仍算成功。
1. 系统权限
oracle提供了80多种系统权限,如创建会话、创建表、创建视图、创建用户等。dba在创建一个用户时需要将其中的一些权限授予该用户。
oracle支持角色的概念。所谓角色就是一组系统权限的集合,目的在于简化权限管理。oracle除允许dba定义角色外,还提供了预定义的角色,如connect,resource和dba。
具有connect角色的用户可以登录数据库,执行数据查询和操纵。即可以执行alter table,create view,create index,drop table,drop view,drop index,grant,revoke,insert,select,update,delete,audit,noaudit等操作。
resource角色可以创建表,即执行create table操作。创建表的用户将拥有对该表的所有权限。
dba角色可以执行某些授权命令,创建表,对任何表的数据进行操纵。它涵盖了前两种角色,此外还可以执行一些管理操作,dba角色拥有最高级别的权限。
例如dba建立一用户u1后,欲将alter table,create view,create index,drop table,drop view,drop index,grant,revoke,insert,select,update,delete,audit,noaudit等系统权限授予u1,则可以只简单地将connect角色授予u1即可:
grant connect to u1;
这样就可以省略十几条grant语句。
2. 数据库对象的权限
在oracle中,可以授权的数据库对象包括基本表、视图、序列、同义词、存储过程、函数等,其中最重要的是基本表。
对于基本表oracle支持三个级别的安全性:表级、行级和列级。
(1)表级安全性
表的创建者或者dba可以把表级权限授予其他用户,表级权限包括:
alter:修改表定义
delete:删除表记录
index:在表上建索引
insert:向表中插入数据记录
select:查找表中记录
update:修改表中的数据
all:上述所有权限
表级授权使用grant和revoke语句。
(2)行级安全性
oracle行级安全性由视图实现。用视图定义表的水平子集,限定用户在视图上的操作,就为表的行级提供了保护。视图上的授权与回收与表级完全相同。
例如,只允许用户u2查看student表中信息系学生的数据,则首先创建信息系学生的视图s_is,然后将该视图的select权限授予u2用户。
(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的安全性授权和检查以及审计技术中起着重要作用。
|