【数据库原理】数据库安全概述

数据库安全.

为了适应和满足数据共享的环境和要求,DBMS要保证整个系统的正常运转,防止数据泄露,恶意修改,不一致产生,产生问题后的及时恢复,需要一整套而有效的保护措施。DBMS对于数据安全的保护功能包括以下4个方面:

  • 安全性控制
  • 完整性控制
  • 并发性控制
  • 数据库恢复

1.安全性控制.

5大手段:

  • 用户标识和鉴定
  • 用户存取权限控制
  • 定义视图
  • 数据加密
  • 数据审计

1.1 用户标识和鉴定.

  • 由系统提供一定的方式让用户标识自己的名字或身份,系统内部记录着所有合法用户的标识。
  • 每次用户要求进入系统时,由系统进行核实,通过鉴定后才提供机器的使用权。

在这里插入图片描述
然而用户标识的方法也存在一些问题:

  • 用户标识符是用户公开的标识,它不足以成为鉴别用户身份的凭证。
  • 通过用户名和口令来鉴定用户的方法简单易行,但用户名和口令的产生和使用比较简单,也容易被窃取,因此还可采用更复杂的方法。

1.2 用户存取权限控制.

  • 用户存取权限指的是不同的用户对于不同的数据对象允许执行的操作权限。在数据库系统中,定义用户存取权限称为授权 。 这些授权定义经过编译后以一张授权表的形式存放在数据字典DD中。

在这里插入图片描述
在这里插入图片描述

  • 对于授权的使用,一个衡量授权机制的重要指标就是授权粒度,即可以定义的数据对象的范围,在关系数据库中,授权粒度包括关系、记录或属性。
  • 授权粒度越细,授权子系统就越灵活,能够提供的安全性就越完善。

1.3 定义视图.

  • 为不同的用户定义不同的视图,可以限制各个用户的访问范围。
  • 视图是逻辑存在的,其修改操作会受到限制。

在这里插入图片描述

1.4 数据加密.

加密的基本思想是根据一定的算法将原始数据加密成为不可直接识别的格式,数据以密文的形式存储和传输。其基本的实施方法有以下两类,通常将这两种方法结合起来使用,就可以达到相当高的安全程度。:

  • 替换方法,该方法使用密钥将明文中的每一个字符转换为密文中的字符。
  • 转换方法,该方法将明文中的字符按不同的顺序重新排列。

1.5 数据审计.

  • 审计功能是一种监视措施,它跟踪记录有关数据的访问活动。
  • 审计追踪把用户对数据库的所有操作自动记录下来,存放在一个特殊文件中,即审计日志中。
  • 记录的内容一般包括:操作类型(如修改、查询等),操作终端标识与操作者标识,操作日期和时间,操作所涉及到的相关数据(如基本表、视图、记录、属性等),数据的前象和后象等。

2.完整性控制.

完整性控制是指要确保数据库中数据的正确性、有效性和相容性。在安全性的基础上,完整性可以理解为:

  • 防止合法用户使用数据库时向数据库中加入不符合语义的数据。
  • 完整性措施的防范对象是不合语义的数据。

2.1 规则Rule.

  • 规则(Rule)就是数据库对存储在表中的列或用户自定义数据类型中的值的规定和限制。
  • 规则与其作用的表或用户自定义数据类型是相互独立的,即表或用户自定义对象的删除、修改不会对与之相连的规则产生影响。
  • 规则和约束可以同时使用,表的列可以有一个规则及多个check约束。
  • SQL提供语句CREATE RULE来创建规则,其语法格式如下:
CREATE RULE NAME_OF_RULE 
AS CONDITION_EXPRESSION

【例】创建学生年龄规则:学生的年龄在[18,50]的闭区间内。

CREATE RULE age_rule
AS @age>=18and @age<=50
  • 创建规则后,规则仅仅是一个存在于数据库中的对象,并未发生作用。需要将规则与数据库表或用户自定义对象联系起来,才能达到创建规则的目的。
  • 规则创建之后需要绑定到数据库对象上才能起到完整性控制的作用,当我们不希望规则生效时就要将绑定好的规则松绑,两种操作分别由SQL Server中的系统存储过sp_bindrulesp_unbindrule完成。其语法格式如下:
sp_bindrule 'NAME_OF_RULE','NAME_OF_OBJECT'

sp_unbindrule 'NAME_OF_OBJECT'

【例】绑定规则age_rule 到S表的字段Age上.

扫描二维码关注公众号,回复: 11677117 查看本文章
EXEC sp_bindrule 'age_rule', 'S.Age'

【例】解除已绑定到S表的字段Age的规则age_rule.

EXEC sp_unbindrule 'S.Age'
  • 注意!规则对已经存在于表中的数据不起作用,而只会对那些后续修改、插入的数据进行约束。
  • 删除一个规则使用语句DROP RULE NAME_OF_RULE,但注意,在删除一个规则前必须先将与其绑定的对象解除绑定。

【例】 删除age_rule规则。

DROP RULE age_rule

2.2 默认Default.

  • 默认(Default)是向用户输入记录时没有指定具体数据的列中自动插入的数据。
  • 表的一列或一个用户自定义数据类型只能与一个默认绑定。
  • SQL提供语句CREATE DEFAULT来创建默认,其语法格式如下所示:
CREATE DEFAULT NAME_OF_DEFAULT
AS CONSTANT

【例】创建出生日期默认birthday_defa.

CREATE DEFAULT birthday_defa
AS '1978-1-1'
  • 使用系统过程sp_helptext NAME_OF_DEFAULT可以查看一个默认对象的信息。

【例】查看默认birthday_defa.

EXEC sp_helptext birthday_defa
  • 和规则Rule一样,默认Default也需要绑定到对象上才能生效,当我们不需要时也可以进行解绑,对应的操作分别由系统存储过程sp_bindefaultsp_unbindefault,其语法格式如下所示:
sp_bindefault 'NAME_OF_DEFAULT','NAME_OF_OBJECT'

sp_unbindefault 'NAME_OF_OBJECT'

【例】绑定默认birthday_defa到数据表S的Birthday列上。

EXEC sp_bindefault birthday_defa,'S.Birthday'

【例】解除默认birthday_defa与表S的Birthday列的绑定。

EXEC sp_unbindefault 'S.Birthday'
  • 删除一个默认使用语句DROP DEFAULT NAME_OF_DEFAULT实现,和规则一样,在删除一个默认前必须先将与其绑定的对象解除绑定。

【例】删除学生生日默认birthday_defa.

DROP DEFAULT birthday_defa

3.并发性控制.

  • 多个用户同时访问数据库,如果对并发操作不加控制可能会产生不正确的数据,破坏数据的完整性。
  • 并发控制就是解决这类问题,以保持数据库中数据的一致性,即在任何一个时刻数据库都将以相同的形式给用户提供数据。

3.1 事务Transaction

  • 事务是数据库系统中执行的一个工作单位,它是由用户定义的一组操作序列。一个事务可以是一组SQL语句、一条SQL语句或整个程序,一个应用程序可以包括多个事务。
  • 定义事务的语句有三条:①BEGIN TRANSACTION事务的开始;②COMMIT事务的提交;③ROLLBACK事务的回滚。
  • 事务的4个性质:原子性(Atomicity),一致性(Consistency),隔离性(Isolation)和持久性(Durability).
  • 【原子性】一个事务是一个不可分割的工作单位,事务在执行时,应该遵守“要么不做,要么全做”(Nothing or All)的原则,即不允许完成部分的事务。
  • 【一致性】事务对数据库的作用是数据库从一个一致状态转变到另一个一致状态。所谓数据库的一致状态是指数据库中的数据满足完整性约束。
  • 【隔离性】如果多个事务并发地执行,应像各个事务独立执行一样,一个事务的执行不能被其他事务干扰。
  • 【持久性】持久性指一个事务一旦提交,它对数据库中数据的改变就应该是持久的,即使数据库因故障而受到破坏,DBMS也应该能够恢复。
  • 数据库的并发操作导致的数据库不一致性主要有以下三种:①丢失更新(Lost Update);②污读(Dirty Read);③不可重读(Unrepeatable Read).

【例】丢失更新
在这里插入图片描述
当两个事务 T 1 T_1 T1 T 2 T_2 T2读入同一数据,并发执行修改操作时, T 2 T_2 T2 T 1 T_1 T1 T 1 T_1 T1 T 2 T_2 T2的修改结果覆盖掉,造成了数据的丢失更新问题,导致数据的不一致。

【例】污读
在这里插入图片描述
事务 T 1 T_1 T1更新了数据R,事务 T 2 T_2 T2读取了更新后的数据R,事务 T 1 T_1 T1由于某种原因被撤销,修改无效,数据R恢复原值。事务 T 2 T_2 T2得到的数据与数据库的内容不一致,这种情况称为“污读”。

【例】不可重读
在这里插入图片描述
事务 T 1 T_1 T1读取了数据R,事务 T 2 T_2 T2读取并更新了数据R,当事务 T 1 T_1 T1再读取数据R以进行核对时,得到的两次读取值不一致,这种情况称为“不可重读”。

3.2 封锁协议.

  • 实现并发控制的方法主要有两种:封锁(Lock)技术和时标(Timestamping)技术,重点介绍封锁技术。
  • 所谓封锁就是当一个事务在对某个数据对象(可以是数据项、记录、数据集以至整个数据库)进行操作之前,必须获得相应的锁,以保证数据操作的正确性和一致性。接触过多线程与并发编程后,对于这个概念理解会更加深刻。
  • 基本的封锁类型有两种:排它型封锁(Exclusive Lock)和共享封锁(Share Lock)。前者又称写封锁,简称为X封锁,它采用的原理是禁止并发操作;后者又称读封锁,简称为S锁,它采用的原理是允许其他用户对同一数据对象进行查询但不能对该数据对象进行修改
  • 【封锁协议Lock Protocol】封锁可以保证合理地进行并发控制,保证数据的一致性。在封锁时,要考虑一定的封锁规则,例如,何时开始封锁、封锁多长时间、何时释放等,这些封锁规则称为封锁协议。
  • 封锁粒度指封锁的单位。根据对数据的不同处理,封锁的对象可以是这样一些逻辑单元:字段、记录、表、数据库等,封锁的数据对象的大小叫封锁粒度。封锁粒度越小,系统中能够被封锁的对象就越多,并发度越高,但封锁机构复杂,系统开销也就越大。封锁粒度越大,系统中能够被封锁的对象就越少,并发度越低,封锁机构越简单,相应系统开销也就越小。

3.2.1 一级封锁协议.

事务T在修改数据对象之前必须对其加X锁,直到事务结束。
在这里插入图片描述

3.2.2 二级封锁协议.

在一级封锁协议的基础上,事务T在读取数据R之前必须先对其加S锁,读完后释放S锁。
在这里插入图片描述

3.2.3 三级封锁协议.

在一级封锁协议的基础上,事务T在读取数据R之前必须先对其加S锁,读完后并不释放S锁,而直到事务T结束才释放。
在这里插入图片描述

3.2.4 封锁引发の问题.

  • 【活锁Livelock】当某个事务请求对某一数据进行排它性封锁时,由于其他事务对该数据的操作而使这个事务处于永久等待状态,这种状态称为活锁,例如下面的事务 T 2 T_2 T2:
    在这里插入图片描述
  • 【死锁Deadlock】在同时处于等待状态的两个或多个事务中,其中的每一个在它能够进行之前,都等待着某个数据,而这个数据已被它们中的某个事务所封锁,这种状态称为死锁。
    在这里插入图片描述

3.2.5 死锁Deadlockの解决预防.

  • 【一次加锁法】一次性对所有资源加锁,如果有一个资源无法加锁,则等待。
  • 【顺序加锁法】规定资源的序号,按序号加锁。
  • 【事务依赖图】如果在事务依赖图中沿着箭头方向存在一个循环,那么死锁的条件就形成了,系统就会出现死锁。选择一个处理死锁代价最小的事务,将其撤销以解除死锁。操作系统原理中专门有一章介绍死锁,可以查看。
    在这里插入图片描述

4.数据库恢复.

  • DBMS必须具有检测故障并将数据从错误状态恢复到某一正确状态的功能,这就是数据库恢复。
  • 数据库恢复的基本原理是利用数据的冗余,被破坏或出错的数据可以使用其他地方存储的冗余数据来修复。所以恢复系统应该具有准备冗余数据和根据冗余数据重建数据库的两大功能。
  • 准备冗余数据的两大常用技术是登记日志文件和数据转储,常常结合使用。

4.1 日志文件

  • 更新数据库的事务标识(标明是哪个事务)
  • 操作的类型(插入、删除或修改)
  • 操作对象
  • 更新前数据的旧值(对于插入操作,没有旧值)
  • 更新后数据的新值(对于删除操作,没有新值)
  • 事务处理中各个关键时刻(事务开始、结束及其真正回写时间)
  • 【先写原则】所有操作(撤销,重做,更新,查询)等内容都先写入日志,然后在数据库中执行事务。

4.2 数据转储.

  • 定期地将数据库复制到多个存储设备(如磁带、磁盘)上。
  • 存储方式: 海量转储和增量转储。
  • 存储运行方式: 静态转储和动态转储。
  • 存储位置: 同城和异地。

4.3 数据库故障.

  • 【事务故障Transaction Failure】程序中的异常结束所造成的故障,可以反向扫描日志文件,查找该事务的更新操作,而后对该事务的更新操作执行反操作。
  • 【系统故障System Failure】在运行过程中,由于某种原因,造成系统停止运转,致使所有正在运行的事务都以非正常方式终止,要求系统重新启动。恢复方法是:查找尚未提交的事务,将其事务标识记入撤销队列。同时查找已经提交的事务,将其事务标识记入重做队列。对撤销队列中的各个事务进行撤销处理;对重做队列中的各个事务进行重做处理。
  • 【介质故障Media Failure】存储器介质受到破坏,使存储在外存中的数据部分丢失或全部丢失。恢复方法是:装入最新的转储,装入最新的日志文件副本,找出发生故障前已提交的事务,将其记入重做队列。再对重做队列中的各个事务进行重做处理。

猜你喜欢

转载自blog.csdn.net/weixin_44246009/article/details/108146452