Alex_McAvoy

想要成为渔夫的猎手

数据库存取控制

【概述】

数据库安全最重要的就是确保只授权给有资格的用户访问数据库的权限,同时令所有未被授权的人员无法接近数据,这主要通过存取控制来实现

存取控制机制主要包括两部分:

  • 用户权限定义:将用户权限登记到数据字典中
  • 合法权限检查:当用户发出存取数据库请求后,DBMS 查找数据字典,进行合法权限检查,若操作请求超出定义的权限,拒绝该次操作

用户权限定义和合法权限检查一起组成了 DBMS 的存取控制安全子系统,C2 级的 DBMS 系统支持自主权限控制 DAC,B1 级的 DBMS 支持强制存取控制 MAC

【自主存取控制】

自主存取控制方法

对于自主存取控制 DAC来说,用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户可将其拥有的权限转授给其他用户,十分灵活

用户权限由数据库对象操作类型两个要素组成,定义一个用户的存取权限就是要定义这个用户可以在哪些数据库对象上进行哪些类型的操作,这个过程被称为授权

在非关系数据库系统中,用户只能对数据进行操作,存取控制的数据库对象也仅限于数据本身

在关系数据库系统中,存取控制的对象不仅有数据本身,还有数据库模式,如下表,列出了关系数据库系统中的存取权限

授权与收回

在 SQL 中,使用 GRANTREVOKE 语句向用户授权、收回权限

GRANT 语句

GRANT 语句用于将对指定操作对象的指定操作权限授予指定用户,其语法如下

1
2
3
4
GRANT <权限1> [,<权限2>,...,<权限n>]
ON <对象类型1> <对象名1> [,<对象类型2> <对象名2>,...,<对象类型n> <对象名n>]
TO <用户1> [,<用户2>,...,<用户n>]
[WITH GRANT OPTION];

发出 GRANT 语句的可以是数据库管理员,也可以是该数据库创建者(属主 owner),还可以是已拥有该权限的用户

接受权限的用户可以是一个或多个具体用户,也可以是全体用户 PUBLIC

如果指定了 WITH GRANT OPTION 子句,则获得某种权限的用户可以将该种权限再授权给其他用户,如果没有指定,则获取权限的用户不可再传播权限

例如,将查询 student 表的权限授予给用户 user1

1
2
3
GRANT SELECT
ON TABLE student
TO user1;

要注意的是,WITH GRANT OPTION 子句不允许循环授权,即被授权者不能再将权限授权给授权者或其祖先

REVOKE 语句

REVOKE 语句用于收回已赋予的权限,其语法如下

1
2
3
4
REVOKE <权限1> [,<权限2>,...,<权限n>]
ON <对象类型1> <对象名1> [,<对象类型2> <对象名2>,...,<对象类型n> <对象名n>]
FROM <用户1> [,<用户2>,...,<用户n>]
[CASCADE|RESTRICT];

例如,将用户 user1 修改 student 表学生学号的权限收回

1
2
3
REVOKE UPDATE(Sno)
ON TABLE student
FROM user1;

创建数据库模式权限

对创建数据库模式一类的数据库对线下的授权,由数据库管理员使用 CREATE USER 语句在创建用户时实现

CREATE USER 语句的语法如下

1
CREATE USER <用户名> [WITH] [DBA|RESOURCE|CONNECT];

只有系统的超级用户才有权创建一个新的数据库用户,新创建的数据库用户有 DBARESOURCECONNECT 三种权限,具体权限说明如下

拥有权限 CREATE USER CREATE SCHEMA CREATE TABLE 操纵数据
DBA 可以 可以 可以 可以
RESOURCE 不可以 不可以 可以 可以
CONNECT 不可以 不可以 不可以 可以,但必须拥有相应权限

数据库角色

数据库角色是一组被命名的与数据库操作相关的权限,与 Windows 中的用户组十分相似

角色是权限的集合,因此可以为一组具有相同权限的用户创建一个角色,来简化授权的过程

在 SQL 中,使用 CREATE ROLE 语句来创建角色,用 GRANT 语句为角色授权,用 REVOKE 语句收回权限

1.角色创建

CREATE ROLE 语句用于来创建角色,其语法如下

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

刚创建的角色是空的,没有任何内容,用 GRANT 语句为角色授权,其语法如下

1
2
3
GRANT <权限1> [,<权限2>,...,<权限n>]
ON <对象类型1> <对象名1> [,<对象类型2> <对象名2>,...,<对象类型n> <对象名n>]
TO <角色1> [,<角色2>,...,<角色n>];
3.角色授予

一个角色的权限是直接授予这个角色的权限加上其他角色授予这个角色的权限的总和

当想将一个角色授权给某个用户,或者授予另一个角色时,同样可以使用 GRANT 语句来授权,语法如下

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

当指定了 WITH ADMIN OPTION 子句,则获得某种权限的角色或用户还可以将这种权限再授予其他角色

4.收回权限

REVOKE 语句用于收回权限,其语法如下

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

【强制存取控制】

实体划分

对于强制存取控制 MAC来说,每一个数据库对被标记一定的密级,没一个用户也被授权某一个级别的许可证,对于任意一个对象,只有具有合法许可证的用户才可以存取,因此该方法比较严格

在 MAC 中,DBMS 所管理的全部实体被分为主体客体两大类

  • 主体:系统中活动的实体,包括 DBMS 管理的实际用户、代表用户的各进程
  • 客体:系统中的被动实体,受主体操纵,包括文件、基本表、索引、视图等

敏感度标记

对于主体与客体,DBMS 为他们每个实例指派一个敏感度标记 label,其被分为若干级别:绝密 TS、机密 S、可信 C、公开 P,其次序是 $TS\geq S\geq C\geq P$

主体的敏感度标记被称为许可证级别,客体的敏感度标记被称为密级,强制存取控制就是通过对比主体的敏感度标记和客体的敏感度标记,最终确定主体是否能够存取客体

存取规则

当某一用户以标记 label 注册进系统时,系统要求他对任何客体的存取必须遵循如下规则:

  1. 当主体的许可证级别 $\geq$ 客体的密级时,该主体才能读取相应的客体
  2. 当主体的许可证级别 $\leq$ 客体的密级时,该主体才能相应的客体

强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据

【安全检查机制】

较高安全级别提供的安全保护要包含较低级别的所有保护,因此在实现强制存取控制的安全保护,就要先实现自主存取控制,即自主存取控制与强制存取控制共同构成 DBMS 的安全检查机制

如下图,系统首先进行自主存取控制检查,对通过自主存取控制检查的允许存取的数据库对象,再由系统自动进行强制存取控制检查,只有通过强制存取控制检查的数据库对象才可存取

感谢您对我的支持,让我继续努力分享有用的技术与知识点!