数据库安全性概述

数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。

安全性问题不是数据库系统所独有的,所有计算机系统都存在不安全因素,只是在数据库系统中由于大量数据集中存放,而且为众多最终用户直接共享,从而使安全性问题更为突出。系统安全保护措施是否有效是数据库系统的主要技术指标之一。

数据库的不安全因素

对数据安全性产生威胁的因素主要有以下几个方面。

非授权用户对数据库的恶意存取和破坏

数据库管理系统提供的安全措施主要包括用户身份鉴别、存取控制和视图等技术。

数据库中重要或敏感的数据被泄露

数据库管理系统提供的主要技术有强制存取控制、数据加密存储和加密传输等。在安全性较高的部门提供审计功能,防止对数据库安全责任的否认。

安全环境的脆弱性

数据库的安全性与计算机系统的安全性,包括计算机硬件、操作系统、网络系统等的安全性是紧密联系的。因此,必须加强计算机系统的安全性保证。为此,在计算机安全技术方面逐步发展建立了一套可信(trusted)计算机系统的概念和标准。

数据库安全性控制

数据库管理系统安全性控制模型.png
上图是数据库安全保护的一个存取控制流程。DBMS对提出SQL访问请求的数据库用户进行身份鉴别,防止不可信用户使用系统;在SQL处理层进行自主存取控制和强制存取控制,进一步可以进行推理控制。为监控恶意访问,可以根据具体安全需求配置审计规则,对用户访问行为和系统关键操作进行审计。在数据存储层,DBMS不仅存放用户数据,还存储与安全有关的标记和信息,提供存储加密功能等。

用户身份鉴别

用户身份鉴别是DBMS提供的最外层安全保护措施。每个用户在系统中都有一个用户标识,由用户名(username)和用户标识号(UID)两部分组成。UID在系统的整个生命周期内是唯一的。系统鉴别是指由提供提供一定的方式让用户标识自己的名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供使用DBMS的权限。

常用的用户身份鉴别有以下几种:

静态口令鉴别:当前常用的鉴别方法,静态口令一般由用户自己设定,这些口令是静态不变的。

动态口令鉴别:口令是动态变化的,每次鉴别时均需使用动态产生的新口令登录DBMS,即一次一密的方式。

生物特征鉴别:通过生物特征进行认证的技术,例如指纹,人脸等。

存取控制

确保只授权给有资格的用户访问数据库的权限,同时令所有未被授权的人员无法接近数据,主要通过DBMS的存取控制机制实现。存取控制机制主要包括定义用户权限和合法权限检查两部分。

定义用户权限,并将用户权限登记到数据字典中:用户对某一数据对象操作权力称为权限。DBMS提供适当的语言来定义用户权限,存放在数据字典中,称做安全规则或授权规则。

合法权限检查:用户发出存取数据库操作请求,DBMS查找数据字典,根据安全规则进行合法权限检查。

定义用户权限和合法权限检查机制一起组成了DBMS的存取控制子系统。C2级的DBMS支持自主存取控制(DAC),B1级的DBMS支持强制存取控制(MAC)。

自主存取控制方法

大型数据库管理系统都支持自主存取控制,SQL标准也对自主存取控制提供支持,这主要通过SQL的GRANT和REVOKE语句来实现。

用户权限是由两个要素组成的:数据库对象和操作类型。定义一个用户的存取权限就是要定义这个用户可以在哪些数据库对象上进行哪些类型的操作。在数据库系统中,定义存取权限称为授权(authorization)。

在关系数据库系统中,存取控制的对象不仅有数据本身(基本表中的数据、属性列上的数据),还有数据库模式(包括数据库、基本表、视图和索引的创建等)

授权:授予与收回

SQL中使用GRANT和REVOKE语句向用户授予或收回对数据库的操作权限。

GRANT:

GRANT语句的一般格式为:

GRANT <权限>[,< 权限>]... ON <对象类型> 对象名 TO <用户>[,<用户>]... [WITH GRANT OPTION];

其语义为:将对指定操作对象的指定操作权限授予指定的用户。如果指定了WITH GRANT OPTION子句,则获得某种权限的用户还可以把这种权限在授予其他的用户。

例1:把查询Student表的权限授予给U1。

GRANT SELECT ON TABLE Student TO U1;

例2:把对Student表的全部权限授予U2和U3。

GRANT ALL PRIVILEGES ON TABLE Student TO U2,U3;

例3:把查询Student表和修改学生学号的权限授予用户U4。

GRANT SELECT , UPDATE(`Sno`) ON S_T.Student TO U4;

例4:把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户。

GRANT INSERT ON S_T.SC TO U5 WITH GRANT OPTION;

例5:使用U5将上述权限赋予给U6。

GRANT INSERT ON TABLE S_T.SC TO U6 WITH GRANT OPTION;

REVOKE:

REVOKE语句的一般格式为:

REVOKE <权限>[,< 权限>]... ON <对象类型> 对象名 FROM <用户>[,< 用户>]...;

例6:收回用户U4修改学生学号的权限。

REVOKE UPDATE(Sno) ON TABLE S_T.Student FROM U4;

例7:收回用户U5对SC表INSERT的权限(不会级联收回U6的权限)。

REVOKE INSERT ON TABLE S_T.SC FROM U5;

创建用户:

CREATE USER语句不是SQL标准,不同的数据库语法不同, 这里以MySQL为例,举一个简单例子:

创建一个名为bobby的账户,密码为new_password:

CREATE USER bobby IDENTIFIED BY 'new_password';

数据库角色

数据库角色是一组权限的集合。因此可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。

在SQL中首先用CREATE ROLE语句创建角色,然后用GRANT语句给角色授权,用REVOKE语句收回授予角色的权限。

角色的创建:

CREATE ROLE role [, role ] ...

给角色授权:

GRANT <权限>[,< 权限>]... ON <对象类型> 对象名 TO <角色>[,<角色>]...;

将一个角色授予其他的角色或用户:

GRANT <角色1>[,<角色2>]… TO <角色3>[,<用户1>]… [WITH ADMIN OPTION]

如果指定了WITH ADMIN OPTION子句,则获得某种权限的角色或用户还可以把这种权限在授予其他的角色。

角色权限的收回:

REVOKE <权限>[,<权限>]… ON <对象类型> <对象名> FROM <角色>[,<角色>]…

从其他角色或用户收回角色:

REVOKE <角色> [,<角色>] ... FROM <角色3>[,<用户1>]… ...

例1:通过角色来实现将一组权限授予用户。

1. 创建一个角色R1;
CREATE ROLE 'R1'@'localhost';
  1. 使用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限;
GRANT SELECT, UPDATE, INSERT ON TABLE Student TO 'R1'@'localhost';
  1. 将R1授予U1,U2,U3,使他具有角色R1的全部权限;
GRANT 'R1'@'localhost' TO 'U1'@'localhost';
  1. 在原来基础上,对R1添加DELETE权限;
GRANT DELETE ON TABLE Student TO 'R1'@'localhost';
  1. 在原来基础上,移除R1的SELECT权限;
REVOKE SELECT ON TABLE Student  FROM 'R1'@'localhost';
  1. 收回角色;
REVOKE 'R1'@'localhost' FROM 'U1'@'localhost';

注意:MySQL如果想要使角色生效,还需要执行以下语句:

SET DEFAULT ROLE ALL TO 'U1'@'localhost';

强制存取控制方法

视图机制

我们还可以为不同的用户定义不同的视图,把数据对象限制在一定范围内。把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护。

审计

审计功能把用户对数据库的所有操作自动记录下来放入审计日志(audit.log)中。审计员可以利用审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。

数据加密

对于高度敏感性数据,例如财务数据、军事数据、国家机密数据等,都应采用数据加密技术。数据加密是防止数据库数据在存储和传输中失密的有效手段。加密的基本思想是根据一定的算法将原始数据——明文(plain text)变换为不可直接识别的格式——密文(cipher text),从而使不知道解密算法的人无法获知数据内容。

加密数据主要包括存储加密和传输加密。

存储加密

存储加密,一般分为透明和非透明两种方式。

透明存储加密:

  • 内核级加密保护方式,对用户完全透明;
  • 将数据在写磁盘时对数据进行加密,授权用户读取数据时在对其进行解密;
  • 数据库的应用程序不需要做任何修改,只需要创建表语句中说明加密字段即可;

内核级加密方法:性能较好,安全完备性较高;

非透明存储加密:

  • 通过多个加密函数实现;

传输加密

常用的传输加密方式有链路加密和端到端加密。

链路加密:

  • 传输信息由报头和报文两部分组成;报头:路由选择信息;报文:要传送的数据信息;
  • 报文和报头均加密;

端到端加密:

  • 在发送端加密,接收端解密;
  • 只加密报文不加密报头;
  • 所需密码设备数量相对较少,容易被非法监听者发现并从中获取敏感信息;

其他安全性保护

为满足较高安全等级数据库管理系统的安全性保护要求,在上述之外,还有推理控制以及数据库应用中隐藏信道和数据隐私保护等技术。



参考文献:数据库系统概论-第5版[王珊,萨师煊]