Oracle用户特权管理与审计

80酷酷网    80kuku.com

  

1 引言

信息对于取得成功是非常重要的,但是如果信息被破坏或被错误利用,就会给成功带来威胁。Oracle提供了广泛的安全特性以保护用户的信息免受未经授权的访问及有意或无意的破坏。这种安全性是在用户到用户,权限到权限的基础上通过授予或撤消权限来提供的,并且是附加于(独立于)用户的计算机系统本身已有的安全机制之上。在实现了权限分配的基础上,我们又面临着实时跟踪被使用的系统资源与数据库资源,监测用户对数据库的行为的问题,这就是大型数据库管理系统所必需的审计功能。在这里,我们将共同探讨Orale用户权限分配以及审计的实现思想与方法。

2 用户管理模式

DBMS:DataBase Management System,数据库管理系统,对数据进行集中统一的管理和操纵。现在主要的DBMS包括:Oracle SQL Server,Sybase Adaptive Server 11,Microsoft SQL Server 6.x,7.x等,在这些DBMS中,都有自己完整的用户管理模式,一般都以下列方式进行:

登录用户:DBO,主要用来提供连接到数据库服务的;

角色用户:将登录用户划分为某些组,这些组拥有各种不同的数据库操作权限,而一个登录用户可以扮演不同的角色;

DBMS提供了这些用户管理的基本方式,并各自对表、视图、过程、触发器等有各自的审计及管理的方法。

在实际的应用中,如果实际情况允许,可以对实际的所有用户建立一个登录用户(帐号),并对所有的帐号进行严密的权限管理。但是,如果用户的数量是不固定的,而且可能有上百个,那管理的复杂程度及难度就可想而知了。

这就是所谓的单用户-多用户模式。它是指数据库的登录用户模式,所有应用都以统一的用户登录,该用户拥有所有表、视图、过程、函数等的所有操作权限,而这些对象都被DBO所创建和拥有,可以将这些用户称为应用用户(存放在某表中);而登录到数据库的这个用户即为模式用户。实际上,为了防止系统外数据登录,可增加一个联接用户,该用户只能读取一张表,该表记录了模式用户的登录参数(具体部分可以加密存放);

这种单-多用户方式在大型的MIS系统中,由于其实现简单,思路清晰,所以应用是相当多的,其优点是明显的:

(1) 设置简单,特别是授权,可以比较轻松地实现;

(2) 管理简单,只要维护一个模式用户就可以了;

(3) 对开发人员是透明的,即开发用户以DBO方式登录就可以了;

3 设计思想

当前比较可行的方法的要点是:

(1) 所有的实体(表、视图等等)都由一个登录用户建立(DBO)、但是该用户不拥有连接及操作这些实体的权限(Insert,Delete,Update等等);

(2) 对所有的实际用户进行分类,归纳为几个具体的角色(实际角色);

(3) 一种实际角色对应一个登录用户,建立帐号系统,进行角色分配、权限设置;

(4) 在Application中,某用户连接时,根据所扮演的实际角色,以对应的登录用户登录;

(5) 根据对应表中对该用户的可用模块(功能),进行适当处理,使用户只在定制的、允许的范围内进行功能操作及数据库操作。

(6)建立审计所需要的表,用于详细记载要跟踪的数据库行为用户的机器属性、所拥有的权限与角色、每一次访问数据库的起始和截止时间、表级访问对象、数据操作方式、数据操作对象及具体的动作、操作前后的记录值等等。

根据以上几点,在一个具体的应用中,涉及到的开发工作包括:

表设计:

(1) 实际角色(组)分析;

(2) 建立应用用户帐户表,该表记录了该用户所属的组,建立用户组表;

(3) 建立一个通用连接用户(只能检索用户帐户表),所有的应用用户初始都以该用户连接数据库,然后检索根据实际登录的用户及用户所属组,以该组对应的登录用户进行连接;

(4) 建立模块(功能)表,建立用户、用户组与该表的对应表,即某用户到底能够进行什么样的操作。

权限分配功能设计:

(1) 建立模块(功能)管理器,管理所有可用模块的相关信息;

(2) 建立用户,用户组权限管理器,管理某用户(组)能够使用的功能。

用户启动应用录时,将按照以下过程进行:

(1) 所有用户都以固定的连接用户进行初始连接;

(2) 用户输入自己的代码及口令,根据帐户表确认该用户;

(3) 得到该用户所属的组(即可以连接到数据库的登录用户名称)等信息;

(4) 重新连接到数据库,分配角色;

(5) 根据角色,进行动态数据分片;

(6) 检索该用户所属组及该用户可用的模块信息及布置,调整菜单或界面;

(7) 打开主窗口,结束。

审计功能设计:

一个成熟的审计系统,需要解决很多问题,比如确定审计区域、如何记录审计跟踪文件、收集什么样的审计信息、确定多少系统资源和人力资源专门用于审计功能、性能降低多少是最大可承受限度、谁负责监视审计结果、数据库被破坏后应采取什么行为、如何执行数据库毁坏报告、使用什么方法来修复毁坏了的数据、多长时间重新审核一次审计方法等等。我们在这里只是简单谈谈如何确定审计区域以及收集和管理审计信息。

根据审计区域来划分,审计主要分为语句审计、特权审计、模式对象审计和资源审计。

语句审计是指监视一个或者多个特定用户或者所有用户提交的SQL语句;特权审计是指监视一个或者多个特定用户或者所有用户使用的系统特权;模式对象审计是指监视一个模式里在一个或者多个对象上发生的行为;资源审计是指监视分配给每个用户的资源数量。我们这里谈的主要是模式对象审计。

(1) 模式对象审计的整体思想

实现审计功能,可以选用Oracle数据库中Sys模式下的三个审计表做审计支持,分别是AUD$(记录审计信息)、AUDIT$()和AUDIT_ACTIONS(存储审计跟踪行为类型代码的描述),虽然这种Oracle审计可以捕获谁做了更改和什么时候做了更改,但捕获数据更改是非常困难的和费时的。所以我们采用的是人工创建审计信息表,并且通过建立触发器的方式记录数据更改情况。

(2) 根据需要,建立审计模块(功能)管理器(审计信息表),管理所有可用审计模块的相关信息,包括用户ID和用户名、会话标识符、被访问的模式对象名(表、存储过程、索引、触发器等)、被执行或者企图执行的操作、操作的完全代码、时间和日期戳以及使用的系统特权等等。

审计信息表的结构是:

"修改表名" (20),"动作种类" (10),"旧身份号" (18),"旧姓名" (40), "新身份号"(18),"新姓名"(40),"机器名"(20),"用户"(20),"客户信息" (50),"时间"DATE,"修改字段名1"(20),"字段名旧值1"(50),"字段名新值1"(50),"修改字段名2" (20),"字段名旧值2" (50), "字段名新值2" (50),"会话号"NUMBER(*),"序号" NUMBER(*)。

根据实际需要,可以调整赓续字段的数量。

(3) 由具有DBA权限的数据库管理员使用和维护审计程序,并负责维护审计信息及定期归档,以及在数据库遇到灾难时的数据库恢复。

4 具体实现中的几个难点

(1) 由登录用户创建角色用户

图1显示的是由登录用户GBASE创建角色用户GBSJ的界面,在这里还可以控制GBSJ用户对所有数据库表的读写权限,同时可以询问是否将表结构及数据复制到当前用户。


图1

(2) 数据分片技术

首先要说明的是什么是数据分片。在ORACLE的用户权限分配中,只提供对表、函数、同义词、视图、包等的Insert,Update,Select,Delete,Execute等操作,并未提供字段级的权限设置(实际上,对大型数据库进行字段级的权限设置虽然带来了安全性方面的好处,但对于性能的存在一定的影响),因此,对于大型MIS系统,进行数据的分片是在所难免的。

一般地,一个典型的MIS数据库平台设计是这样的,如图2。

图2

对用户权限的分配是通过对ORACLE临时系统表来实现的:

① 在需要分片的表(CUSTOMER)中建立相关字段,如SGRANT_NUM number(20)及所属部门 SUNIT_ID varchar(10),

② 对该表创建动态视图 CUSTOMER_PV

select * from CUSTOMER A where CD_WAREHOUSE.SUNIT_ID is null or exists (select * from CUSTOMER B where A.SUNIT_ID = B.SUNIT_ID

and ( B.SGRANT_NUM >= TO_NUMBER(SUBSTR(USERENV('CLIENT_INFO'), 1, 10))

and ( B.SGRANT_NUM <= TO_NUMBER(SUBSTR(USERENV('CLIENT_INFO'),11,10))))

③ 在用户登录系统时修改用户环境 client_info 中的分片号;

④ 这样,对设计者,不存在分片问题,对最终用户,可定义该用户的组织分片号来约束该用户能够存取的数据。

原理图如图3。

图3

这样进行数据分片的优点是:

① 由服务器自动完成,对设计无任何影响;

② 速度快,对巨量数据无明显影响;

缺点是:

① 只能根据组织(或其他)进行纵向分片,不够灵活;

② 技术实现复杂,主表的更改将直接影响视图(需要重新生成);

③ 一旦组织机构变化,则分片需要重新设置。

(3)审计功能实现的过程中无法捕获行为用户的客户信息和行为动作信息以及动作前后的数据

①捕获客户信息的方法:

经过仔细查阅Oracle数据库文档,终于发现了可以通过调用Oracle本身的USERENV函数实现此项功能。捕获机器名的方法是USERENV('TERMINAL'),捕获登录计算机的用户名的方法是USERENV('CLIENT_INFO'),捕获登录数据库的用户名的方法是直接读出Oracle的user值。

②捕获行为动作的方法:

捕获当前会话标识符的方法是USERENV('SESSIONID')。

③捕获行为动作前后的数据的方法:

在数据库中建触发器,针对行为动作的表,实时地将动作前后的数据插入审计表中。

审计的控制界面见图4:

图4

在这个控制界面下,我们能够实现按机器名、用户和会话监视和管理审计信息,浏览当前活动会话的会话信息,并可通过条件过滤出审计信息,同时完成审计信息归档和打印等功能,而且通过审计信息切换功能,可以浏览已归档审计信息。

目前,这个模式审计功能已经实现,并已经应用在某大型系统中,取得了令人满意的效果。

5 结束语

Oracle用户权限分配与维护以及审计都是很复杂的课题,一段时间内,无论对数据库管理员还是程序设计人员来说,都将是一个很大的挑战。解决好这个问题,是保证大型数据库系统的数据安全性、准确性、方便性、灵活性以及可移植性将为企业信息化建设的基础。由于笔者水平及精力有限,尚不能在此领域有更高的建树,只希望藉此文与大家共同研讨。



分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: