当前位置: 首页 > news >正文

数据库实验2 数据库安全性定义与检查

前言:记得验收时问了一个问题吧,就是用户和角色的区别是什么

实验2.1自主存取控制实验

1.实验目的

掌握自主存取控制权限的定义和维护方法。

2.实验内容和要求

定义用户、角色,分配权限给用户、角色,回收权限,以相应的用户名登录数据库验证权限分配是否正确。选择一个应用场景,使用自主存取控制机制设计权限分配。可以采用两种方案。
方案一:采用SYSTEM超级用户登录数据库,完成所有权限分配工作,然后用相应用户名登录数据库以验证权限分配正确性;

方案二:采用SYSTEM用户登录数据库创建三个部门经理用户,并分配相应的权限,然后分别用三个经理用户名登录数据库,创建相应部门的USER,ROLE,并分配相应权限。

下面的实验报告示例采用了实验方案一.验证权限分配之前,请备份好数据库;针对不同用户所具有的权限,分别设计相应的SQL语句加以验证。

3.实验过程

通过 SQL 的 GRANT 语句和 REVOKE 语句实现

用户权限组成

  • 数据对象
  • 操作类型

定义用户存取权限:定义用户可以在哪些数据库对象上进行哪些类型的操作

定义存取权限称为授权

GRANT

语句的一般格式:

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

语义:将对指定操作对象的指定操作权限授予指定的用户

WITH GRANT OPTION子句:

  • 指定:可以再授予
  • 没有指定:不能传播

REVOKE

  • 授予的权限可以由DBA或其他授权者用REVOKE语句收回

语句的一般格式为:

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

设有一个企业,包括采购、销售和客户管理等三个部门,采购部门经理David,采购员Jeffery ;销售部门经理Tom ,销售员Jane;客户管理部门经理Kathy ,职员Mike。该企业一个信息系统覆盖采购﹑销售和客户管理等三个部门的业务,其数据库模式为TPC-H数据模式。针对此应用场景,使用自主存取控制机制设计一个具体的权限分配方案。

(0)开始准备

创建角色之后记得激活,可以把mysql设置为自动激活,(应该是一个用户对应一个全局变量act…,因为我做的时候是在创建角色的时候改过变量为ON,写这篇的时候直接在root下登录MySQL,发现这个变量是OFF)

show variables like 'activate_all_roles_on_login';
set global activate_all_roles_on_login = on;

(1)创建用户

  • 为采购、销售和客户管理等三个部门的经理创建用户标识,要求具有创建用户或角色的权利。
CREATE USER 'David' @'localhost' IDENTIFIED BY '123456';

GRANT CREATE USER,
CREATE ROLE ON *.* TO 'David' @'localhost' WITH GRANT OPTION;

CREATE USER 'Kathy' @'localhost' IDENTIFIED BY '123456';

GRANT CREATE USER,
CREATE ROLE ON *.* TO 'Kathy' @'localhost' WITH GRANT OPTION;

CREATE USER 'Tom' @'localhost' IDENTIFIED BY '123456';

GRANT CREATE USER,
CREATE ROLE ON *.* TO 'Tom' @'localhost' WITH GRANT OPTION;

可以看到,成功创建了用户

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j79lWtAO-1671714762767)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\1669693207592.png)]

  • 为采购、销售和客户管理等三个部门的职员创建用户标识和用户口令。
CREATE USER 'Jeffery'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'Jane'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'Mike'@'localhost' IDENTIFIED BY '123456';

可以看到,成功创建了用户

(2)创建角色并分配权限

1)为各个部门分别创建一个查询角色,并分配相应的查询权限。

  • 给采购部门创建一个角色 SELECT_purchase ,其具有查询零件表、供应商表、零件供应联系表的权限,对应其采购的需求
CREATE ROLE 'SELECT_purchase'@'localhost';

GRANT SELECT ON test.part TO 'SELECT_purchase'@'localhost';  #test改成对应的数据库即可
GRANT SELECT ON test.supplier TO 'SELECT_purchase'@'localhost';
GRANT SELECT ON test.partsupp TO 'SELECT_purchase'@'localhost';

SHOW GRANTS FOR 'SELECT_purchase'@'localhost';

运行结果如下:

  • 给销售部门创建一个角色 SELECT_sale ,其具有查询订单表和订单明细表的权限,对应其销售的需求
CREATE ROLE 'SELECT_sale'@'localhost';

GRANT SELECT ON test.orders TO 'SELECT_sale'@'localhost';
GRANT SELECT ON test.lineitem TO 'SELECT_sale'@'localhost';

SHOW GRANTS FOR 'SELECT_sale'@'localhost';

运行结果如下:

  • 给客户管理部门创建一个角色 SELECT_customer ,其具有查询顾客表、国家表、地区表的权限,对应其顾客管理的需求
CREATE ROLE 'SELECT_customer'@'localhost';

GRANT SELECT ON test.customer TO 'SELECT_customer'@'localhost';
GRANT SELECT ON test.nation TO 'SELECT_customer'@'localhost';
GRANT SELECT ON test.region TO 'SELECT_customer'@'localhost';

SHOW GRANTS FOR 'SELECT_customer'@'localhost';

运行结果如下:

2)为各个部门分别创建一个职员角色,对本部门具有查看、插入权限。

  • 给采购员Jeffery创建一个角色 WORKER_Jeffery,其具有插入和查询零件表、供应商表、零件供应联系表的权限
CREATE ROLE 'WORKER_Jeffery'@'localhost';

GRANT INSERT,SELECT ON test.part TO 'WORKER_Jeffery'@'localhost';
GRANT INSERT,SELECT ON test.partsupp TO 'WORKER_Jeffery'@'localhost';
GRANT INSERT,SELECT ON test.supplier TO 'WORKER_Jeffery'@'localhost';

SHOW GRANTS FOR 'WORKER_Jeffery'@'localhost';

运行结果如下:

  • 给销售员Jane创建一个角色 WORKER_Jane,其具有插入和查询订单表和订单明细表的权限
CREATE ROLE 'WORKER_Jane'@'localhost';

GRANT INSERT,SELECT ON test.orders  TO 'WORKER_Jane'@'localhost';
GRANT INSERT,SELECT ON test.lineitem  TO 'WORKER_Jane'@'localhost';

SHOW GRANTS FOR 'WORKER_Jane'@'localhost';

运行结果如下:

  • 给职员Mike创建一个角色WORKER_Mike,其具有插入和查询客表、国家表、地区表的权限
CREATE ROLE 'WORKER_Mike'@'localhost';

GRANT INSERT,SELECT ON test.nation  TO 'WORKER_Mike'@'localhost';
GRANT INSERT,SELECT ON test.region  TO 'WORKER_Mike'@'localhost';
GRANT INSERT,SELECT ON test.customer TO 'WORKER_Mike'@'localhost';

SHOW GRANTS FOR 'WORKER_Mike'@'localhost';

运行结果如下:

3)为各部门创建一个经理角色,相应角色对本部门的信息具有完全控制权限,对其他部门的信息具有查询权。经理有权给本部门职员分配权限。

CREATE ROLE 'Manager_David'@'localhost';

GRANT ALL ON test.part TO 'Manager_David'@'localhost';
GRANT ALL ON test.partsupp TO 'Manager_David'@'localhost';
GRANT ALL ON test.supplier TO 'Manager_David'@'localhost';

SHOW GRANTS FOR 'Manager_David'@'localhost';
CREATE ROLE 'Manager_Tom'@'localhost';

GRANT ALL ON test.orders TO 'Manager_Tom'@'localhost';
GRANT ALL ON test.lineitem TO 'Manager_Tom'@'localhost';

SHOW GRANTS FOR 'Manager_Tom'@'localhost';
CREATE ROLE 'Manager_Kathy'@'localhost';

GRANT ALL ON test.nation TO 'Manager_Kathy'@'localhost';
GRANT ALL ON test.region TO 'Manager_Kathy'@'localhost';
GRANT ALL ON test.customer TO 'Manager_Kathy'@'localhost';

SHOW GRANTS FOR 'Manager_Kathy'@'localhost';

总共创建如下:

经理:David Tom Kathy
员工:Jeffery Jane Mike
查询角色:SELECT_purchase SELECT_sale SELECT_customer
职员角色:WORKER_Jeffery WORKER_Jane WORKER_Mike
经理角色:Manager_David Manager_Tom Manager_Kathy

(3)给用户分配权限

1)给各部门经理分配权限。

GRANT 'Manager_David'@'localhost' TO 'David'@'localhost';
GRANT 'Manager_Tom'@'localhost' TO 'Tom'@'localhost';
GRANT 'Manager_Kathy'@'localhost' TO 'Kathy'@'localhost';

SHOW GRANTS FOR 'David'@'localhost';
SHOW GRANTS FOR 'Tom'@'localhost';
SHOW GRANTS FOR 'Kathy'@'localhost';

运行结果如下:

在这里插入图片描述

2)给各部门职员分配权限。

GRANT 'WORKER_Jeffery'@'localhost' TO 'Jeffery'@'localhost';
GRANT 'WORKER_Jane'@'localhost' TO 'Jane'@'localhost';
GRANT 'WORKER_Mike'@'localhost' TO 'Mike'@'localhost';

SHOW GRANTS FOR 'Jeffery'@'localhost';
SHOW GRANTS FOR 'Jane'@'localhost';
SHOW GRANTS FOR 'Mike'@'localhost';

(4)回收角色或用户权限

1)收回客户经理角色的销售信息查看权限。

REVOKE SELECT ON test.customer FROM 'Manager_Kathy'@'localhost';
REVOKE SELECT ON test.nation FROM 'Manager_Kathy'@'localhost';
REVOKE SELECT ON test.region FROM 'Manager_Kathy'@'localhost';

SELECT Table_name,Table_priv FROM mysql.tables_priv WHERE user='Manager_Kathy';

结果如下:

可以看到,其收回了查询select的权限

2)回收Mike的客户部门职员权限

回收被赋予Mike的角色WORKER_Mike的权限,先查询它的权限有哪些

select * from mysql.tables_priv where user='WORKER_Mike';

收回其权限

REVOKE SELECT,INSERT ON test.customer FROM 'WORKER_Mike'@'localhost';
REVOKE SELECT,INSERT ON test.nation FROM 'WORKER_Mike'@'localhost';
REVOKE SELECT,INSERT ON test.region FROM 'WORKER_Mike'@'localhost';

select * from mysql.tables_priv where user='WORKER_Mike';

(5)验证权限分配的正确性

1)以David用户名登录数据库,验证采购部门经理的权限

命令提示符输入

mysql -u David -p

输入密码后进入test数据库

use test;

验证采购部门经理的权限

SELECT * FROM part WHERE partkey=100;

SELECT * FROM partsupp WHERE partkey=100;
SELECT * FROM supplier WHERE suppkey=100;

在这里插入图片描述

可以看到,其能正常查询负责的几个表

2)验证Mike的客户部门职员权限。

输入quit退出David用户,再按照上面的方法进入Mike用户页面

输入show databases;查看结果

可以发现,其收回权限之后根本找不到test数据库

再来一个佐证:

查看和Mike同等级的Jane:

没有被回收角色权限的用户Jane就可以访问到test,验证成功

4.实验总结

在进行权限分配之后,针对不同用户所具有的权限,设计并执行若干SQL语句,验证权限分配是否有效。

5.思考题

(1)请分析WITH CHECK OPTION、 WIIH CRANT OPTION和WITH ADMIN OPTION有何区别与联系。

1)

with admin option和with grant option的区别:

级联授权:

WITH ADMIN OPTION和系统权限相关。
WITH GRANT OPTION和对象权限相关。
两种option都能让指定的用户级联授权。
举例:

1、sys用户赋权给lisi:
grant create session to lisi;—>能够连接实例
grant create session to lisi WITH ADMIN OPTION;—>lisi具有create session,并且可以将该权限赋权给其他用户。
2、lisi用户赋权给lisi1:
grant create session to lisi1;—>能够连接实例

回收权限:

1、WITH ADMIN OPTION(系统权限):
拥有WITH ADMIN OPTION的用户如果赋权给其他用户权限,则撤销权限时,仅撤销用户自己权限。
例如:
sys—>赋权给lisi—>lisi赋权给lisi1
sys revoke撤销lisi的系统权限,lisi的系统权限不受影响。

2、WITH GRANT OPTION(对象权限):
拥有WITH GRANT OPTION的用户如果赋权给其他用户权限,则撤销权限时,会发生级联权限撤销。
例如:
sys—>赋权给lisi—>lisi赋权给lisi1
sys revoke撤销lisi的对象权限,lisi1的对象权限失效。

with check option

with check option可以这么解释:通过视图进行的修改,必须也能通过该视图看到修改后的结果。视图加上with check option 子句后对该视图进行插入、修改、删除操作时,DBMS会自动加上条件(透过视图进行增删改操作时,不得破坏视图定义中的谓词条件(即子查询中的条件表达式))。

(2)请结合上述实验示例分析使用角色进行权限分配有何优缺点。

优点:管理权限方便,可以根据实际情况具体地为一些角色分配相应地权利,具有良好地安全性
缺点:操作繁琐。

实验2.2 审计实验

参考 审计实验

打开数据库审计开关。以具有审计权限的用户登陆数据库,设置审计权限,然后以普通用户登录数据库,执行相应的数据操纵SQL语句,验证相应审计设置是否生效,最后再以具有审计权限的用户登录数据库,查看是否存在相应的审计信息。
mysql本身并没有操作审计的功能,需要采用general log方法记录sql操作。网上的插件都是基于MySQL5.7版本的,由于我使用的是最新版8.21所以不是使用插件,而是使用mysql8.x提供的general log来实现审计功能。但是开启它有以下几个缺点

  • 无论sql有无语法错误,只要执行了就会记录,导致记录大量无用信息,后期的筛选有难度。
  • Sql并发量很大时,log的记录会对io造成一定的印象,是数据库效率降低。
  • 日志文件很容易快速膨胀,不妥善处理会对磁盘空间造成一定影响。

1.实验目的

掌握数据库审计的设置和管理方法,以便监控数据库操作,维护数据库安全。

2.实验内容和要求

打开数据库审计开关。以具有审计权限的用户登录数据库,设置审计权限,然后以普通用户登录数据库,执行相应的数据操纵SQL语句,验证相应审计设置是否生效,最后再以具有审计权限的用户登录数据库,查看是否存在相应的审计信息。

3.实验过程

(1)审计开关

1)显示当前审计开关状态。

SHOW GLOBAL VARIABLES LIKE 'log_timestamps';
SHOW GLOBAL VARIABLES LIKE '%general%';

说明未开启审计

2) 暂时打开全局审计

SET GLOBAL general_log=on;
SHOW GLOBAL VARIABLES LIKE '%general%';

3) 查看审计文件保存的位置

show variables like 'general_log_file';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqgq2LfQ-1671714762768)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\1669709524340.png)]

4)测试审计文件记录功能

SELECT * FROM part WHERE partkey=100;
SELECT * FROM part WHERE partkey=101;
SELECT * FROM part WHERE partkey=102;
SELECT * FROM part WHERE partkey=103;

查看审计文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fvZX15It-1671714762768)(C:\Users\86159\AppData\Roaming\Typora\typora-user-images\1669709589736.png)]

可以观察到审计文件中的记录了刚才的查询操作及其时间。

5)关闭审计文件

SET GLOBAL general_log=off;

4.实验总结

审计语句不是标准SQL语句,所以不同的系统语句格式和语法不尽相同。

5.思考题

试着设计一个例子,分析数据库审计对数据库性能的影响情况。

variables like ‘general_log_file’;


[外链图片转存中...(img-xqgq2LfQ-1671714762768)]



4)测试审计文件记录功能

```sql
SELECT * FROM part WHERE partkey=100;
SELECT * FROM part WHERE partkey=101;
SELECT * FROM part WHERE partkey=102;
SELECT * FROM part WHERE partkey=103;

查看审计文件:

[外链图片转存中…(img-fvZX15It-1671714762768)]

可以观察到审计文件中的记录了刚才的查询操作及其时间。

5)关闭审计文件

SET GLOBAL general_log=off;

4.实验总结

审计语句不是标准SQL语句,所以不同的系统语句格式和语法不尽相同。

5.思考题

试着设计一个例子,分析数据库审计对数据库性能的影响情况。

答:数据库审计功能用于监视并记录对数据库服务器的各类操作行为,并记入审计日志或数据库中以便日后进行跟踪、查询、分析,以实现对用户操作的监控和审计。MySQL本身提供详细的sql执行记录–general log,但是开启记录日志的话,只要执行了sql就会记录,无论是否有错误,这就会导致记录大量的无用信息,如果sql并发量很大时,log的记录会对io造成一定的印象,降低数据库效率。

相关文章:

  • 用html5做的网站素材/seo优化公司如何做
  • 无忧网络网站建设/各大引擎搜索入口
  • 个人网站制作模板/热搜榜百度
  • 单职业传奇网站/网页广告
  • 电子商务公司网站模版/游戏推广怎么做挣钱
  • 深圳做网站的网/seo企业优化方案
  • Feign和restTemplate 单个接口超时拦截处理
  • 微信小程序自定义顶部状态栏
  • # 和 ## 运算符
  • as 汇编入门, hello world 显示
  • 【java】opencv + Tesseract(tess4j) 实现图片处理验证码识别
  • GAMES101 Assignment 3
  • 小学生C++编程基础 课程8(A)
  • 前沿系列--Transform架构[架构分析+代码实现]
  • 力扣(15.18)补9.19
  • Linux sed命令如何使用?有哪些作用?
  • Linux 常用命令总结
  • IU酒店打造齐鲁文化旅游发展新高地