什么是数据库安全保护?
防止数据意外丢失和不一致数据的产生,以及当数据库遭受破坏后迅速恢复正常。
DBMS对数据库的安全保护方功能是通过四方面实现的,即安全性控制、完整性控制、并发性控制和数据库恢复。
含义:尽可能地杜绝所有可能的数据库非法访问。例如:绕过DBMS的授权机制,通过操作系统直接存取、修改或备份有关数据。
一般方法:
DBMS是建立在操作系统之上的,安全的操作系统是数据库安全的前提。操作系统应能保证数据库中的数据必须由DBMS访问,而不允许用户越过DBMS直接通过操作系统访问。数据最后可以通过密码的形式存储到数据库中。这里只讨论数据库有关的安全性措施,分为用户标识和鉴定、用户存取权限控制、定义视图、数据加密和审计等。
用户标识和鉴定:
系统提供一定的方式让用户标识自己的名字和身份,系统内部记录着所有合法用户的标识,每次用户要求进入系统时,由系统进行核实,通过鉴定后才提供计算机的使用权,它是最外层的安全保护措施。常用方法:(1)用一个用户名或用户标识符来标明用户的身份(2)用户名与口令相结合(3)每个用户预先约定好一个过程或者函数,鉴别用户身份时,系统提供一个随机数,用户根据自己预先约定的计算过程或者函数进行计算,系统根据计算结果辨别用户身份的合法性。
用户存取权限控制:
存取权限由两个要素组成:数据对象和操作类型。定义一个用户的存取权限就是要定义这个用户可以在哪些数据对象上进行哪些类型的操作。定义用户存取权限称为授权。权限可以分为系统权限和对象权限两种,系统权限是由DBA授予某些数据库用户能够对数据库系统进行某种特定操作的权利,如创建一个基本表(CREATE TABLE),只有得到系统权限,才能成为数据库用户;对象权限可以由DBA授予,也可以由基本表、视图等数据对象的创建者授予,使数据库用户具有对某些数据对象进行某些操作的权限,如查询(SELECT)、添加(INSERT)、修改(UPDATE)和删除(DELETE)等操作。
在系统初始化时,系统中至少有一个具有DBA权限的用户,DBA可以通过GRANT语句将系统权限或对象权限授予其他用户,并可以通过REVOKE语句收回所授予的权限。
角色是多种权限的集合,可以把角色授予用户或其他角色。可以避免许多重复性的工作,简化了数据库用户的权限管理工作。
定义视图:
为不同的用户定义不同的视图,可以限制各个用户的访问范围。通过视图机制把要保密的数据对无权存取这些数据的用户隐藏起来,从而自动地对数据提供一定程度地安全保护。
数据加密:
前面几种数据库安全措施,都是防止从数据库系统中窃取保密数据,不能防止通过不正常渠道非法访问数据,例如,偷取存储数据的硬盘,或在通信线路上窃取数据,为了防止此类手段,比较好的办法是对数据加密。加密的基本思想是根据一定的算法将原始数据(术语明文)加密成为不可直接识别的格式(术语密文),数据以密文的形式存储和传输。
审计:
实际上任何系统的安全性措施都不是绝对可靠的,对于某些高度敏感的保密数据,必须以审计作为预防手段。审计功能是一种监视措施,它跟踪记录有关数据的访问活动。使用审计功能把用户对数据库的的所有操作自动记录下来,存放在一个特殊文件中,即审计日志(Audit Log)中。利用这些信息,可以重现导致数据库现有状况的一系列事件,以进一步找出非法存取数据的人、时间和内容等。但使用审计功能会大大增加系统开销,所以DBMS通常将其作为可选特征,并提供相应的操作语句,可灵活地打开或关闭审计功能。
含义:数据库的完整性是指保护数据的正确性、有效性和相容性,防止错误的数据进入数据库造成无效操作。
数据库的完整性和安全性是数据库保护的两个不同的方面,安全性措施的防范对象是非法用户和非法操作,完整性措施的防范对象是合法用户的不合语义的数据。
完整性约束条件的分类:
【按约束条件使用的对象划分】
(1)值的约束和结构约束。值的约束即对数据类型、数据格式、取值范围和空值等进行规定。结构的约束即对数据之间联系的约束。
【按约束对象的状态划分】
(2)静态约束和动态约束
方法:
声明式数据完整性:约束(Constraint)、默认值(Default)、规则(Rule)
程序化数据完整性:存储过程(Stored Procedure)、触发器(Trigger)
含义:前面的完整性控制是保证各个事务本身能得到正确的数据,只考虑一个用户使用数据库的情况,但实际上数据库中有许多用户,每个时刻可能只有一个用户程序运行,也可能有多个用户并行地存取数据库,这样就会发生多个用户并发存取同一数据的情况,如果对并发操作不加控制可能会产生不正确的数据,破坏数据的完整性。并发控制就是要解决这类问题,以保持数据库中数据的一致性,即在任何一个时刻数据库都将以相同的形式给用户提供数据。
方法:
封锁技术和时标技术。封锁技术是目前DBMS普遍采用的并发控制方法。这里介绍封锁技术。
所谓封锁就是当一个事务在对某个数据对象(可以是数据项、记录、数据集以及整个数据库)进行操作之前,必须获得相应的锁,以保证数据操作的正确性和一致性。
封锁类型:
(1)排他型封锁。又称写封锁,简称为X封锁,原理是禁止并发操作。当事务T对某个数据对象R实现X封锁后,其他事务要等T解锁X封锁后,才能对R进行封锁。
(2)共享封锁。又称读封锁,简称为S锁,原理是允许其他用户对同一数据对象进行查询,但不能对该数据对象进行修改。当事务T对某个数据对象R实现S封锁后,其他事务只能对R加S锁,而不能加X锁,直到T释放R上的S锁。
封锁协议:
实际上,锁是一个控制块,其中包括被加锁记录的标识符及持有锁的事务的标识符等。在封锁时,要考虑一定的封锁规则,例如,何时开始封锁、封锁多长时间、何时释放等,这些封锁规则称为封锁协议。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。
封锁粒度:
封锁粒度指封锁的数据对象的大小。根据对数据的不同处理,封锁的对象可以是这样的一些逻辑单元:字段、记录、表和数据库等。
死锁和活锁:
封锁技术可有效解决并行操作的一致性问题,但也可产生新的问题,即活锁和死锁问题。
(1)活锁。当某个事务请求对某一数据进行排他性封锁时,由于其他事务对该数据的操作而使这个事务处于永久等待状态,这种状态称为活锁。
(2)死锁。在同时处于等待状态的两个或多个事务中,其中的每一个在它能够进行之前,都等待着某个数据,而这个数据已被它们中的某个事务所封锁,这种状态称为死锁。
含义:尽管有许多保护措施,但数据库的数据仍然无法保证绝对不遭受破坏,例如硬件的故障、软件的错误、操作的失误、恶意的破坏以及计算机病毒等都有可能发生,使数据库中的数据丢失。因此,系统必须具有检测故障并把数据从错误状态中恢复到某一正确状态的功能,这就是数据库的恢复。
基本原理:利用数据的冗余。数据库中任何被破坏或不正确的数据都可以利用存储在其他地方的冗余数据来修复。
因此恢复系统应该提供两种类型的功能:一种是生成冗余数据,即对可能发生的故障做某些准备,最常用的技术是登记日志文件和数据转储;另一种是冗余重建,即利用这些冗余数据恢复数据库。