自主存取控制
自主存取控制(Discretionary Access Control ,简称 DAC)。
数据库管理员:
- 拥有所有对象的所有权限
- 根据实际情况不同的权限授予不同的用户
用户:
- 拥有自己建立的对象的全部的操作权限
- 可以使用
GRANT
,把权限授予其他用户
被授权的用户:如果具有“继续授权”的许可,可以把获得的权限再授予其他用户。
所有授予出去的权力在必要时又都可用 REVOKE
语句收回。
GRANT
发出 GRANT
的用户:
- 数据库管理员数据库对象创建者(即属主 Owner)
- 拥有该权限的用户
接受权限的用户:
- 一个或多个具体用户
PUBLIC
(即全体用户)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| # GRANT 语句的一般格式: # WITH GRANT OPTION 子句:可以再授予其他用户,不允许循环授权 GRANT <权限>[,<权限>]... ON <对象类型> <对象名>[,<对象类型> <对象名>]… TO <用户>[,<用户>]... [WITH GRANT OPTION ];
# [例 4.1] 把查询 Student 表权限授给用户 U1 GRANT SELECT ON TABLE Student TO U1;
# [例 4.2] 把对 Student 表和 Course 表的全部权限授予用户 U2 和 U3 GRANT ALL PRIVILIGES ON TABLE Student,Course TO U2,U3;
# [例 4.3] 把对表 SC 的查询权限授予所有用户 GRANT SELECT ON TABLE SC TO PUBLIC;
# [例 4.4] 把查询 Student 表和修改学生学号的权限授给用户 U4 GRANT UPDATE (Sno), SELECT ON TABLE Student TO U4;
# [例 4.5] 把对表 SC 的 INSERT 权限授予 U5 用户,并允许他再将此权限授予其他用户 GRANT INSERT ON TABLE SC TO U5 WITH GRANT OPTION;
# [例 4.6] GRANT INSERT ON TABLE SC TO U6 WITH GRANT OPTION;
# [例 4.7]同样,U6 还可以将此权限授予 U7,但 U7 不能再传播此权限。 GRANT INSERT ON TABLE SC TO U7;
|
REVOKE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # REVOKE 语句的一般格式为: REVOKE <权限>[,<权限>]... ON <对象类型> <对象名>[,<对象类型><对象名>]... FROM <用户>[,<用户>]...[CASCADE | RESTRICT];
# [例 4.8] 把用户 U4 修改学生学号的权限收回 REVOKE UPDATE (Sno) ON TABLE Student FROM U4;
# [例 4.9] 收回所有用户对表 SC 的查询权限 REVOKE SELECT ON TABLE SC FROM PUBLIC;
# [例 4.10] 把用户 U5 对 SC 表的 INSERT 权限收回 # 将用户 U5 的 INSERT 权限收回的时候使用 CASCADE,则同时收回 U6 或 U7 的 INSERT 权限,否则拒绝执行该语句 # 如果 U6 或 U7 还从其他用户处获得对 SC 表的 INSERT 权限,则他们仍具有此权限,系统只收回直接或间接从 U5 处获得的权限 REVOKE INSERT ON TABLE SC FROM U5 CASCADE;
|
创建数据库模式的权限
1 2
| # 该命令不是 SQL 标准 CREATE USER <username> [WITH][DBA | RESOURCE | CONNECT];
|
只有系统的超级用户才有权创建一个新的数据库用户。
CONNECT
权限:如没有指定创建的新用户的权限,默认该用户拥有该权限。不能创建新用户, 不能创建模式,也不能创建基本表,只能登录数据库。
RESOURCE
权限:能创建基本表和视图,成为所创建对象的属主。但不能创建模式,不能创建新的用户。
DBA
权限:是系统中的超级用户,可以创建新的用户、创建模式、创建基本表和视图等;DBA 拥有对所有数据库对象的存取权限,还可以把这些权限授予一般用户。
数据库角色
数据库角色:被命名的一组与数据库操作相关的权限,角色是权限的集合,可以为一组具有相同权限的用户创建一个角色简化授权的过程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| # 角色的创建 CREATE ROLE <角色名>; # 给角色授权 GRANT <权限>[,<权限>]... ON <对象类型>对象名 TO <角色>[,<角色>]...;
# 将一个角色授予其他的角色或用户 # 该语句把角色授予某用户,或授予另一个角色 # 授予者是角色的创建者或拥有在这个角色上的 ADMIN OPTION # 指定了 WITH ADMIN OPTION 则获得某种权限的角色或用户还可以把这种权限授予其他角色 GRANT <角色 1>[,<角色 2>]… TO <角色或用户>[,<角色或用户>]... [WITH ADMIN OPTION];
# 角色权限的收回 # 用户可以回收角色的权限,从而修改角色拥有的权限 # REVOKE 执行者是角色的创建者或拥有在这个(些)角色上的 ADMIN OPTION REVOKE <权限>[,<权限>]... ON <对象类型> <对象名> FROM <角色>[,<角色>]...;
# [例 4.11] 通过角色来实现将一组权限授予一个用户。 CREATE ROLE R1; GRANT SELECT, UPDATE, INSERT ON TABLE Student TO R1; GRANT R1 TO 王平,张明,赵玲; REVOKE R1 FROM 王平;
# [例 4.12] 角色的权限修改 GRANT DELETE ON TABLE Student TO R1;
# [例 4.13] 使 R1 减少了 SELECT 权限 REVOKE SELECT ON TABLE Student FROM R1;
|
强制存取控制
强制存取控制(Mandatory Access Control,简称 MAC)
- 每一个数据对象被标以一定的密级
- 每一个用户也被授予某一个级别的许可证
- 对于任意一个对象,只有具有合法许可证的用户才可以存取
主体的敏感度标记称为许可证级别(Clearance Level),客体的敏感度标记称为密级(Classification Level)。
敏感度标记分成若干级别
- 绝密(Top Secret,TS)
- 机密(Secret,S)
- 可信(Confidential,C)
- 公开(Public,P)
- TS>=S>=C>=P
强制存取控制规则:
- 仅当主体的许可证级别大于或等于客体的密级时, 该主体才能读取相应的客体
- 仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体
规则 1 的必要性是明显的。
规则 2 是为了防止把数据的密级从高流向低。如许可证级别为 TS 的主体读取密级为 TS 的客体并以密级 P 写回,造成数据泄露。在规则 2 下,用户可以把写入的对象赋予高于自己许可证级别的密级,一旦数据被写入,该用户自己也不能读取该数据了。
规则 2 应该理解为:主体写入的客体内容可以被赋予高于主体许可证级别的密级,而不是:主体可以修改密级高于该主体许可证级别的客体。