数据库的安全性与完整性_第1页
数据库的安全性与完整性_第2页
数据库的安全性与完整性_第3页
数据库的安全性与完整性_第4页
数据库的安全性与完整性_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章数据库的安全性与完整性

7.1基本概念数据库的安全性:是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。数据库安全性是一个涵盖许多问题的广阔领域。安全性的类型:某些信息的访问关系到法律和伦理的问题。有些信息可能会认为是属于个人信息,未授权人员不能对其进行访问。有关政府、机构或公司层次上的政策问题,这些政策确定哪些信息不应该向公众公开。与系统有关的问题。系统级上应加强哪几类安全功能(如:物理硬件级、OS级、DBMS级)一些组织需要把安全性问题划分为多个安全级别(如:绝密、机密、秘密、公开)。

数据库的完整性:是指数据的正确性、有效性和相容性。7.2数据库安全性控制

在一个多用户数据库系统中,DBMS必须提供相应的技术以保证特定的用户或用户组,只能访问数据库的指定部分,而不能访问数据库的其他部分。典型的DBMS包含一个数据库安全和授权子系统,由它来负责实现一个数据库的安全性功能以避免发生未授权的访问。

DBMS的安全子系统主要包括两部分:

定义用户权限:

并将用户权限登记到数据字典中。

合法权限检查:若用户的操作请求超出了定义的权限,系统将拒绝执行此操作。7.2数据库安全性控制安全措施应该一级一级层层设置。计算机系统的安全模型:用户标识和鉴别DB数据密码存储OS安全保护DBMS存取控制7.2数据库安全性控制数据库安全控制方法一、用户标识与鉴别1.利用用户自身具备的各种自然特征标识自己和提供鉴别的依据。2.利用用户持有的证件。3.利用口令。口令保密可采用的一些方法:(1)扩大口令集和口令长度。(2)规定口令的生效时间,定期或不定期地更换口令。(3)设置多层口令系统。(4)设置动态口令。7.2数据库安全性控制二、存取控制1.存取控制方法(1)自主存取控制(DAC-DiscretionaryAccessControl

)

这种方法是基于授予和收回权限的机制。它已经发展成为关系数据库系统的主要安全机制。这种机制是一种“all-or-nothing”方法,即一个用户要么拥有该特权,要么没有该特权。但是在很多应用中,还需要另外一种安全性策略,这种策略需要在安全性级别的基础上对数据或用户进行分类。

7.2数据库安全性控制(2)强制存取控制(MAC-MandatoryAccessControl)

在强制存取控制(MAC)方法中,每一个数据对象被标以一定的密级,每一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可证的用户才可以存取。强制存取控制因此相对比较严格。

MAC适用于对数据有严格而固定密级分类的部门。主体是指数据库中数据访问者(用户、DBA)、进程、线程等,是系统中的活动实体。客体是指数据库中数据及其载体(表、视图、索引、存储过程等),是系统中的被动实体。7.2数据库安全性控制

对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label)。敏感度标记被分成若干级别,例如绝密、机密、秘密、公开等。主体的敏感度标记称为许可证级别。客体的敏感度标记称为密级。客体子集主体子集访问7.2数据库安全性控制

MAC机制就是通过对比主体的Label和客体的Label,最终确定主体是否能够存取客体。当某一主体以标记label注册入系统时,系统要求他对任何客体的存取必须遵循如下规则:

仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体;

仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体。这两种规则的共同点在于它们均禁止了拥有高许可证级别的主体更新低密级的数据对象,从而防止了敏感数据的泄漏。自主访问控制与强制访问控制的比较

自主访问控制优点:有高度的灵活性,这使得它适用于多个应用领域。缺点:防范恶意攻击的脆弱性。因为一旦被授权用户访问以后,自主授权模型就不能对如何传播和如何使用信息进行任何的控制了。

强制访问控制优点:可以保证更高程度的保护,防止了信息的非法流动。适用于需要高度保护的政府、军事等应用。缺点:过于严格,要求将主体和客体严格地划分到安全级别中,因此仅适用于少数环境。7.2数据库安全性控制2.自主存取控制的实现(1)用户分类和权限

用户:系统用户(DBA)、数据对象属主(owner)、一般用户、公共用户(public)。

权限:包括数据访问权限(读、插入、修改、删除等)和数据库模式修改权限(索引、资源、修改、撤消等)两类。7.2数据库安全性控制(2)授权

GRANT语句向用户授予操作权限。一般格式为:

GRANT{<权限>[,<权限>]…|ALL}ON<对象类型><对象名>TO{<用户>[,<用户>]...|PUBLIC}

[WITHGRANTOPTION]

语义为:将对指定操作对象的指定操作权限授予指定的用户。

ALL:所有权限

PUBLIC:公共用户对不同类型的操作对象有不同的操作权限。

可将此权限转授7.2数据库安全性控制例:把查询表SC和修改其学号的权限授给用户

U2和U4。

GRANTSELECT,

UPDATE(Sno)ONTABLESCTOU2,U4;例:把对表SC的INSERT权限授给用户U5,并允许将此权限再授予其他用户。

GRANTINSERTONTABLESCTOU5WITHGRANTOPTION;

U5还可以将此权限授予U6:

GRANTINSERTONTABLESCTOU6;PUBLIC;全体。U6能不能再传播此权限?7.2数据库安全性控制例:

DBA把在数据库DB1中建立表的权限授予用户U1。

GRANTCREATETABONDATABASEDB1TOU1;U1隐含权限?(3)收回权限格式:REVOKE{<权限>[,<权限>]…|ALL}ON<对象类型><对象名>FROM{<用户>[,<用户>]...|PUBLIC}[CASCADE|RESTRICT];CASCADE:级联(但系统只收回直接或间接从某处获得的权限)

例:P.215图7-47.2数据库安全性控制(4)数据库角色的授权角色:

是权限的集合。数据库角色:是一组对数据库进行各种操作的权限的集合。将某一组用户设置为某一角色,他将拥有该角色中的每一个权限。这样只要对角色进行权限设置便可以实现对所有用户权限的设置,大大减少了管理员的工作量,简化了授权的过程。用户与角色之间存在多对多的联系。创建角色必须具有createrole系统权限。7.2数据库安全性控制创建角色:

CREATEROLE<角色名>将权限授予角色:

GRANT<权限>[,<权限>]…ON<对象类型><对象名>TO<角色>[,<角色>]...将角色授予用户:

GRANT<角色>[,<角色>]…TO<角色>[,<用户>]...[WITHADMINOPTION]可将此权限转授回收角色的权限:

REVOKE<权限>[,<权限>]…ON<对象类型><对象名>FROM<角色>[,<角色>]...7.2数据库安全性控制[例7-7]

CREATEROLEC1;

GRANTSELECT,INSERT

ONTABLEStudentTOC1;

GRANTC1TOU1,U2,U3;

GRANTUPDATE,DELETEONTABLEStudentTOC1;

REVOKEC1FROMU3;REVOKEINSERTONTABLEStudentFROMC1;7.2数据库安全性控制三、视图机制通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动地对数据提供一定程度的安全保护。[例7.8]

创建视图:CREATEVIEWstudent_maleASSELECT*FROMstudentWHEREsex=‘男’授权1:GRANTSELECT,INSERTONVIEW

student_maleTOU1授权2:GRANTALLPRIVILEGESONVIEW

student_maleTOU37.2数据库安全性控制四、数据加密

是在不安全的环境中维护数据安全性的一种方法。加密技术首先使用某个预定的加密密钥对数据应用加密算法,然后结果数据必须要使用解密密钥进行解密,以恢复原来的数据。五、审计

审计是对选定的用户动作的监控和记录,以监测可能的不合法行为。审计常用于:(1)审查可疑的活动。(2)监视和收集关于数据库活动的数据。7.3数据库的完整性控制一、数据库的完整性数据库的完整性:是指数据的正确性、有效性和相容性。说明:完整性是为了防止数据库中存在不符合语义的数据,防止错误信息的输入和输出。

数据库完整性约束条件:加在数据库数据之上的语义约束条件。完整性检查:DBMS中检查数据是否满足完整性条件的机制。

DBMS的完整性控制机制应具有三个方面的功能:(1)定义功能:提供定义完整性约束条件的机制。(2)检查功能:检查用户发出的操作请求是否违背了完整性约束条件。(3)防范功能:如果发现用户的操作请求使数据违背了完整性约束条件,采取一定的动作来保证数据的完整性。

7.3数据库的完整性控制二、SQL中的完整性约束约束分类列级约束:只能应用在一列上。表级约束:可以应用在一个表中的多列上。当约束用于表级时,应按下列形式设置:

CONSTRAINT<约束名>各种约束形式例:CREATETABLEbook(bidint

NOTNULL,--列级约束

bnamechar(8)NOTNULL,--列级约束

authoridchar(10))7.3数据库的完整性控制1、基本表的约束(1)主码约束主码能够惟一地确定表中的每一条记录,主码不能取空值。主码约束可以保证实体的完整性。格式:PRIMARYKEY[(<列名表>)]例:CREATETABLEbook(bidint

PRIMARYKEY,

bnamechar(8)NOTNULL,

authoridchar(10))

7.3数据库的完整性控制例:CREATETABLEsc(

snochar(8),

cnochar(4),gradeint,

CONSTRAINTpk_scprimarykey(sno,cno))7.3数据库的完整性控制(2)外码约束外码约束主要用来维护两个表之间数据的一致性,实现表之间的参照完整性。格式:

FOREIGNKEY[(<列名表>)]REFERENCES<目标表>[(<列名表>)][ONDELETE<参照动作>][ONUPDATE<参照动作>]<参照动作>:NOACTION、CASCADE、RESTRICT、SETNULL、SETDEFAULT7.3数据库的完整性控制例:CREATETABLEauthors(

authorid

intPRIMARYKEY,

authornamechar(20),addresschar(30))CREATETABLEbook(bidintPRIMARYKEY,

bnamechar(8)NOTNULL,

authorid

int,

CONSTRAINTfk_book

FOREIGNKEY(authorid)REFERENCESauthors(authorid))7.3数据库的完整性控制

假定被参照关系称为父表,参照关系称为子表。当删除(DELETE)或修改(UPDATE)父表中的某行时,对子表采取的动作可有下列的选择:

CASCADE(级联):

删除或修改父表中的行并自动删除或修改在子表中匹配的行。

RESTRICT(受限):只有当子表外码中没有与父表要删除或修改的主码相同时,才能删除父表中的行,否则拒绝执行此操作。

SETNULL(置空值):删除或修改父表中的行并将子表中的外码设置为NULL。只有当外码没有被设置成NOTNULL时才有效。

SETDEFAULT(置默认值):删除或修改父表中的行并将子表中的外码设置为指定的默认值。只有外码指定了默认值时才有效。

NOTACTION:拒绝对父表进行删除或修改。7.3数据库的完整性控制(3)惟一约束惟一约束用于指定一个或多个列的组合值具有惟一性,以防止在列中输入重复的值。应用场合:每个表中只能有一个主码,因此当表中已经有一个主码时,如果还要保证其他的标识符惟一时,就可以使用惟一性约束。例:CREATETABLEstudent(

sno

intPRIMARYKEY,

snamechar(8)NOTNULL,sexchar(2),

cardnochar(18)UNIQUE)7.3数据库的完整性控制(4)检查约束检查约束对输入列或者整个表中的值设置检查条件,以限制输入值。格式:CHECK(<条件表达式>)

例:CREATETABLEstudent(

sno

intPRIMARYKEY,

snamechar(8)NOTNULL,sexchar(2),

cardnochar(18)UNIQUE,

CONSTRAINTchk_sexcheck(sexin(‘男’,’女’)))7.3数据库的完整性控制(5)默认约束默认约束指在插入操作中没有提供输入值时,系统自动指定值。例:CREATETABLEstudent(

sno

intPRIMARYKEY,

snamechar(8)NOTNULL,sexchar(2)DEFAULT‘男’

cardnochar(18)UNIQUE,

CONSTRAINTchk_sexcheck(sexin(‘男’,’女’)))7.3数据库的完整性控制2、域约束

CREATEDOMAIN<域名><域类型>CHECK(<条件>)[例7.13]CREATEDOMAINGradeCHAR(1)DEFAULT‘?’CONSTRAINTValid_gradeCHECK(VALUEIN(‘A’,’B’,’C’,’D’,’E’,’?’));7.3数据库的完整性控制3、断言

CHECK子句只对定义它的表起作用,对其它表不起作用。[例7.11]对关系SC的定义加入子句:

CHECK(snoIN(SELECTsno

FROMStudent))CHECK(cnoIN(SELECTcno

FROMCourse))

当对表Student中删除一个元组时,这个操作与关系SC的CHECK无关。

CHECK子句中的条件尽量不要涉及其他关系。7.3数据库的完整性控制当约束条件涉及多个表、使用聚集操作时应使用断言。

格式:CREATEASSERTION<断言名>CHECK(<条件>)[例7.15]每门课程只允许100个学生选修。

CREATEASSERTIONAsser1CHECK(ALL(SELECTCOUNT(sno)FROMSCGROUPBYcno)<=100);[例7.16]不允许计算机学院的学生选修019号课程。

CREATEASSERTIONAsser2CHECKNOTEXISTS(SELECT*FROMStudent,SCWHEREStudent.sno=SC.snoANDStudent.dept=‘计算机学院’ANDSC.cno=‘019’);7.4触发器

触发器:是靠事件驱动的特殊过程。触发器与存储过程的区别:存储过程通过其他程序的调用来运行,或直接启动运行,可传递参数;而触发器的启动运行必须由一个发生的事件来激发,它是自动隐式运行的,触发器不能接收参数,也不能被调用。触发器的类型:

DML触发器:它是在执行insert、update或delete语句时被激发执行的,它只能定义在表上。

替代触发器:是被激发用以代替执行DML语句,它可以定义在表或视图上。

系统触发器:它是在执行create、alter或drop语句;执行数据库的启动或关闭、用户的登录或退出语句时被激发执行的。7.4触发器

触发器的主要用途:

审计:可记录登录数据库的用户。将更新数据的用户和时间日期等信息记录在审计表中。

实现复杂的业务规则:如将被删除的用户保存在用户历史信息中;更新股票表只能在上市交易时间内。可进行系统事件的处理:在表中内容发生变更时,自动通知其他程序采取相应的处理。

增强表的完整性约束:如更新职工的工资时更新后的工资不能低于更新前的工资。7.4触发器

触发器的组成:

触发事件触发条件触发器动作

触发器的一般模型:

CREATETRIGGER<触发器名>{BEFORE|AFTER|INSTEADOF}<触发事件>ON<表名>|<视图名>[REFERENCING[OLDAS<旧元组变量>][NEWAS<新元组变量>]]

[OLDTABLEAS<旧表名>]][NEWTABLEAS<新表名>]]

[FOREACH{ROW|STATEMENT}][WHEN<触发条件>]<SQL语句>7.4触发器

<触发事件>:INSERT|DELETE|UPDATE[OF<列名列表>]FOREACH{ROW|STATEMENT}:

指定触发器的粒度。

FOREACHROW:为行级触发器,当该触发器监视的表中的元组发生改变时,就激活触发器,每变更一行就触发一次。

FOREACHSTATEMENT(默认):为语句级触发器。在被监控表上执行INSERT、DELETE或UPDATE语句,就会激活触发器,而不管该语句的执行会改变多少元组(即使没有改变发生也会激活触发器)。该触发器就在语句执行之前或之后只激发一次。

REFERENCING:指向更新前或更新后的内容。

BEFORE|AFTER|INSTEADOF:

指定触发器执行的时机。7.4触发器

在行级触发器中,REFERENCING的格式:

REFERENCING[OLDAS<旧行别名>][NEWAS<新行别名>]触发事件旧行别名新行别名insert无指定update指定指定delete指定无7.4触发器

BEFORE触发器(前触发器)

在触发事件之前执行。不允许它们修改数据库,但可以检测WHEN子句中定义的前提条件,接受或终止触发事件。BEFORE触发器的一个典型用途是保持应用指定的数据完整性。

例:有关系TS(sno,cno,semester,grade)

CL(cno,semester,limit)

创建一个触发器,它监控插入到TS中的元组,以限制课程注册的人数。CREATETRIGGERCountCheckBEFOREINSERTONTSREFERENCINGNEWASNFOREACHROWWHEN((SELECTCOUNT(sno)FROMTSWHERETS.cno=N.cnoANDTS.semester=N.semester)>=(SELECTlimitFROMCLWHERECL.cno=N.cnoANDCL.semester=N.semester))ROLLBACK7.4触发器

AFTER触发器(后触发器):在触发事件已经改变数据库之后执行。[例7.18]

规定修改SC表的grade值时,修改后的值不能低于修改前的值。

CREATETRIGGERTrig_gradeAFTERUPDATEOFgradeONSCREFERENCINGOLDASoldgNEWASnewgFOREACHROWWHEN(oldg.grade>newg.grade)UPDATESCSETgrade=oldg.gradeWHEREsno=newg.snoANDcno=o;触发事件触发条件触发器动作7.4触发器

例:有关系EMP(eno,ename,esex,salary,dno)

创建一个触发器,每次工资增长之后将所有雇员新的平均工资记录到LOG表中。CREATETRIGGERRecordNewAverageAFTERUPDATEOFsalaryONEMPFOREACHSTATEMENTINSERTINTOLOGVALUES(CURRENT_DATE,(SELECTAVG(salary)FROMEMP))

7.4触发器

INSTEADOF触发器(替换触发器)INSTEADOF触发器最普遍的应用是对视图的维护。视图上的更新事件可以通过触发器监控,但替换更新的是视图的基础表。

例:有关系EMP(eno,ename,esex,salary,dno)

DEPT(dno,dname)

有下面的视图:

CREATEVIEWWorksIn(eno,dname)ASSELECT(EMP.eno,DEPT.dname)FROMEMP,DEPTWHEREEMP.dno=DEPT.dno

7.4触发器

假设在视图上执行下面的操作:

DELETEFROMWorksInWHEREeno=’11111111’

该操作被转换为该视图基础表EMP和DEPT上相应的操作。但是可能会有多种转换:可以删除eno为11111111的雇员所在的部门;可以删除eno为11111111的雇员;可以将雇员元组中的dno字段置为NULL。无法自动决定这三种可能性中哪种是正确的。可以设计INSTEADOF触发器来指定合适的动作。如:CREATETRIGGERWorksInTrigiINSTEADOFDELETEONWorksInREFERENCINGOLDASOFOREACHROW

UPDATEEMPSETdno=NULLWHEREeno=O.enoSQLServer中触发器的创建

CREATETRIGGERtrigger_nameON{table|view}[WITHENCRYPTION]--加密文本{{{FOR|AFTER|INSTEADOF}--触发类型

{[INSERT][,][UPDATE]}--触发事件

AS[{IFUPDATE(column)--测试在指定列上进行的INSERT或UPDATE操作

[{AND|OR}UPDATE(column)][…n]|IF(COLUMNS_UPDATED(){bitwise_operator}--测试是否插入或修改了提及的列。

updated_bitmask)

{comparison_operator}column_bitmask[…n]

}]

sql_statement[…n]--触

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论