TIP
本文主要是介绍 数据库安全性 。
本节要点:
- 计算机安全性概述
- 数据库安全性控制
- 用户标识与鉴别
- 存取控制
- 自主存取控制方法
- 授权与回收
- 数据库角色
- 强制存取控制方法(MAC)
- 视图机制
- 审计(Audit)
- 数据加密
- 统计数据库安全性
# 1、计算机安全性概述
数据库的一大特点是数据可以共享,数据共享必然带来数据库的安全性问题,数据库系统中的数据共享不能是无条件的共享,比如: 军事秘密、国家机密、新产品实验数据、市场需求分析、市场营销策略、销售计划、客户档案、医疗档案、银行储蓄数据等。
数据库的安全是指保护数据库以防止不合法的使用造成的数据泄露、更改或破坏。换句话说,就是防止数据被非法访问。
随着计算机安全性问题的突出,人们在计算机以及信息安全技术方面出台了一系列的安全标准,最有影响的当推TCSEC和CC这两个标准。
TCSEC(Trusted Computer System Evaluation Criteria)是指1985年美国国防部(DoD)正式颁布的《DoD可信计算机系统评估准则TCSEC》;1991年4月美国NCSC(国际计算机安全中心)颁布了《可信计算机系统评估标准关于可信数据库系统的解释TDI》,将TCSEC扩展到数据库管理系统。TDI中定义了数据库管理系统的设计与实现中需满足和用以进行安全性级别评估的标准。
TCSEC/TDI从以下四个方面来描述安全性级别划分的指标:安全策略、责任、保证和文档。每个方面又细分为若干项。即四组七个等级:
A1——验证设计 (有形式化方法可证明安全)
B3——安全域 (有跟踪审计能力)
B2——结构化保护 (有安全策略模型)
B1——标记安全保护 ( 加标记,ORACLE )
C2——受控存取保护 (用户口令权限+审计,ORACLE)
C1——自主安全保护 (用户口令权限SQL-SERVER)
D——最小保护(基本无保护 ACCESS, FOXPRO)
# 2、数据库安全性控制
非法使用数据库的情况有:
- 直接或编写应用程序执行非授权操作
- 编写程序绕过DBMS及其授权机制
- 通过多次合法查询数据库从中推导出一些保密数据
计算机系统中,安全措施是一级一级层层设置:
在上图所示安全模型中,用户要求进入计算机系统时,系统首先根据输入的用户标识进行用户身份鉴定,只有合法的用户才准许进入计算机系统。对已进入系统的用户,DBMS还要进行存取控制,只允许用户执行合法操作。操作系统也会有自己的保护措施。数据最后还可以以密码形式存储到数据库中。
在这里我们只讨论与数据库有关的用户标识和鉴定、存取控制、视图和密码存储等安全技术。
# 2.1、用户标识与鉴别
用户标识与鉴别是系统提供的最外层安全保护措施,其方法是由系统提供一定的方式让用户标识自己的名字和身份。
用户标识 :用一个用户名或者用户标识号来标明用户身份
口令:为了进一步核实用户,系统常常要求用户输入口令,核对口令以鉴别用户身份
# 2.2、存取控制
数据库安全性所关心的主要是DBMS的存取控制机制 。
存储机制主要包含两个部分:
- 定义用户权限
- 合法权限检查
常用存取控制方法:
- 自主存取控制(Discretionary Access Control ,简称DAC)
- C1,C2级
- 灵活
- 强制存取控制(Mandatory Access Control,简称 MAC)
- B1级
- 严格
# 2.3、自主存取控制方法
大型数据库管理系统几乎都支持自主存取控制,目前的SQL标准也对自主存取控制提供支持,这主要通过 SQL 的 GRANT 语句和 REVOKE 语句实现。
用户权限由两个要素组成:
1 对象权限
例如:对SC表的SELECT,INSERT,DELETE权
2 操作类型权限(语句权.系统权)
例如:执行CREATE TABLE权, CREATE VIEW权
定义一个用户的存取权限就是要定义这个用户可以在哪些数据库对象上进行哪些类型的操作。定义存取权限称为授权 。
# 2.4、授权与回收
某个用户对某类数据库对象具有何种操作权力是个政策问题而不是技术问题。GRANT语句向用户授予权限,REVOKE语句收回授予的权限。
# 2.4.1、 GRANT
GRANT语句的一般格式:
GRANT <权限>[,<权限>]...
[ON <对象类型> <对象名>]
TO <用户>[,<用户>]...
[WITH GRANT OPTION];
其语义为:将对指定操作对象的指定操作权限授予指定的用户 。发出GRANT语句的可以是DBA,也可以是数据库对象创建者(即属主Owner),也可以是已经拥有该权限的用户。接受受权限的用户可以是一个或多个具体用户,也可以是PUBLIC(全体用户)。 WITH GRANT OPTION表示获得某种权限的用户还可以把这种权限再授予其他的用户,如果没有指定则表示权限不能再传播。
示例1:把查询Student表权限授给用户U1
GRANT SELECT
ON TABLE Student
TO U1;
示例2:把对Student表和Course表的全部权限授予用户U2和U3
GRANT ALL PRIVILIGES
ON TABLE Student, Course
TO U2, U3;
示例3:把对表SC的查询权限授予所有用户
GRANT SELECT
ON SC
TO PUBLIC;
示例4:把查询Student表和修改学生学号的权限授给用户U4
GRANT UPDATE(Sno), SELECT
ON Student
TO U4;
示例5:把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户
GRANT INSERT
ON SC
TO U5
WITH GRANT OPTION;
执行例5后,U5不仅拥有了对表SC的INSERT权限,还可以传播此权限。比如U5将该权限授予U6:
示例6:GRANT INSERT ON SC TO U6
WITH GRANT OPTION;
同样,U6还可以将此权限授予U7:
示例7:GRANT INSERT ON SC TO U7;
但U7不能再传播此权限。
# 2.4.2、REVOKE
授予的权限可以由DBA或其他授权者用REVOKE语句收回。REVOKE语句的一般格式为:
REVOKE <权限>[,<权限>]...
[ON <对象类型> <对象名>]
FROM <用户>[,<用户>]...;
示例1:把用户U4修改学生学号的权限收回
REVOKE UPDATE(Sno)
ON Student
FROM U4;
示例2:收回所有用户对表SC的查询权限
REVOKE SELECT
ON SC
FROM PUBLIC;
示例3:把用户U5对SC表的INSERT权限收回
REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE ;
注:将用户U5的INSERT权限收回的时候必须级联(CASCADE)收回,不然系统将拒绝执行该命令;有的DBMS缺省值为CASCADE,会自动执行级联操作而不必明显地写出CASCADE;如果U6和U7还从其他用户处获得对SC表的INSERT权限,则他们仍具有此权限,系统只收回直接或间接从U5处获得的权限。
SQL提供了非常灵活的授权机制:
- DBA:拥有所有对象的所有权限
不同的权限授予不同的用户
- 用户:拥有自己建立的对象的全部的操作权限
GRANT:授予其他用户
- 被授权的用户
“继续授权”许可:再授予
- 所有授予出去的权力都可用REVOKE语句收回
# 2.5、 数据库角色
数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。因此,可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。
# 2.5.1、角色的创建
CREATE ROLE <角色名>
# 2.5.2、给角色授权
GRANT <权限>[,<权限>]…
ON <对象类型>对象名
TO <角色>[,<角色>]…
# 2.5.3、将一个角色授予其他的角色或用户
GRANT <角色1>[,<角色2>]…
TO <角色3>[,<用户1>]…
[WITH ADMIN OPTION]
# 2.5.4、角色权限的收回
REVOKE <权限>[,<权限>]…
ON <对象类型> <对象名>
FROM <角色>[,<角色>]…
通过角色来实现将一组权限授予一个用户。步骤如下:
\1. 首先创建一个角色 R1
CREATE ROLE R1;
\2. 然后使用GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限
GRANT SELECT,UPDATE,INSERT
ON TABLE Student
TO R1;
\3. 将这个角色授予王平,张明,赵玲。使他们具有角色R1所包含的全部权限
GRANT R1
TO 王平,张明,赵玲;
\4. 可以一次性通过R1来回收王平的这3个权限
REVOKE R1
FROM 王平;
角色的权限修改如下:
使角色R1在原来的基础上增加了Student表的DELETE权限
GRANT DELETE
ON TABLE Student
TO R1
是R1减少SELECT权限
REVOKE SELECT
ON TABLE Student
FROM R1;
# 2.6、强制存取控制方法(MAC)
自主存取的缺点:可能存在数据的“无意泄露”,某人有权访问某表,制作了复本, 当权限被收回后, 对复本仍可访问
原因:这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记
解决:对系统控制下的所有主客体实施强制存取控制策略
主体是系统中的活动实体:
- DBMS所管理的实际用户
- 代表用户的各进程
客体是系统中的被动实体,是受主体操纵的:
- 文件
- 基表
- 索引
- 视图
敏感度标记(Label):
- 绝密(Top Secret)
- 机密(Secret)
- 可信(Confidential)
- 公开(Public)
主体的敏感度标记称为许可证级别(Clearance Level)
客体的敏感度标记称为密级(Classification Level)
强制存取控制规则:
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
(2)仅当主体的许可证级别等于客体的密级时,该主体才能写相应的客体
MAC保证更高程度的安全性。适用于对数据有严格而固定密级分类的部门: 军事部门、政府部门。
DAC与MAC共同构成DBMS的安全机制。
# 3、视图机制
为不同用户定义不同的视图,把数据对象限制在一定的范围内。也就是说通过视图,把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护。
视图机制间接实现了支持存取谓词(带查询条件)的用户权限定义。
示例:建立计算机系学生的视图,把对该视图的SELECT权限授于王平,把该视图上的所有操作权限授于张明
先建立计算机系学生的视图CS_Student
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept='CS';
在视图上进一步定义存取权限:
GRANT SELECT
ON CS_Student
TO 王平 ;
GRANT ALL
ON CS_Student
TO 张明;
# 4、审计
按照TDI/TCSEC标准中安全策略的要求,“审计”功能就是DBMS达到C2以上安全级别必不可少的一项指标。因为任何系统的安全保护措施都不是完美无缺的,蓄意盗窃、破坏数据的人总是想方设法打破控制。审计功能把用户对数据库的所有操作自动记录下来放入审计日志中。DBA可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容。
审计通常是很费时间和空间的,所以DBMS往往都将其作为可选特征,一般主要应用于安全性要求较高的部门。
AUDIT语句用来设置审计功能, NOAUDIT 语句取消审计功能:
示例:对修改SC表结构或修改SC表数据的操作进行审计
AUDIT ALTER,UPDATE
ON SC;
示例:取消对SC表的一切审计
NOAUDIT ALTER,UPDATE
ON SC;
# 5、数据加密
数据加密是防止数据库中数据在存储和传输中失密的有效手段。
加密方法有:
替换方法:将明文中的每一个字符转换为密文中的一个字符
置换方法:将明文中的字符按照不同的顺序重新排列
混合方法:将替换方法和置换方法结合起来使用
# 6、统计数据库安全性
一般地,统计数据库允许用户查询聚集类型的信息(如合计、平均值等),但是不允许查询单个记录信息。例如,查询“程序员的平均工资是多少”是合法的,但是查询“程序员张勇的工资是多少”就不允许。
统计数据库中特殊的安全性问题:可能存在隐蔽的信息通道,使得能从合法的查询中推导出不合法的信息。例如下面两个查询都是合法的:
- 本公司共有多少女高级程序员?
- 本公司女高级程序员的工资总额是多少?
(如果只有1名女高级程序员,就泄密了)
解决方法:1次查询至少涉及N个。但是即使是这样,还是存在另外的泄密途径,看下面的例子:
- 用户A和其他M个程序员的工资总额是多少?
- 用户B和其他M个程序员的工资总额是多少?
(用户A本人查询, 可推算出B的工资)
解决方法:两次交叉不多于M个。
数据库安全机制的设计目标:试图破坏安全的人所花费的代价远远大于得到的利益。
# 参考文章
- https://www.cnblogs.com/zhouyeqin/p/7400643.html
← 关系数据库语言SQL 数据库完整性 →