Skip to content

数据库安全性

4.1 数据库安全性概述

核心问题: 数据共享与安全保密之间的矛盾。数据库中的数据共享是在 DBMS 统一严格控制下的共享——只允许有合法使用权限的用户访问允许其存取的数据。安全保护措施的有效性是数据库系统的主要性能指标之一。

数据库安全性:保护数据库,防止因用户非法使用数据库造成数据泄露、更改或破坏

数据保密:用户合法访问到机密数据后能否对这些数据保密(通过法律、道德准则和政策法规保证)。

4.1.1 数据库的不安全因素

因素说明主要防范技术
1. 非授权用户的恶意存取和破坏黑客猎取用户名和口令,假冒合法用户偷取、修改甚至破坏数据用户身份鉴别、存取控制、视图
2. 重要或敏感数据被泄露黑客盗窃机密数据强制存取控制、数据加密存储/传输、审计日志分析
3. 安全环境的脆弱性与计算机系统(硬件、操作系统、网络)安全性紧密联系建立可信计算机系统标准

4.1.2 安全标准简介

TCSEC/TDI(橙皮书/紫皮书)

  • 1985 年美国国防部颁布《DoD 可信计算机系统评估准则》(TCSEC)
  • 1991 年 NCSC 颁布 TDI(紫皮书),将 TCSEC 扩展到数据库管理系统
  • 从四个方面描述安全性级别:安全策略、责任、保证、文档

TCSEC/TDI 七级安全划分(从低到高):

等级名称说明
D最低保护不符合更高标准的系统(如 DOS)
C1自主安全保护(初级的)能实现用户与数据分离,进行自主存取控制(DAC)
C2受控存取保护(安全产品最低档次)DAC 进一步细化,个人身份注册,实施审计和资源隔离(如 Windows 2000、Oracle 7)
B1标记安全保护对数据加标记,实施强制存取控制(MAC)和审计(如 Trusted Oracle 7、Secure SQL Server)
B2结构化保护建立形式化安全策略模型,对主体和客体实施 DAC 和 MAC
B3安全域TCB 满足访问监控器要求,审计跟踪更强,提供系统恢复
A1验证设计在 B3 基础上给出系统的形式化设计说明和验证

各安全级别具有偏序向下兼容关系:较高级别包含较低级别的所有保护要求。

CC 标准(通用准则)

  • 1993 年 CTCPEC、FC、TCSEC、ITSEC 联合行动
  • 1999 年 CC V2.1 被 ISO 采用为国际标准;2001 年被我国采用
  • 现已基本取代 TCSEC,成为评估信息产品安全性的主要标准
  • 安全要求分为:安全功能要求安全保证要求
  • 评估保证级 EAL1~EAL7 共七级

4.2 数据库安全性控制

非法使用数据库的几种情况

  1. 编写合法程序绕过 DBMS 及其授权机制,通过操作系统直接存取/修改/备份数据
  2. 直接或编写应用程序执行非授权操作
  3. 推理控制问题:通过多次合法查询推导出保密数据

    例:某系统禁止查询个人工资,但允许查一组人平均工资。用户先查包括张三在内的平均工资,再用自己替换张三后查平均工资,从而推导出张三的工资。

计算机系统的安全模型

用户 → 用户标识和鉴别 → 数据库安全保护(存取控制/审计/视图)
                            → 操作系统安全保护 → 数据密码存储

安全措施是一级一级层层设置的。

存取控制流程

用户请求 → 身份鉴别 → SQL 处理层(DAC检查 → MAC检查 → 推理控制)
                     → 审计/入侵检测 → 数据存取

常用安全性控制方法

  1. 用户标识和鉴定
  2. 存取控制
  3. 视图
  4. 审计
  5. 数据加密

4.2.1 用户身份鉴别

系统提供的最外层安全保护措施。用户标识由用户名用户标识号组成(标识号在系统生命周期内唯一)。

四种鉴别方法:

方法说明
静态口令鉴别用户自设口令,静态不变
动态口令鉴别口令动态变化,每次用新口令(一次一密)
生物特征鉴别指纹、虹膜、掌纹等
智能卡鉴别不可复制的硬件,具有硬件加密功能

4.2.2 存取控制

存取控制机制的两部分:

  1. 定义用户权限 → 登记到数据字典(安全规则/授权规则)
  2. 合法权限检查 → 用户发出操作请求时 DBMS 查找数据字典进行合法性检查

两种常用存取控制方法:

方法安全级别特点
自主存取控制 (DAC)C2 级灵活,用户可将权限转授他人
强制存取控制 (MAC)B1 级严格,数据标密级,用户有许可证
  • DAC:同一用户对不同数据对象有不同权限;不同用户对同一对象也有不同权限;用户可以转授权限
  • MAC:每个数据对象标密级,每个用户被授予许可证级别,只有合法许可证才可存取

4.2.3 自主存取控制方法

通过 SQL 的 GRANTREVOKE 语句实现。

用户权限组成: 数据对象 + 操作类型。

定义用户存取权限 = 授权

  • 定义存取权限 (对象权限):用户
  • 检查存取权限 :DBMS

授权粒度

  • 数据对象粒度:数据库、表、属性列、行
  • 授权粒度越细,授权子系统就越灵活,能够提供的安全性就越完善。但另一方面,因数据字典变大变复杂,系统定义与检查权限的开销也会相应地增大。

4.2.4 授权:授予与回收

一、GRANT 语句

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

发出 GRANT 的人: DBA、数据库对象创建者(属主 Owner)、拥有该权限的用户。

接受权限的人: 一个或多个具体用户,或 PUBLIC(全体用户)。

WITH GRANT OPTION: 指定后可再授予他人;未指定则不能传播;不允许循环授权。

【例题 1】 把查询 Student 表权限授给用户 U1

sql
GRANT SELECT
ON TABLE Student
TO U1;

【例题 2】 把对 Student 表和 Course 表的全部权限授予 U2 和 U3

sql
GRANT ALL PRIVILEGES
ON TABLE Student, Course
TO U2, U3;

【例题 3】 把对表 SC 的查询权限授予所有用户

sql
GRANT SELECT
ON TABLE SC
TO PUBLIC;

【例题 4】 把查询 Student 表和修改学生学号的权限授给 U4

sql
GRANT UPDATE(Sno), SELECT
ON TABLE Student
TO U4;

对属性列授权时必须明确指出相应属性列名。

【例题 5】 把对表 SC 的 INSERT 权限授予 U5,并允许其再授予其他用户

sql
GRANT INSERT
ON TABLE SC
TO U5
WITH GRANT OPTION;

【例题 6-7】 U5 传播权限给 U6,U6 再传播给 U7

sql
GRANT INSERT ON TABLE SC TO U6 WITH GRANT OPTION;
GRANT INSERT ON TABLE SC TO U7;

U7 不能再传播此权限(未被授予 WITH GRANT OPTION)。

二、REVOKE 语句

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

【例题 8】 收回用户 U4 修改学生学号的权限

sql
REVOKE UPDATE(Sno)
ON TABLE Student
FROM U4;

【例题 9】 收回所有用户对表 SC 的查询权限

sql
REVOKE SELECT
ON TABLE SC
FROM PUBLIC;

【例题 10】 收回用户 U5 对 SC 表的 INSERT 权限(需要级联收回)

sql
REVOKE INSERT
ON TABLE SC
FROM U5 CASCADE;

使用 CASCADE 级联收回,系统只收回直接或间接从 U5 处获得的权限。

灵活的授权机制小结

  • DBA:拥有所有对象的所有权限
  • 不同权限可授予不同用户
  • 用户:拥有自己创建的对象的全部操作权限
  • GRANT:授予其他用户
  • 被授权用户有"继续授权"许可时可再授予
  • 所有授予出去的权力可用 REVOKE 收回

三、创建数据库模式的权限

CREATE USER 语句:

sql
CREATE USER <username>
[WITH] [DBA|RESOURCE|CONNECT];

注:CREATE USER 不是 SQL 标准,各系统实现差异较大。

三种用户权限:

权限可做操作
CONNECT(默认)登录数据库,不能创建新用户、模式或基本表
RESOURCE创建基本表和视图,不能创建模式和新用户
DBA创建新用户、模式、基本表等;拥有对所有数据库对象的存取权限,可授权给一般用户

只有系统的超级用户才有权创建新的数据库用户。

4.2.5 数据库角色

数据库角色: 被命名的一组与数据库操作相关的权限(权限的集合)。

为一组具有相同权限的用户创建角色,可简化授权过程。

操作命令

一、创建角色

sql
CREATE ROLE <角色名>;

二、给角色授权

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

三、将角色授予其他角色或用户

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

指定 WITH ADMIN OPTION 后,获得权限的角色或用户可再将权限授予其他角色。

四、角色权限的收回

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

【例题 11】 通过角色将一组权限授予用户

sql
-- 1. 创建角色 R1
CREATE ROLE R1;

-- 2. 给角色 R1 授权(Student 表的 SELECT、UPDATE、INSERT)
GRANT SELECT, UPDATE, INSERT
ON TABLE Student
TO R1;

-- 3. 将角色 R1 授予王平、张明、赵玲
GRANT R1 TO 王平, 张明, 赵玲;

-- 4. 通过 R1 回收王平的权限
REVOKE R1 FROM 王平;

【例题 12-13】 修改角色的权限

sql
-- 给角色 R1 增加 DELETE 权限
GRANT DELETE
ON TABLE Student
TO R1;

-- 收回角色 R1 的 SELECT 权限
REVOKE SELECT
ON TABLE Student
FROM R1;

4.2.6 强制存取控制方法 (MAC)

强制存取控制:按照 TDI/TCSEC 标准中安全策略的要求,采取的强制存取检查手段。用户不能直接感知或控制,适用于对数据有严格固定密级分类的部门(如军事、政府部门)。

主体与客体

  • 主体:活动实体(实际用户、代表用户的进程)
  • 客体:被动实体(文件、基表、索引、视图)

敏感度标记(Label)

每个主体和客体被指派一个敏感度标记(级别):

级别说明
绝密 (Top Secret)最高
机密 (Secret)
可信 (Confidential)
公开 (Public)
  • 主体的敏感度标记许可证级别 (Clearance Level)
  • 客体的敏感度标记密级 (Classification Level)

MAC 规则(主体以 Label 注册时)

规则 1(读规则): 仅当主体的许可证级别 >= 客体的密级时,主体才能读取相应的客体。

规则 2(写规则): 仅当主体的许可证级别 <= 客体的密级时(修正规则),主体才能写入相应的客体。

用户可为写入的数据对象赋予高于自己许可证级别的密级。一旦写入,用户自己也不能再读取该数据对象。

共同点: 禁止高许可证级别的主体更新低密级的数据对象(防止高密级数据向下流动)。

MAC 特点

  • 对数据本身进行密级标记
  • 标记与数据是不可分的整体(无论数据如何复制)
  • 只有符合密级要求的用户才能操纵数据
  • 提供更高级别的安全性

DAC 与 MAC 的关系

两者共同构成 DBMS 的安全机制。

检查顺序: 先进行 DAC 检查 → 通过后进入 MAC 检查 → 两者均通过方可存取。

SQL语法分析 & 语义检查

   ┌── DAC 检查 ──┐
   └── MAC 检查 ──┘

   继续语义检查

4.3 视图机制

视图机制将需要保密的数据对无权存取的用户隐藏起来,提供一定程度的安全保护。

  • 视图主要功能是提供数据独立性,安全保护功能相对较粗
  • 通常与授权机制配合使用

用法:

  1. 先用视图机制屏蔽保密数据
  2. 再在视图上进一步定义存取权限
  3. 间接实现了支持存取谓词的用户权限定义

【例题 14】 建立计算机系学生视图并授权

sql
-- 1. 建立计算机系学生视图 CS_Student
CREATE VIEW CS_Student
AS
SELECT *
FROM Student
WHERE Sdept = 'CS';

-- 2. 将视图的 SELECT 权限授予王平
GRANT SELECT
ON CS_Student
TO 王平;

-- 3. 将视图的所有操作权限授予张明
GRANT ALL PRIVILEGES
ON CS_Student
TO 张明;

4.4 审计

审计:启用专用的审计日志 (Audit Log),将用户对数据库的所有操作记录在上面。DBA 利用审计日志追踪信息,监控数据库中的各种行为,找出非法存取数据的人、时间和内容。

C2 以上安全级别的 DBMS 必须具有审计功能。

审计功能的特点

  • 可选性:审计很费时间和空间,DBA 可根据应用需求灵活打开/关闭
  • 主要用于安全性要求较高的部门

1. 审计事件

事件类型说明
服务器事件数据库服务器发生的事件
系统权限对系统结构/模式对象的操作(通过系统权限获得)
语句事件SQL 语句(DDL、DML、DQL、DCL)
模式对象事件特定模式对象上的 SELECT 或 DML 操作

2. 审计功能

  • 提供多种审计查阅方式
  • 多套审计规则(一般在初始化设定)
  • 提供审计分析和报表功能
  • 审计日志管理(防止误删,日志必须先转储后删除)
  • 对转储的审计记录文件提供完整性和保密性保护
  • 只允许审计员查阅和转储审计记录,不允许新增和修改
  • 提供查询审计设置和审计记录的专门视图

审计分类

类型说明
用户级审计针对用户自己创建的数据库表或视图,记录所有成功/不成功的访问及各种 SQL 操作
系统级审计DBA 设置,监测登录成败、GRANT/REVOKE 操作及其他数据库级权限操作

审计语句

sql
AUDIT   <...>;   -- 设置审计功能
NOAUDIT <...>;   -- 取消审计功能

安全机制总结

  • 预防/监测手段:审计技术
  • 强制性机制:用户识别和鉴定、存取控制、视图

4.5 数据加密

数据加密是防止数据库中数据在存储传输中失密的有效手段。

基本思想: 根据一定算法将明文 (Plain text) 变换为密文 (Cipher text),不知道解密算法的人无法获知数据内容。

存储加密

方式说明
透明存储加密内核级加密,对用户完全透明。数据写入磁盘时加密,授权用户读取时解密。应用程序无需修改,只需在建表时说明需加密的字段。性能较好,安全完备性较高。
非透明存储加密通过多个加密函数实现

传输加密

方式说明
链路加密在链路层加密,报文和报头均加密
端到端加密发送端加密,接收端解密。只加密报文不加密报头。所需密码设备较少,但容易被非法监听者发现并获取敏感信息。

基于 SSL 协议的传输加密方案

  1. 确认通信双方端点的可靠性:基于数字证书的服务器和客户端认证,使用 CA 信任列表和证书撤销列表验证
  2. 协商加密算法和密钥:通信双方协商本次会话的加密算法与密钥
  3. 可信数据传输:数据发送前用密钥加密和消息摘要计算,以密文传输;接收时用相同密钥解密和摘要计算

4.6 其他安全性保护

推理控制

  • 处理强制存取控制未解决的问题
  • 避免用户利用能够访问的数据推知更高密级的数据
  • 常用方法:
    • 基于函数依赖的推理控制
    • 基于敏感关联的推理控制

隐蔽信道

  • 处理强制存取控制未解决的问题

数据隐私保护

  • 描述个人控制其不愿他人知道或他人不便知道的个人数据的能力
  • 范围涵盖:数据收集、数据存储、数据处理和数据发布等各个阶段

本章小结

本章围绕数据库安全性展开,重点说明 DBMS 如何通过身份鉴别、存取控制、审计和加密等机制保护数据。

关键内容

  • 安全性概念:数据库安全性用于防止非法使用数据库造成数据泄露、更改或破坏,安全保护需与数据共享相协调。
  • 安全标准:TCSEC/TDI 和 CC 标准用于评价可信计算机系统和数据库系统的安全级别。
  • 身份鉴别:通过静态口令、动态口令、生物特征、智能卡等方式确认用户身份。
  • 存取控制:自主存取控制(DAC)通过 GRANT / REVOKE 灵活授权,强制存取控制(MAC)通过主体和客体密级实现严格保护。
  • 视图、审计与加密:视图隐藏敏感数据,审计记录用户行为,数据加密保护存储和传输过程中的机密性。
  • 角色管理:通过角色统一管理一组权限,降低授权维护复杂度。

核心要点

  • 数据库安全控制通常按身份鉴别、存取控制、操作审计和数据加密等层次协同工作。
  • DAC 灵活但依赖授权传播控制,MAC 更严格,适用于多级安全需求。
  • 视图机制与授权机制结合,可以实现更细粒度的数据访问控制。

关键术语

数据库安全性, TCSEC, TDI, CC, 用户身份鉴别, DAC, MAC, GRANT, REVOKE, 角色, 视图机制, 审计, 数据加密, 推理控制, 隐蔽信道。

关键 SQL 语句

sql
-- 授权
GRANT <权限> ON <对象类型> <对象名> TO <用户> [WITH GRANT OPTION];

-- 收回权限
REVOKE <权限> ON <对象类型> <对象名> FROM <用户> [CASCADE|RESTRICT];

-- 创建用户
CREATE USER <username> [WITH DBA|RESOURCE|CONNECT];

-- 角色管理
CREATE ROLE <角色名>;
GRANT <权限> ON <对象类型> <对象名> TO <角色>;
GRANT <角色> TO <用户> [WITH ADMIN OPTION];
REVOKE <角色> FROM <用户>;

-- 审计
AUDIT <...>;
NOAUDIT <...>;