# 前言

本篇记录学习数据库系统概论的第四章 -- 数据库安全性

# 数据库安全性概述

数据库的安全性是指保护数据库中的数据,以防止不合法的使用导致数据库中数据的泄露,更改和破坏

# 数据库的不安全因素

  1. 非授权用户对数据库的恶意存取和破坏
  2. 数据库中安全或敏感的数据被泄露
  3. 安全环境的脆弱性

# 安全标准

桔皮书(TCSEC)和 CC 标准,是最具有影响力的两大准则,当下 CC 已经基本取代了 TCSEC 成为评估信息产品安全性的主要标准

# TCSEC 标准

从四个方面来描述安全性级别划分的指标,即 安全策略责任保证文档

下图是发展史

image-20221206141149070

从这四个方面又划分出如下 7 个等级

image-20221206141110402

安全级别从上往下越来越低,D 级包含了所有不符合更高标准的系统

  • C1,能够实现用户和数据的分离,进行自主存取控制(DAC)
  • C2,安全产品的最低档,提供受控的存取保护
  • B1,对标记的主体和课题实施强制存取控制(MAC)以及审计等安全机制,被认为是真正意义上的安全产品
  • B2 结构化保护
  • B3,安全域
  • A1,验证设计

# CC 标准

国际公认的表述信息技术安全性的结构,主要由三个部分组成

  1. 简介和一般模型
  2. 安全功能要求
  3. 安全保证要求

他的安全级别也是划分为 7 个等级分别对应 TCSEC 安全级别

image-20221206143134148

# 数据库安全性控制

上面所记录仅做了解,接下来是本篇的重心部分

再计算机系统中,安全措施是一级一级层层设置的

image-20221206165609085

这样如上图的一个验证过程

数据库安全控制的常用方法

  • 用户身份鉴定
  • 存取控制
  • 视图
  • 审计
  • 数据加密

# 用户的身份鉴定

用户标识通常由用户名和用户标识号两部分组成

常用的身份鉴别方法

  1. 静态口令鉴别:常用,简单但是安全性低
  2. 动态口令鉴别:比较安全
  3. 生物特征鉴别:较高的安全性

# 存取控制

数据库安全性最重要的一点就是确保只有授权的用户能访问数据库

存取控制的机制

  • 用户定义权限
  • 合法权限检查
  • 二者共同组成了 DBMS 的存取控制子系统

# 自主存取控制

通过 SQL 语言的 GRANT (授予)和 REVOKE (收回)语句实现,用户的权限组成:数据库对象,操作类型

定于用权限,定于用户可以在哪些表上面可以进行哪些操作,下表是关系数据库中的存储权限

image-20221206174324541

# 授权和权限回收

# 授权

GRANT <权限>[,<权限>]... ON <对象类型> <对象名>[,<对象类型><对象名>]... TO <用户>[,<用户>]... [WITH GRANT OPTION];/* 又最后一句话的时候证明权限是可以授予给他人的 */

把查询Student的权限授予给用户U1

grant select ON Student to U1;

把对Student和Course的全部权限授予U2,U3

grant All privileges ON Student,Course to U2,U3;

把对SC表的查询权限授予所有用户

grant select on SC to public;

把查询Student表和修改Sno的权限授予U4

grant select,update(Sno) on Student to U4;

对SC表的INSERT权限授予U5,且可再次授权

grant insert on SC to U5 with grant option;

# 权限收回

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

把用户U4修改学号的权限收回

revoke update(Sno) ON Student from U4;

收回所有用户对表SC的查询权限

revoke select ON SC from public;

把用户U5对SC表的Insert权限收回

revoke insert on SC from U5 cascade;#cascade 级联操作,收回 U5 授予出去的权限

<font color=red> 用户可以自主决定将数据的存取权限授予任何人,决定是否也将授权的权限搜娱给别人,这样的存取控制称为用户自主存取控制 </font>

# 数据库角色

数据库角色是数据库权限的集合,为了简化授权过程,为一组具有相同权限的用户创建一个角色

  1. 角色的创建

    CREATE ROLE <角色名>;
  2. 给角色授权

    GRANT <权限>[,<权限>]... ON 对象名 TO <角色>[,<角色>]...;
  3. 将一个角色授予其他的角色或用户

    GRANT <角色1>[,<角色2>]... TO <角色2>[,<用户1>]... [WITH ADMIN OPTION];
  4. 角色权限的收回

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

通过角色来实现将一组权限搜娱一个用户

  1. 首先创建一个角色 R1

    create role R1;
  2. 然后使用 FRANT 语句,使角色 R1 拥有 Student 表的 SELECT,UPDATE,INSERT 权限

    grant select,update,insert on Student to R1;
  3. 将这个角色权限授予王平,张明,赵玲,使他们具有角色 R1 所包含的全部权限

    grant R1 to 王平,张明,赵玲;
  4. 通过 R1 一次性收回王平的这三个权限

    revoke R1 from 王平;

# 强取存取控制的方法

自主存取控制缺点:

  • 可能存在数据的 “无意泄露”
  • 这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记
  • 解决:对系统控制下的所有主客体实施存取控制策略

强制存取控制(MAC)

  • 保证更高的安全性
  • 用户不能直接感知或进行控制
  • 适用于对数据有严格而固定密级分类的部门
    • 军事、政府部门

主体是系统中的活动实体

  • DBMS 所管理的实际用户
  • 代表用户的各进程

客体是系统中的被动实体,是受主体操纵的

  • 文件
  • 基表
  • 索引
  • 视图

敏感读标记(Label)

  • 绝密(Top Secret)
  • 机密(Secret)
  • 可信(Confidential)
  • 公开(public)

主体的敏感度标记称为许可证级别(Clearabce Level)

客体的敏感度标记称为密级(Claccification Level)

强制存取控制规则

  1. 仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
  2. 仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体

# 审计

  • 审计日志

    将用户对数据库的所有操作记录都在上面

  • DBA 利用审计日记

    找出非法存取数据的人,时间和内容

  • C2 以上安全级别的 DBMS 必须具有

# 数据加密

数据加密

  • 防止数据库中数据在存储和传输中失密的有效手段

加密的基本思想

  • 根据一定的算法将原始数据(明文)变换为不可直接识别的格式(密文), 从而使得不知道解密算法的人无法获知数据的内容.

数据加密分类

  • 存储加密
  • 传输加密