文章目录
- 4.1 数据库安全性概述
- 4.1.1 数据库的不安全因素
- 4.2 数据库安全性控制
- 4.2.1 用户身份识别
- 4.2.2 存取控制
- 4.2.3 自主存取控制
- 4.2.4 授权:授权与收回
- 1. GRANT
- 2. 创建用户
- 3. 查看用户权限
- 4. 删除用户
- 5. 查看所有用户的信息
- 6. REVOKE
- 7. 创建数据库模式的权限
- 8. MySQL授予创建权限:
- 4.2.5 数据库角色
- 1. 角色的创建
- 2. 给角色授权
- 3. 将一个角色授予其他的角色或用户
- 4. 角色权限的收回
- 4.3 视图机制
- 4.4 审计
- 4.5 数据加密
- 4.6 其他安全保护
数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
与数据库安全性有关的技术,主要包括:
用户身份识别是数据库管理系统提供的最外层安全保护措施。
存取控制机制主要包括:
定义用户权限和合法权限检查机制一起组成了数据库管理系统的存取控制子系统。
C2级数据库管理系统支持自主存取控制。
B1级数据库管理系统支持强制存取控制。
主要通过SQL的 GRANT 和 REVOKE 来实现。
用户权限由两个要素组成:
定义一个用户的存取权限就是要定义这个用户可以在哪些数据库对象上进行哪些类型的操作。
在数据库系统中,定义存取权限称为授权。
SQL中使用GRANT向用户授予权限,使用REVOKE向用户收回权限。
GRANT 权限 [,权限] ...
ON 对象类型 对象名 [,对象类型 对象名 ] ...
TO 用户 [, 用户]
[ WITH GRANT OPTION ];
CREATE USER 'username'@'host'
IDENTIFIED BY 'password';
SHOW GRANTS FOR 'username'@'host';
DROP USER 'username'@'host';
SELECT * FROM mysql.user;
创建用户:
CREATE USER 'U1'@'localhost'
IDENTIFIED BY '123456';
CREATE USER 'U2'@'%'
IDENTIFIED BY '123456';
CREATE USER 'U3'@'localhost'
IDENTIFIED BY '123456';
CREATE USER 'U4'@'localhost'
IDENTIFIED BY '123456';
CREATE USER 'U5'@'localhost'
IDENTIFIED BY '123456';
SELECT Host, User
FROM mysql.user;
[例4.1]把查询Student表的权限授给用户 U1。
GRANT SELECT
ON TABLE Student
TO 'U1'@'localhost';
SHOW GRANTS FOR 'U1'@'localhost';
usage 官方解释:"无权限"的同义词
[例4.2]把对 Student表和 Course表的全部操作权限授予用户U2和U3。
GRANT ALL PRIVILEGES
ON TABLE Student
TO 'U2'@'%', 'U3'@'localhost';
GRANT ALL PRIVILEGES
ON TABLE course
TO 'U2'@'%', 'U3'@'localhost';
SHOW GRANTS FOR 'U2'@'%';
mysql一次赋予多个表的权限会报错
其中,PRIVILEGES 可以省略
[例4.3]把对表SC的查询权限赋予所有用户
GRANT SELECT
ON TABLE sc
TO public;
mysql不支持
[例4.4] 把查询Student表和修改学生学号的权限授给用户U4。
GRANT SELECT, UPDATE(Sno)
ON TABLE Student
TO 'U4'@'localhost';
SHOW GRANTS FOR 'U4'@'localhost';
[例4.5]把对表SC的 INSERT权限授予U5用户,并允许将此权限再授予其他
GRANT INSERT
ON TABLE sc
TO 'U5'@'localhost'
WITH GRANT OPTION ;
SHOW GRANTS FOR 'U5'@'localhost';
由U5用户发上述GRANT命令给其他用户,U5可以将此权限授予U6
CREATE USER 'U6'@'localhost'
IDENTIFIED BY '123456';
使用U5登录数据库
GRANT INSERT
ON TABLE sc
TO 'U6'@'localhost';
在root用户下查看U6的权限:
SHOW GRANTS FOR 'U6'@'localhost';
由于U5没有给U6转授权限的权限,所以U6只能使用权限,不能授予其他用户权限。
REVOKE 权限 [,权限] ...
ON 对象类型 对象名 [,对象类型 对象名 ] ...
FROM 用户 [, 用户] [CASCADE | RESTRICT];
[例4.8]把用户U4修改学生学号的权限收回。
REVOKE UPDATE(Sno)
ON TABLE student
FROM 'U4'@'localhost';
SHOW GRANTS FOR 'U4'@'localhost';
[例4.9]收回所有用户对表SC的查询权限。
REVOKE SELECT
ON TABLE sc
FROM PUBLIC;
mysql不支持
[例4.10]把用户U5对SC表的INSERT权限收回。
级联收回U6,mysql不支持cascade | restrict
mysql默认不会级联收回
REVOKE INSERT
ON TABLE sc
FROM 'U5'@'localhost';
SHOW GRANTS FOR 'U5'@'localhost';
SHOW GRANTS FOR 'U6'@'localhost';
用户可以 “自主”地决定 将数据的存取权限授予何人、决定是否也将“授权”的权限授予别人。因此称这样的存取控制是 自主存取控制。
CREATE USER username [WITH] [DBA | RESOURCE | CONNECT]
mysql不支持
GRANT CREATE
ON *.*
TO 'U2'@'%';
SHOW GRANTS FOR 'U2'@'%';
第一个 * 表示数据库,第二个 * 表示表格
GRANT ALL PRIVILEGES
ON *.*
TO 'U3'@'localhost';
SHOW GRANTS FOR 'U3'@'localhost';
mysql8.0 以上才支持角色
mysql用户被授予角色还要激活(授予角色的授予者进行激活)
`set default role all to 用户
数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。
可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。
在SQL中首先用CREATE ROLE语句创建角色,然后用GRANT语句给角色授权,用REVOKE语句收回授予角色的权限。
创建角色的SQL语句格式是:
CREATE ROLE 角色名;
刚刚创建的角色是空的,没有任何内容。
CREATE ROLE r1;
SHOW GRANTS FOR r1;
数据库管理员和用户可以利用GRANT语句将权限授予某一个或几个角色。
GRANT 权限
ON 对象类型 对象名
TO 角色;
CREATE ROLE r2;
GRANT SELECT
ON TABLE mydb1.sc
TO r1, r2;
SHOW GRANTS FOR r2;
GRANT 角色
TO 角色 | 用户
WITH ADMIN OPTION;
GRANT r1
TO 'U1'@'localhost'
WITH ADMIN OPTION ;
SHOW GRANTS FOR 'U1'@'localhost';
mysql8.0 以上才支持角色
mysql用户被授予角色还要激活(授予角色的授予者进行激活)
`set default role all to 用户
REVOKE 权限 [, 权限]
ON 对象类型 对象名
FROM 角色 [, 角色];
用户可以收回角色的权限,从而修改角色拥有的权限。
REVOKE 的执行者是角色的创建者或拥有这个角色上ADMIN OPTION
例:通过角色来实现一组权限授予一个用户
创建角色role1
CREATE ROLE role1;
给角色role1授予Student表的查询、更新、插入权限
GRANT SELECT, UPDATE, INSERT
ON TABLE Student
TO role1;
将role1授予U3,U5
GRANT role1
TO 'U3'@'localhost', 'U5'@'localhost';
收回U3的role1角色
REVOKE role1
FROM 'U3'@'localhost';
修改role1的权限
GRANT DELETE
ON TABLE Student
TO role1;
REVOKE SELECT
ON TABLE student
FROM role1;
SHOW GRANTS FOR role1;
可以为不同的用户定义不同的视图,把数据对象限制在一定的范围内。
也就是说,通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动对数据提供一定程度的安全保护。
视图机制间接地实现支持存取谓词的用户权限定义。
[例4.14] 建立计算机系学生的视图,把对该视图的SELECT 权限授予王平,把该视图上的所有操作权限授予张明。
CREATE VIEW CS_stu
AS
SELECT *
FROM student
WHERE Sdept = 'CS';
CREATE USER '王平'@'%'
IDENTIFIED BY '123456';
CREATE USER '张明'@'%'
IDENTIFIED BY '123456';
GRANT SELECT
ON TABLE CS_stu
TO '王平'@'%';
GRANT ALL
ON CS_stu
TO '张明'@'%';
SHOW GRANTS FOR '王平'@'%';
SHOW GRANTS FOR '张明'@'%';
审计功能把用户对数据库的所有操作自动记录下来放入审计日志中。
审计员可以利用审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。
数据加密主要包括: