数据库安全性概述
数据库的不安全因素
- 非授权用户对数据库的恶意存储和破坏
- 数据库中重要或敏感的数据被泄露
- 安全环境的脆弱性(自己的硬件)
TCCSEC/TDI 更安全系统设计数据库等级
- D级:不符合更高标准的系统
- C1级:非常初级的自主安全保护
- C2级:安全产品的最低档次
- B1级:标记安全保护(给数据加标签)
- B2级:结构化保护
- B3级:安全域(对用户身份进行跟踪,并且备份还原)
- A1级:验证设计
数据库安全性控制
用户身份鉴别
- 每次用户进入时都要系统核对,通过鉴定后提供数据库管理系统的使用权限。它是系统提供的最外层安全保护措施
- 用户标识组成:由用户名和用户标识号组成,用户标识号在系统整个生命周期内唯一。
- 用户身份验证鉴别方法:
- 静态口令鉴别
- 动态口令鉴别
- 生物特征鉴别
- 智能卡鉴别
存取控制
用户权限定义和合法权检查机制一起组成了数据库管理系统的存储控制子系统。
- 定义用户权限
- 合法权限检查
- 自主存取控制:不同用户的权限可以不同,并且可以将权限传给其他人
- 强制存取控制:给每个数据对象贴一个标签
| 对象类型 | 对象操作类型 | 权限操作 |
|---|---|---|
| 数据库模式 | 模式 | CREATE SCHEMA |
| 数据库模式 | 基本表 | CREATE TABLE, ALTER TABLE |
| 数据库模式 | 视图 | CREATE VIEW |
| 数据库模式 | 索引 | CREATE INDEX |
| 数据 | 基本表和视图 | SELECT, INSERT, UPDATE, DELETE, REFERENCES, ALL PRIVILEGES |
| 数据 | 属性列 | SELECT, INSERT, UPDATE, REFERENCES, ALL PRIVILEGES |
自主存取控制方法
用户权限的含义就是可以操作上面哪些对象,以及对对象进行哪些操作,甚至可以给别人权限。
授予权限:授予与回收
这里我们要记住,所有用户的代称是PUBLIC
GRANT授权
首先我们可以使用GRANT来进行授权权限:
1 | GRANT <权限>[,<权限>]... |
GRANT使用者可以是数据库管理员、数据库对象创造者、用拥有该权限的用户- 接受权限的用户可以是一个或多个具体用户
WITH GRANT OPTION子句:表示该权限可以再给其他。- SQL标准不允许循环授权:用户1给用户2权限,用户2给用户3权限,那么用户3无法直接对用户1授权。
比如我们把查询Student表权限授权给用户U1:
1 | GRANT SELECT |
把查询Student表和修改学生学号的权限授权给U4:
1 | GRANT UPDATE(Sno), SELECT |
REVOKE 回收权限
接着我们来讲解一下如何使用REVOKE收回授权权限,授予的权限可以由数据库管理员或其他授权者用REVOKE语句收回:
1 | REVOKE <权限> [,<权限>]... |
例如把用户U4修改学生学号的权限收回:
1 | REVOKE UPDATE(Sno) |
把用户U5对SC表的INSERT权限收回:
1 | REVOKE INSERT |
我将用户U5的INSERT权限收回的时候应该使用CASCADE,否则拒绝执行该语句。因为U5->U6->U7,U5都没权限了,那后面的肯定也不能用这个权限了。
- 数据管理员的授权:拥有所有对象的所有权限,根据实际情况不同的权限授予不同的用户
- 用户的授权:拥有自己建立的对象的全部操作权限,可以使用
GRANT,把权限给其他用户 - 被授权用户的授权:如果拥有“继续授权”的许可,可以把获得的权限再给其他用户
- 所有授予出去的权力在必要时又都可用REVOKE语句收回。
CREATE USER创建数据库模式的权限
数据库管理员在创建用户时实现对创建数据库模式的权限
1 | CREATE USER <username> |
- 只有DBA才可以创建新的数据库用户
- 新创建的数据库用户有三种权限:CONNECT\RESOURCE和DBA。如果没有指定权限,默认拥有CONNECT权限,拥有CONNECT权限的用户不能创建新用户,不能创建模式,不能创建基本表,只能登录数据库。
- 拥有RESOUCE权限的用户能创建基本表和视图,成为所有对象的属主。但不能创建模式,也不能创建新的用户
- 拥有DBA的话,基本就是想干啥干啥。
| 角色权限 | CREATE USER | CREATE SCHEMA | CREATE TABLE | 登录数据库、查询/操纵数据 |
|---|---|---|---|---|
| DBA | ✅ 可以 | ✅ 可以 | ✅ 可以 | ✅ 可以(拥有全部权限) |
| RESOURCE | ❌ 不可以 | ❌ 不可以 | ✅ 可以 | ✅ 可以(能建表、操作自己的数据) |
| CONNECT | ❌ 不可以 | ❌ 不可以 | ❌ 不可以 | ⚠️ 可以登录,但操作数据必须有相应额外权限 |
数据库角色(面向对象?!)
如果用户很多,但是他们其实都是同一种权限种类。那么我们可以用CREATE ROLE创建一个角色卡,接着用GRANT给角色卡权限,用REVOKE收回角色的权限。然后把用户都定义为这个角色,就很方便。
创建角色
1 | CREATE ROLE <角色名> |
给角色授权
1 | GRANT <权限> [,<权限>]... |
将一个角色授权其他的角色或用户
1 | GRANT <角色1> [,<角色2>]... |
指定了WITH ADMIN OPTION则获得某种权限的角色或用户可以把这种权限授予其他角色。
角色权限收回
1 | REVOKE <权限> [,<权限>]... |
例题:通过角色来实现将一组权限授予一个用户。
首先创建一个角色R1
1 | CREATE ROLE R1; |
然后使用
GRANT语句,使角色R1拥有Student表的SELECT、UPDATE、INSERT权限
1 | GRANT SELECT,UPDATE,INSERT |
将这个角色授权王平,张明,赵玲。是他们拥有角色所包含的全部权限
1 | GRANT R1 |
可以一次性通过R1来回首王平的这3个权限
1 | REVOKE R1 |
强制存取控制方法
自助存取控制DAC的缺点
可能会存在数据“无意泄露”
- 原因:这种机制仅仅通过对数据的存取权限来进行安全控制,而数据本身并无安全性标记
- 解决:对系统控制下的所有住课题实施强制存取控制策略。
强制存取控制(MAC)
保证更高程度的安全、用户不能直接感知或进行控制。
在强制存取控制中实体分类:
- 主体:主体是系统中的活动实体,无论用户还是程序。
- 客体:数据库里的这些数据。
敏感度标记(Lable)
对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记
- 绝密TS
- 机密S
- 可信C
- 公开P
主体的敏感度标记称为许可证级别,客体的敏感度标记称为密级。
强制存取控制规则
- 仅当主体许可证级别大于或等于客体的密级时,该主体才能读取相应的客体。
- 仅当主体的许可证级别小于或等于客梯的密级时,改主体才能写相应的客体。
在现代计算机当中,自主存取控制与强制存取控制共同构成了安全机制。如果没有自主存取控制,name是无法实施强制存取控制的。
DAC + MAC安全检查
系统首先进行自主存取控制检查,通过自主存取控制检查的数据对象再由系统进行强制存取控制检查,只有通过强制存取控制检查的数据对象方可存取。
视图机制
举个例子,我们Student表中的ID和password不想让用户看到,那么我们可以创建一个视图然后取消这两个。可以屏蔽敏感信息,提供安全保护。
并且可以用来删除修改。
CREATE VIEW创建视图
建立计算机系学生的视图CS_Student
1 | CREATE VIEW CS_Student |
给王平老师授权检索计算机系学生信息的权限
1 | GRANT SELECT |
在视图上所有的权限授予张明
1 | GRANT ALL PRIVILIGES |
审计
什么是审计
审计是把数据库的每个操作都记录下来,一般都是大工程才会使用,很消耗系统资源。C2级别以上的DBMS必须得有审计才行。
- 审计日志:记录内容
- 审计员:如果发现有一个人一直在登录,那么可能就是有非法盗号
- 审计事件:一些类似于功能的东西:
- 服务器事件:服务器发生的事件,用于备份
- 系统权限:对系统拥有的结构或模式对象进行操作的审计
- 语句事件:对SQL语句的审计
- 模式对象事件:对特定模式对象上进行的
SELECT或DML操作的审计。
审计功能
- 基本功能:提供多种审计查阅方式
- 多套审计规则:一般在初始化设定
- 提供审计分析和报表功能
- 审计日志管理功能
- ① 防止审计员误删审计记录,审计日志必须先转储后删除
- ② 对转储的审计记录文件提供完整性和保密性保护
- ③ 只允许审计员查阅和转储审计记录,不允许任何修改审计记录
- 提供查询审计设置及审计信息的专门视图
审计分类
审计分为用户级审计和系统级审计。
用户级审计
- 任何用户可设置的审计
- 主要是用户针对自己创建的表和视图进行审计
系统级审计
- 只能由数据库管理员设置
- 监测成功或失败的登录要求、授权和收回操作,以及其他数据库级权限下的操作
AUDIT语句和NOAUDIT语句
- AUDIT语句:设置审计功能
- NOAUDIT语句:取消审计功能
对修改SC表结构或修改SC表数据的操作进行审计:
1 | AUDIT ALTER,UPDATE |
取消对SC表的一切审计:
1 | NOAUDIT ALTER,UPDATE |
但同样的,审计只有这两个语句是不够的,你还需要在系统参数audit_trail设置为true才可以打开审计,在系统表SYS_AUDITTRAIL中查看审计信息。
这是事后检查的一种安全机制,是在运行后检查的。
数据加密
数据加密是防止数据库中数据在存储和传输中失密的有效手段。加密的基本思想是用算法把明文变成了密文,包括存储加密和传输加密。
存储加密
透明存储加密
① 内核级加密保护方式,对用户完全透明。
② 将数据在写到磁盘时对数据进行加密,授权用户读取数据时再对其进行解密。
③ 数据库的应用程序不需要做任何修改,只需在创建表语句中说明需加密的字段即可。
④ 内核级加密方法:性能较好,安全完备性较高。
非透明存储加密
通过多个加密函数实现,比如不靠数据库,我们自己写程序的时候写好。
传输加密
链路加密
① 在链路层进行加密。
② 传输信息由报头和报文两部分组成,报文和报头均加密。
端到端加密
① 在发送端加密,接收端解密。
② 只加密报文,不加密报头。
③ 所需密码设备数量相对较少,容易被非法监听者发现并获取敏感信息。
可信通信流程(基于可信通讯模块)
| 步骤 | 关键动作 | 作用与解释 |
|---|---|---|
| 1️⃣ 创建可信连接 | 通信双方建立初始连接 | 完成TCP握手等基础连接流程,为后续可信协商搭建通道,是整个流程的起点。 |
| 2️⃣ 确认通信双方端点的可靠性 | 验证双方身份(通常依赖CA证书) | 通过CA机构颁发的数字证书确认对方身份合法,防止中间人冒充,确保通信对象可信。 |
| 3️⃣ 协商加密算法和密钥 | 双方沟通确定加密方案与会话密钥 | 约定后续数据传输使用的加密算法(如AES),并通过安全方式协商出会话密钥,为数据加密做准备。 |
| 4️⃣ 可信传输数据 | 使用协商好的密钥和算法加密传输数据 | 对业务数据进行加密后传输,即使数据被截获,无密钥也无法解密读取,保障传输过程的机密性与完整性。 |
| 5️⃣ 关闭可信连接 | 通信结束后释放连接资源 | 完成数据交互后,安全关闭连接并销毁会话密钥,避免密钥泄露,结束本次可信通信会话。 |
其他安全性保护
推理控制
- 作用:处理强制存取控制未解决的问题,避免用户利用可访问的数据推知更高密级的数据。
- 常用方法:基于函数依赖的推理控制、基于敏感关联的推理控制。
隐蔽信道
- 作用:处理强制存取控制未解决的问题,防止利用未被管控的间接通道传递敏感信息。
数据隐私保护
- 定义:描述个人控制其不愿他人知道或他人不便知道的个人数据的能力。
- 应用场景:数据收集、存储、处理和数据发布等环节。
说些什么吧!