数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或损坏。系统安全保护措施是否有效是数据库系统的主要技术指标之一。
目前,各国引用或制定的一系列安全标准中,最重要的是美国国防部(DoD)于1985年正式颁布的《DoD可信计算机系统评估标准》(TCSEC,橙皮书)。TDI/TCSEC 标准是将 TCSEC 扩展到数据库管理系统,形成的《可信计算机系统评估标准关于可信数据库系统的解释》(TDI,紫皮书)。其中定义了数据库管理系统的设计与实现中需满足和用以进行安全性级别评估的标准。
TDI 与 TCSEC 一样,从安全策略、责任、保证和文档四个方面来描述安全性级别划分的指标,每个方面又细分为若干项。
1993年,美国政府同加拿大及欧共体共同起草单一的通用准则(CC)并将其推到国际标准,制定的目的是建立一个各国都能接受的通用的信息安全产品和系统的安全性评估准则。
CC v2.1 于1999年被 ISO 采用为国际标准,2001年被我国采用为国家标准。目前,CC 已经取代 TCSEC 成为评估信息产品安全性的主要标准。信息产品的安全级别可分为:D < C1 < C2 < B1 < B2 < B3 < A1。其中,C2 级的数据库管理系统支持自主存取控制(DAC),B1 级的数据库管理系统支持强制存取控制(MAC)。
根据计算机系统对安全性各项指标的支持情况,TCSEC/TDI 将系统划分为四组七个等级,按系统可靠或可信程度逐渐增高。安全级别之间具有一种偏序向下兼容的关系,即较高安全性级别提供的安全保护包含较低级别的所有保护要求,同时提供更多或更完善的保护能力。
计算机系统的三类安全性问题:技术安全、管理安全、政策法律。
计算机系统的安全模型:
数据库管理系统安全控制模型:
用户访问数据库的安全认证过程如下:
数据库安全性控制的常用方法:用户标识和鉴定、存取控制、视图、审计、数据加密。
该方法由系统提供一定的方式让用户标识自己的名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供系统的使用权。
用户身份鉴别是数据库管理系统提供的最外层安全保护措施,每个用户在系统中都有一个用户标识(由用户名和用户标识号组成),用户标识号(UID)在系统的生命周期内是唯一的,并且系统内部记录这所有合法用户的标识。系统鉴别是指由系统提供一定的方式让用户标识自己的身份或名字,用户进入系统时由系统进行核对,通过鉴定后才提供使用数据库管理系统的权限。
用户身份鉴别的方法:
通过定义用户权限和合法权限检查确保只有合法权限的用户访问数据库,所有未被授权的人员无法存取数据。例如,C2 级中的自主存取控制(Discretionary Access Control,DAC),B1 级中的强制存取控制(Mandatory Access Control,MAC)。
用户可以自主地决定将数据的存取权限授予何人,决定是否将权限授予别人,这样的存取控制就是自主存取控制。自主存取控制主要通过 GRANT
、REVOKE
语句实现。
用户权限是由数据库对象和操作类型组成的。定义一个用户的存取权限就是要定义该用户在哪些数据库对象上可以进行哪些类型的操作。
在非关系数据库系统中,用户只能对数据进行操作,存取控制的数据库对象也仅限于数据本身;在关系数据库系统中,存取控制的对象不仅包括数据本身(基本表中的数据、属性列上的数据),还包括数据库模式(数据库、基本表、视图和索引等)。
自主存取控制(DAC)能够通过授权机制有效地控制对敏感数据的存取,但是由于用户对数据的存取权限是自主的,可以自由授权,导致安全性降低。因此,需要对系统控制下的所有主客体实施强制存取控制策略。
系统为保护更高程度的安全性,按照 TDI/TCSEC 标准中的安全策略的要求所采取的强制存取检查手段。它不是用户能直接感知或进行控制的。强制存取控制适用于那些数据有严格而固定密级分类的部门(军事或政府等)。
在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类:
数据库管理系统为主体和客体每个实例指派一个敏感标记(label)。标记分为绝密 TS >= 机密 S >= 可信 C >= 公开 P。主体的敏感度标记称为许可证级别,客体的敏感度标记称为密级。强制存取控制机制就是通过对比主体的敏感度标记和客体的敏感度标记,最终确定主体是否能够存取客体。
当某一用户(或某一主体)以 label 注册入系统时,系统要求他对任何客体的存取要遵循:
强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性。较高安全性级别提供的安全保护要包含较低级别的所有保护,因此在实现强制存取控制时要首先实现自主存取控制,自主存取控制与强制存取控制共同构成数据库管理系统的安全机制。
系统首先进行自主存取控制检查,对通过自主存取控制检查的允许存取的数据库对象再由系统自动进行强制存取控制检查,只有通过强制存取控制检查的数据库对象方可存取。
为不同的用户定义视图,通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动地对数据提供一定程度的安全保护。
建立审计日志,把用户对数据库的所有操作自动记录下来放入审计日志中,DBA 可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。C2 及以上级别的数据库管理系统必须具有审计功能。
审计分为两类:
GRANT
和 REVOKE
操作以及其他数据库级权限下的操作。对存储和传输的数据进行加密处理,从而使得不知道解密算法的人无法获知数据的内容。
统计数据库:允许用户查询聚集类型的信息(如合计、平均值等)②不允许查询单个记录信息
统计数据库查询规则:
特殊安全性问题:统计数据库允许用户查询聚集类型的信息,如合计、平均值、最大值、最小值等,不允许查询单个记录信息。但是,人们可以从合法的查询中推导出不合法的信息,即可能存在隐蔽的信息通道。
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
WITH GRANT OPTION
允许授权传播。SQL 标准允许具有 WITH GRANT OPTION
的用户把自身权限或其子集传递授予其他用户,但不允许循环授权,即被授权者不能把权限再授回给授权者或其祖先。
该语句的执行权限可以是数据库管理员、数据库对象创建者、已经拥有对应权限且能够传播授权的普通用户。接受权限的用户可以是一个或多个具体用户,也可以是全体用户 PUBLIC。
对属性列的授权时必须明确指出相应属性列名。
GRANT SELECT ON TABLE Student TO User1; # 将查询 Student 表的权限授给 User1
GRANT ALL PRIVILIGES ON TABLE Student, Course TO User2, User3; # 把对 Student 表和 Course 表的全部权限授予 User2 和 User3
GRANT UPDATE(Sno), SELECT ON TABLE Student TO User4; # 把查询 Student 表和修改学生学号的权限授给 User4
REVOKE <权限>[,<权限>]...
[ON <对象类型> <对象名>]
FROM <用户>[,<用户>]...
[CASCADE|RESTRICT];
授予的权限可以由 DBA 或其他授权者用收回。
缺省 RESTRICT
,仅收回该用户的权限;CASCADE
级联收回,将该用户授予给其他用户的权限也一并收回。
REVOKE UPDATE(Sno) ON TABLE Student FROM User4; # 把 User4 修改学生学号的权限收回
REVOKE SELECT ON TABLE SC FROM PUBLIC; # 收回所有用户对表 SC 的查询权限
REVOKE INSERT ON TABLE SC FROM User5 CASCADE; # 把 User5 对 SC 表的插入权限级联收回
数据库角色是被命名的一组与数据库操作相关的权限。角色是权限的集合,可以为一组具有相同权限的用户创建一个角色,简化授权的过程。
CREATE ROLE <角色名> # 创建角色
GRANT <权限>[,<权限>]... ON <对象类型> <对象名> TO <角色名> # 使角色拥有相关权限
GRANT <角色名> TO <用户>[,<用户>]... # 将角色赋予具体用户
CREATE USER <用户名> [WITH] [DBA | RESOURCE | CONNECT]
拥有 DBA 权限的用户是超级用户,只有它才有权创建新的数据库用户;如果没有指定创建的新用户的权限,默认该用户拥有 CONNECT 权限,只能登录数据库。
安全性问题不是数据库系统所独有的,所有计算机系统都有这个问题。只是在数据库系统中大量数据集中存放,而且为许多最终用户直接共享,从而使安全性问题更为突出。
系统安全保护措施是否有效是数据库系统的主要指标之一。数据库的安全性和计算机系统的安全性,包括操作系统、网络系统的安全性是紧密联系、相互支持的。