1.49k likes | 1.64k Views
第 5 章 数据库安全保护. 本章要点 随着社会信息化的不断深化,各种数据库的使用也越来越广泛。例如,一个企业管理信息系统的全部数据、国家机构的事务管理信息、国防情报机密信息、基于 WEB 动态发布的网上购物信息等等,它们都集中或分布地存放在大大小小的数据库中。我们知道数据库系统中的数据是由 DBMS 统一进行管理和控制的。为了适应和满足数据共享的环境和要求, DBMS 要保证数据库及整个系统的正常运转,防止数据意外丢失和不一致数据的产生,以及当数据库遭受破坏后能迅速地恢复正常,这就是数据库的安全保护。. 本章要点
E N D
第5章 数据库安全保护 本章要点 随着社会信息化的不断深化,各种数据库的使用也越来越广泛。例如,一个企业管理信息系统的全部数据、国家机构的事务管理信息、国防情报机密信息、基于WEB动态发布的网上购物信息等等,它们都集中或分布地存放在大大小小的数据库中。我们知道数据库系统中的数据是由DBMS统一进行管理和控制的。为了适应和满足数据共享的环境和要求,DBMS要保证数据库及整个系统的正常运转,防止数据意外丢失和不一致数据的产生,以及当数据库遭受破坏后能迅速地恢复正常,这就是数据库的安全保护。
本章要点 DBMS对数据库的安全保护功能是通过四方面来实现的,即安全性控制、完整性控制、并发性控制和数据库恢复。本章就将从这四方面来介绍数据库的安全保护功能,重点要求读者掌握它们的含义及实现这些安全保护功能的方法,可结合SQL Server 2000加深四部分内容的理解与操作技能。
5.1 数据库安全性 5.1.1. 数据库安全性概述 5.1.2.安全性控制的一般方法 5.1.3.安全性控制的其它方法 5.1.4.SQL Server 2000安全性概述 返回本章首页
5.1.1 数据库安全性概述 数据库的安全性是指保护数据库,以防止非法使用所造成数据的泄露、更改或破坏。 安全性问题有许多方面,其中包括: (1)法律、社会和伦理方面,例如请求查询信息的人是不有合法的权力; (2)物理控制方面,例如计算机机房或终端是否应该加锁或用其他方法加以保护; (3)政策方面,确定存取原则,允许哪些用户存取哪些数据; (4)运行与技术方面,使用口令时,如何使口令保持秘密; BACK
(5)硬件控制方面,CPU是否提供任何安全性方面的功能,诸如存储保护键或特权工作方式;(5)硬件控制方面,CPU是否提供任何安全性方面的功能,诸如存储保护键或特权工作方式; (6)操作系统安全性方面,在主存储器和数据文件用过以后,操作系统是否把它们的内容清除掉; (7)数据库系统本身安全性方面。 BACK
5.1.2 安全性控制的一般方法 安全性控制是指要尽可能地杜绝所有可能的数据库非 法访问。 用户非法使用数据库可以有很多种情况。例如,编写合法的程序绕过DBMS授权机制,通过操作系统直接存取、修改或备份有关数据。用户访问非法数据,无论它们是有意的还是无意的,都应该加以严格控制,因此,系统还要考虑数据信息的流动问题并加以控制,否则有潜在的危险性。因为数据的流动可能使无权访问的用户获得访问权利。 BACK
例如,甲用户可以访问表T1,但无权访问表T2,如果乙用户把表T2的所有记录添加到表T1中之后,则由于乙用户的操作,使甲用户获得了对表T2中记录的访问。此外,用户可以多次利用允许的访问结果,经过逻辑推理得到他无权访问的数据。例如,甲用户可以访问表T1,但无权访问表T2,如果乙用户把表T2的所有记录添加到表T1中之后,则由于乙用户的操作,使甲用户获得了对表T2中记录的访问。此外,用户可以多次利用允许的访问结果,经过逻辑推理得到他无权访问的数据。 为防止这一点,访问的许可权还要结合过去访问的情况而定。可见安全性的实施是要花费一定代价,并需缜密考虑的。安全保护策略就是要以最小的代价来最大程度防止对数据的非法访问,通常需要层层设置安全措施。 实际上,数据库系统的安全性问题,类似于整个计算机系统一级级层层设置安全的情况,其安全控制模型一般如图5.1所示。 BACK
根据图5.1的安全模型,当用户进入计算机系统时,系统首先根据输入的用户标识进行身份的鉴定,只有合法的用户才准许进入系统。根据图5.1的安全模型,当用户进入计算机系统时,系统首先根据输入的用户标识进行身份的鉴定,只有合法的用户才准许进入系统。 对已进入系统的用户,DBMS还要进行存取控制,只允许用户进行合法的操作 BACK
DBMS是建立在操作系统之上的,安全的操作系统是数据库安全的前提。操作系统应能保证数据库中的数据必须由DBMS访问,而不允许用户越过DBMS,直接通过操作系统或其它方式访问。 数据最后可以通过密码的形式存储到数据库中。能做到非法者即使得到了加密数据,也无法识别它的安全效果。 下面,本书就数据库有关的用户标识和鉴定、存取控制、定义视图、数据加密和审计等几类安全性措施作一讨论。 BACK
1、用户标识和鉴别 用户标识和鉴定是系统提供的最外层的安全保护措施,其方法是由系统提供一定的方式让用户标识自己的名字或身份,系统内部记录着所有合法用户的标识,每次用户要求进入系统时,由系统进行核实,通过鉴定后才提供机器的使用权。 用户标识和鉴定的方法有 : (1)单用户名鉴别法:用一个用户名或用户标识符来标 明用户的身份,系统以此来鉴别用户的合法性 . BACK
(2)用户名与口令联合鉴别法:用户标识符是用户公开的标识,它不足以成为鉴别用户身份的凭证。 (3)透明公式鉴别法:每个用户都预先约定好一个过程或者函数,鉴别用户身份时,系统提供一个随机数,用户根据自己预先约定的计算过程或者函数进行计算,系统根据计算结果辨别用户身份的合法性。 BACK
2、用户存取权限控制 用户存取权限指的是不同的用户对于不同的数据对象允许执行的操作权限。 存取权限由两个要素组成,数据对象和操作类型。定义一个用户的存取权限就是要定义这个用户可以在哪些数据对象上进行哪些类型的操作。 在数据库系统中,定义用户存取权限称为授权. 授权有两种: (1)系统权限:由DBA授予某些数据库用户,只有得到系统权限,才能成为数据库用户 . BACK
(2)对象权限:可以由DBA授予,也可以由数据对象的创建者授予,使数据库用户具有对某些数据对象进行某些操作的权限. 这些授权定义经过编译后以一张授权表的形式存放在数据字典中。授权表主要有三个属性,用户标识、数据对象和操作类型。 BACK
3、视图机制 为不同的用户定义不同的视图,可以限制各个用户的访问范围。通过视图机制把要保密的数据对无权存取这些数据的用户隐藏起来,从而自动地对数据提供一定程度的安全保护。 4、数据加密 数据加密是防止数据库中数据在存储和传输中失密的有效手段.加密的基本思想是根据一定的算法将原始数据加密成为不可直接识别的格式,数据以密码的形式存储和传输 . BACK
加密方法有两种: (1)替换方法:该方法使用密钥将明文中的每一个字符转换为密文中的一个字符. (2)转换方法:该方法将明文中的字符按不同的顺序重新排列. 用密码存储数据,在存入时需加密,在查询时需解密,这个过程会占用较多的系统资源,降低了数据库的性能。 5、审计 实际上任何系统的安全性措施都不是绝对可靠的,窃密者总有办法打破这些控制.审计功能是一种监视措施,跟踪记录有关数据的访问活动. BACK
5.1.3 安全性控制的其它方法 1、强制存取控制(MAC) 有些数据库系统的数据要求很高的保密性,通常具有静态的严格的分层结构,强制存取控制能实现这种高保密性要求.这种方法的基本思想在于每个数据对象(文件、记录记录或宇段等)赋予一定的密级,级别从高到低有:绝密级、机密级、秘密级和公用级.每个用户也具有相应的级别,称为许可证级别. 在系统运行时,采用如下两条简单规则: (1)用户U只能查看比它级别低或同级的数据. (2)用户U只能修改和它同级的数据. 强制存取控制是一种独立于值的控制方法.它的优点是系统能执行“信息流控制”. BACK
2、统计数据库的安全性 查询仅仅是某些记录的统计值,例如求记录数、和、平均值等。在统计数据库中,虽然不允许用户查询单个记录的信息,但是用户可以通过处理足够多的汇总信息来分析出单个记录的信息. 在统计数据库中,对查询应作下列限制: ①一个查询查到的记录个数至少是n; ②两个查询查到的记录的“交”数目至多是m. 保证数据库安全性的另一个方法是“数据污染”,也就是在回答查询时,提供一些偏离正确值的数据,以免数据泄露. BACK
5.1.4 SQL Server 2000安全性概述 SQL Server 2000安全系统的构架建立在用户和用户组的基础上 .SQL Server提供了3种安全管理模式,即标准模式、集成模式和混合模式,数据库设计者和数据库管理员可以根据实际情况进行选择 . 1、两个安全性阶段:身份验证和授权 . 2、用户权限:登录创建在Windows中, 而非 SQL Server中. BACK
当用户连接到SQL Server 2000实例后,他们可以执行的活动由授予以下帐户的权限确定: (1)用户的安全帐户; (2)用户的安全帐户所属Windows组或角色层次结; (3)用户若要进行任何涉及更改数据库定义或访问数据的活动,则必须有相应的权限. BACK
3、视图安全机制 SQL Server 2000通过限制可由用户使用的数据,可以将视图作为安全机制。用户可以访问某些数据,进行查询和修改,但是表或数据库的其余部分是不可见的,也不能进行访问。 4、加密方法 SQL Server 2000支持加密或可以加密的内容为: ①SQL Server 中存储的登录和应用程序角色密码; ②作为网络数据包而在客户端和服务器端之间发送的数据; ③SQL Server 2000中如下对象的定义内容:存储过程、用户定义函数、视图、触发器、默认值、规则等。 BACK
5、审核活动 SQL Server 2000提供审核功能,用以跟踪和记录每个 SQL Server 实例上已发生的活动(如成功和失败的记录)。SQL Server 2000 还提供管理审核记录的接口,即 SQL 事件探查器。只有 sysadmin 固定安全角色的成员才能启用或修改审核,而且审核的每次修改都是可审核的事件。 BACK
5.2 数据库完整性 5.2.1.数据库完整性概述 5.2.2.完整性规则的组成 5.2.3.完整性约束条件的分类 5.2.4.SQL Server 2000完整性概述 返回本章首页
5.2.1 数据库完整性概述 数据库的完整性是指保护数据库中数据的正确性、有效性和相容性,防止错误的数据进入数据库造成无效操作。 显然,维护数据库的完整性非常重要,数据库中的数据是否具备完整性关系到数据能否真实地反映现实世界。 数据库的完整性和安全性是数据库保护的两个不同的方面 安全性是保护数据库,以防止非法使用所造成数据的泄露、更改或破坏,安全性措施的防范对象是非法用户和非法操作;完整性是防止合法用户使用数据库时向数据库中加入不符合语义的数据,完整性措施的防范对象是不合语义的数据。 BACK
5.2.2 完整性规则的组成 完整性规则主要由以下三部分构成: (1)触发条件:规定系统什么时候使用规则检查数据; (2)约束条件:规定系统检查用户发出的操作请求违背了什么样的完整性约束条件; (3)违约响应:规定系统如果发现用户的操作请求违背了完整性约束条件,应该采取一定的动作来保证数据的完整性,即违约时要做的事情。 完整性规则从执行时间上可分为立即执行约束(Immediate Constraints)和延迟执行约束(Deferred Constraints)。 立即执行约束是指在执行用户事务过程中,某一条语句执行完成后,系统立即对此数据进行完整性约束条件检查;延迟执行约束是指在整个事务执行结束后,再对约束条件进行完整性检查,结果正确后才能提交。 BACK
一条完整性规则可以用一个五元组(D,O,A,C,P)来形式化地表示。其中:一条完整性规则可以用一个五元组(D,O,A,C,P)来形式化地表示。其中: D(data):代表约束作用的数据对象; O(operation):代表触发完整性检查的数据库操作, 即当用户发出什么操作请求时需要检查该完整性规则; A(assertion):代表数据对象必须满足的语义约束,这 是规则的主体; C(condition):代表选择A作用的数据对象值的谓词; P(procedure):代表违反完整性规则时触发执行的操作 过程。 BACK
例如,对于“学号不能为空”的这条完整性约束,例如,对于“学号不能为空”的这条完整性约束, D:代表约束作用的数据对象为SNO属性; O(operation):当用户插入或修改数据时需要检查该完整性规则; A(assertion):SNO不能为空; C(condition):A可作用于所有记录的SNO属性; P(procedure):拒绝执行用户请求。 BACK
5.2.3 完整性约束条件的分类 • 在数据库领域中,有四种最常用的数据模型,它们是:被称为非关系模型的层次模型、网状模型、关系模型和面向对象模型。本章简要介绍层次模型、网状模型、关系模型。 • 层次模型是数据库系统中最早出现的数据模型,它用树形结构表示各类实体以及实体间的联系。层次模型数据库系统的典型代表是IBM公司的IMS(Information Management Systems)数据库管理系统,这是一个曾经广泛使用的数据库管理系统。现实世界中有一些的实体之间的联系本来就呈现出一种很自然的层次关系,如家庭关系,行政关系。 BACK
1、值的约束和结构的约束 从约束条件使用的对象来分,可把约束分为值的约束和结构的约束。 • 值的约束:即对数据类型、数据格式、取值范围等进行规定。 (1)对数据类型的约束,包括数据的类型、长度、单位和精度等。例如,规定学生性别的数据类型应为字符型,长度为2。 (2)对数据格式的约束。例如,规定出生日期的数据格式为YYYY.MM.DD。 (3)对取值范围的约束。例如,月份的取值范围为1~12,日期1~31。 BACK
(4)对空值的约束。空值表示未定义或未知的值,它与零值和空格不同。有的列值允许空值,有的则不允许。例如,学号和课程号不可以为空值,但成绩可以为空值。(4)对空值的约束。空值表示未定义或未知的值,它与零值和空格不同。有的列值允许空值,有的则不允许。例如,学号和课程号不可以为空值,但成绩可以为空值。 • 结构约束:即对数据之间联系的约束。 数据库中同一关系的不同属性之间,应满足一定的约束条件,同时,不同关系的属性之间也有联系,也应满足一定的约束条件。 BACK
常见的结构约束有如下四种: (1)函数依赖约束:说明了同一关系中不同属性之间应满足的约束条件。如:2NF,3NF,BCNF这些不同的范式应满足不同的约束条件。大部分函数依赖约束都是隐含在关系模式结构中的,特别是对于规范化程度较高的关系模式,都是由模式来保持函数依赖的。 (2)实体完整性约束:说明了关系主键(或主码)的属性列必须唯一,其值不能为全空或部分为空。 (3)参照完整性约束:说明了不同关系的属性之间的约束条件,即外部键(外码)的值应能够在被参照关系的主键值中找到或取空值。 BACK
(4)用户自定义完整性:从实际应用系统出发,按需定(4)用户自定义完整性:从实际应用系统出发,按需定 义属性之间要满足的约束条件。 (5)统计约束,规定某个属性值与关系多个元组的统计值之间必须满足某种约束条件。例如,规定系主任的奖金不得高于该系的平均奖金的50%,不得低于该系的平均奖金的15%。这里该系平均奖金的值就是一个统计计算值。 其中,实体完整性约束和参照完整性约束是关系模型的两个极其重要的约束,被称为关系的两个不变性。而统计约束实现起来开销很大。 BACK
2、静态约束和动态约束 完整性约束从约束对象的状态可分为静态约束和动态约束。 • 静态约束 静态约束是指在数据库每一个确定状态时的数据对象所应满足的约束条件,它是反映数据库状态合理性的约束,这是最重要的一类完整性约束。上面介绍的值的约束和结构的约束均属于静态约束。 • 动态约束 动态约束是指数据库从一种状态转变为另一种状态时(数据库数据变动前后),新、旧值之间所应满足的约束条件,它是反映数据库状态变迁的约束。 例如,学生年龄在更改时只能增长,职工工资在调整时不得低于其原来的工资。 BACK
5.2.4 SQL Server 2000完整性概述 SQL Server 2000中数据完整性可分为四种类型:实体完整性、域完整性、引用完整性、用户定义完整性。另外,触发器、存储过程等也能以一定方式控制数据完整性。 1、实体完整性 实体完整性将行定义为特定表的唯一实体。SQL Server 2000支持如下实体完整性相关的约束: (1) PRIMARY KEY约束:在一个表中不能有两行包含相同的主键值,不能在主键内的任何列中输入NULL值。 (2) UNIQUE 约束:UNIQUE 约束在列集内强制执行值的唯一性,对于UNIQUE约束中的列,表中不允许有两行包含相同的非空值。 BACK
(3) IDENTITY属性:IDENTITY属性能自动产生唯一标识值,指定为IDENTITY的列一般作为主键。 2、域完整性:是指给定列的输入正确性与有效性。SQL Server 2000中强制域有效性的方法有:限制类型,如通过数据类型、用户自定义数据类型等实现;格式限制,如通过CHECK约束和规则等实现;列值的范围限定,如通过PRIMARY KEY 约束、UNIQUE 约束、FOREIGN KEY 约束、CHECK约束、DEFAULT定义、NOT NULL定义等实现。 BACK
3、引用完整性(即参照完整性) SQL Server 2000引用完整性主要由FOREIGN KEY约束体现,它标识表之间的关系,一个表的外键指向另一个表的候选键或唯一键。 强制引用完整性时,SQL Server禁止用户进行下列操作: (1)当主表中没有关联的记录时,将记录添加到相关表中。 (2)更改主表中的值并导致相关表中的记录孤立。 BACK
(3)从主表中删除记录,但仍存在与该记录匹配的相关记录。(3)从主表中删除记录,但仍存在与该记录匹配的相关记录。 在DELETE或UPDATE所产生的所有级联引用操作的诸表中,每个表只能出现一次。多个级联操作中只要有一个表因完整性原因操作失败,整个操纵将失败而回滚。 4、用户定义完整性 SQL Server 2000用户定义完整性主要由Check约束所定义的列级或表级约束体现,用户定义完整性还能由规则、触发器、客户端或服务器端应用程序灵活定义。 BACK
5、触发器 SQL Server2000触发器是一类特殊的存储过程,被定义为在对表或视图发出UPDATE、INSERT 或 DELETE语句时自动执行。触发器可以扩展SQL Server约束、默认值和规则的完整性检查逻辑,一个表可以有多个触发器。 6、其它机制 SQL Server2000支持存储过程中制定约束规则,SQL Server2000的并发控制机制能保障多用户存取数据时的完整性。 BACK
触发器的创建与使用 CREATE TRIGGER语句的语法格式如下: CREATE TRIGGER触发器名 ON表名|视图名 FORINSERT , UPDATE , DELETE AS sql语句
创建UPDATE触发器up_grade,当studentsdb数据库的grade表中课程编号列数据被修改时,显示提示信息“用户修改课程编号列”。创建UPDATE触发器up_grade,当studentsdb数据库的grade表中课程编号列数据被修改时,显示提示信息“用户修改课程编号列”。 TRIGGER CREATEup_grade ON grade FOR AS IF UPDATE( 课程编号 ) BEGIN PRINT '用户修改课程编号列' END GO UPDATE grade SET 课程编号='0005' WHERE学号='0005' UPDATE
Deleted表和Inserted表 在触发器的执行过程中,SQL Server建立和管理两个临时的虚拟表:Deleted表和Inserted表。这两个表包含了在激发触发器的操作中插入或删除的所有记录。在执行INSERT或UPDATE语句之后所有被添加或被更新的记录都会存储在Inserted表中。 在执行DELETE或UPDATE语句时,从触发程序表中被删除的行会发送到Deleted表。 对于更新操作,SQL Server先将要进行修改的记录存储到Deleted表中,然后再将修改后的数据复制到Inserted表以及触发程序表。
建立DELETE触发器del_st_g,当studentsdb数据库的student_info表中的记录被删除时,grade表中的所有相应记录能自动删除。建立DELETE触发器del_st_g,当studentsdb数据库的student_info表中的记录被删除时,grade表中的所有相应记录能自动删除。 CREATE TRIGGER del_st_g ON student_info FOR DELETE AS BEGIN DELETE FROM grade WHERE学号 IN(SELECT 学号 fromdeleted) END GO DELETE FROM student_info WHERE学号='0005'
在curriculum表中建立UPDATE触发器tr_up,如果更新curriculum表中的课程编号,则相应更新grade表的课程编号。进行UPDATE操作,将curriculum表中值为“0001”的课程编号值修改为“0012”,查看相应的grade表的记录值是否改变。在curriculum表中建立UPDATE触发器tr_up,如果更新curriculum表中的课程编号,则相应更新grade表的课程编号。进行UPDATE操作,将curriculum表中值为“0001”的课程编号值修改为“0012”,查看相应的grade表的记录值是否改变。 CREATE TRIGGER tr_up ON curriculum FOR UPDATE AS UPDATE grade SET 课程编号= (SELECT 课程编号FROM inserted) WHERE 课程编号=(SELECT 课程编号FROM deleted) GO UPDATE curriculum SET 课程编号='0012' WHERE 课程编号='0001'
存储过程的创建与使用 CREATE PROCEDURE procedure_name ASsql_statement [,...n]
【例】创建一存储过程,要求该存储过程返回学生姓名、所学课程和成绩。【例】创建一存储过程,要求该存储过程返回学生姓名、所学课程和成绩。 CREATE PROCEDURE spStuCouTea_name AS SELECT姓名,课名,成绩 FROM学生 xs INNER JOIN选课 xk ON xs.学号 = xk.学号 INNER JOIN课程 kc ON xk.课号 = kc.课号 如要执行该存储过程,可在查询分析器中执行如下语句: • EXECspStuCouTea_name
存储过程参数与状态值 存储过程和调用者之间通过参数交换数据,可以按输入的参数执行,也可由参数输出执行结果。调用者通过存储过程返回的状态值对存储过程进行管理。 1. 参数 存储过程的参数在创建过程时声明。 SQL Server支持两类参数:输入参数和输出参数。
(1)输入参数 • 输入参数允许调用程序为存储过程传送数据值。要定义存储过程的输入参数,必须在CREATE PROCEDURE语句中声明一个或多个变量及类型。
【例】建立一个存储过程,根据所给学生的姓名查询该学生的信息。【例】建立一个存储过程,根据所给学生的姓名查询该学生的信息。 CREATE PROC xs_proc @xm varchar(8) AS SELECT * from student_info WHERE姓名 = @xm GO EXEC xs_proc ‘李明'
创建和执行带参数的存储过程proc_list,查询studentsdb数据库的grade表中输入课程编号的成绩排名前3位的学生的成绩信息。创建和执行带参数的存储过程proc_list,查询studentsdb数据库的grade表中输入课程编号的成绩排名前3位的学生的成绩信息。 执行该存储过程,查询课程编号为’0001’的成绩排名前3位学生。 CREATE PROCEDURE proc_list @kcbh char(4) AS SELECT TOP 3 学号,分数 FROM grade WHERE 课程编号=@kcbh ORDER BY分数 DESC GO EXEC proc_list '0001'
(2)输出参数 • 输出参数允许存储过程将数据值或游标变量传回调用程序。 • OUTPUT关键字用以指出能返回到调用它的批处理或过程中的参数。为了使用输出参数,在CREATE PROCEDURE和EXECUTE语句中都必须使用OUTPUT关键字。
【例】创建一个实现加法计算并将运算结果作为输出参数的存储过程。【例】创建一个实现加法计算并将运算结果作为输出参数的存储过程。 CREATE PROCEDURE spAdd @Value1 INT, @Value2 INT, @ResultValue INTOUTPUT AS SELECT @ResultValue = @Value1 + @Value2 GO DECLARE @result int EXEC spAdd 100,20,@result OUTPUT SELECT @result