关于MySQL三权分立基本的测试

三权分立

1、首先在root用户下,创建三个管理员账号,分别授予以下三种权限
  (1)系统管理员(起、停、restart、stop,只拥有DDL权限)
  (2)安全管理员(拥有授权的权力,可以给B授权,然后B可以使用grant with option将权力赋给C)
  (3)审计管理员(pluing 安装审计插件 ,可以去配置审计)
  
  
2、在这三个管理员账号可以登录之后,分别登录三个管理员账号,分别对这三个管理员用户进行测试,查看是否具有该具有的权力,和别的权力的检测,查看别的权力是否可以执行。

3、完成第二步之后,再创建三个普通的用户,用三个管理员账户去分别对三个普通用户进行彼此权力的授权,查看三个普通用户是否可以执行所被授予的权力。

4、完成第三步之后,在配置文件中加入mandatory_role = (所创建的三种类型的角色),查看用root用户是否可以将这个三个角色删除(无法删除则成功)。

5、以上步骤均成功完成,则测试成功。

下面是测试环节:

数据库环境:基于MySQL 8.0.25

操作系统环境:Linux version 3.10.0-957.el7.x86_64 (mockbuild@x86-040.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Oct 4 20:48:51 UTC 2018

1、首先登录root用户,在root用户下创建三个系统管理员用户:

create role sys_role;(系统管理员)

create role safe_role;(安全管理员)

create role audit_role;(审计管理员)

2、分别对三个系统管理员做授权工作

(1)系统管理员sys_role
grant create,drop,alter on *.* to sys_role;

show grants for sys_role;
+———————————————–+
| Grants for sys@%                              |
+———————————————–+
| GRANT CREATE, DROP, ALTER ON *.* TO `sys`@`%` |
+———————————————–+

(2)安全管理员safe_role
grant create user on *.* to safe_role; 

show grants for safe_role;
+———————————————+
| Grants for safe_role@%                      |
+———————————————+
| GRANT CREATE USER ON *.* TO `safe_role`@`%` |
+———————————————+

(3)审计管理员audit_role
grant AUDIT_ADMIN on *.* to audit_role;

show grants for audit_role;
+—————————————–+
| Grants for audit@%                      |
+—————————————–+
| GRANT USAGE ON *.* TO `audit`@`%`       |
| GRANT AUDIT_ADMIN ON *.* TO `audit`@`%` |
+—————————————–+

3、创建三个用户分别对应三个role管理角色,并将其权限赋给三个用户,并操作三个用户,查看是否拥有对应的权限,和操作没有的权限是否报错。
(1)系统管理员用户sys
创建用户sys,并授予sys_role的权限
create user sys@’%’ identified by ‘123123’;

grant sys_role to sys@’%’;

使权限生效
SET DEFAULT ROLE ALL TO sys;

登录sys账号,进行权限的测试
use poc_test
show tables;
drop table tt1;
create table tt1(id int , name varchar(20));

insert into tt1 values(1,’zhangsan’);(报错)
ERROR 1142 (42000): INSERT command denied to user ‘sys’@’localhost’ for table ‘tt1’
select * from tt1;
ERROR 1142 (42000): SELECT command denied to user ‘sys’@’localhost’ for table ‘tt1’

测试此用户是否可以创建用户,并给其他用户授权
ERROR 1227 (42000): Access denied; you need (at least one of) the CREATE USER privilege(s) for this operation
提示并没有给其他用户授权的权限

因为测试,所以没有将所有的DDL权限赋给sys_role,只是将其中一部分权限给了sys_role。

最后测试成功,可以创建一个只拥有DDL权限的角色,并且可以将此角色的权限赋给用户,用户可以拥有sys_role的权限,但是不能将权限再给其他用户,保证了系统管理员角色的存在合理性。

(2)安全管理员
创建用户safe予safe_role的权限

在测试后发现,因给与安全管理员create user权限之后,safe用户拥有safe_role的权限,可以去数据库进行删除和创建的操作,所以这个权限对安全管理员的已经超出了其权限,所以将其收回权限,并重新赋予新的权限。

因为不能给与create user 权限,所以我想着,单独给safe_role去对mysql中的user表进行 create user 的权限

grant create user on mysql.user to safe_role;
ERROR 1144 (42000): Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used
报错,并提示非法授予

只能给与其select mysql.user的权限,和将此权限,赋权给其他的用户
show grants for safe_role;
+———————————————————————+
| Grants for safe_role@%                                              |
+———————————————————————+
| GRANT USAGE ON *.* TO `safe_role`@`%`                               |
| GRANT SELECT ON `mysql`.`user` TO `safe_role`@`%` WITH GRANT OPTION |
+———————————————————————+

用户safe的权限
show grants for safe;
+————————————-+
| Grants for safe@%                   |
+————————————-+
| GRANT USAGE ON *.* TO `safe`@`%`    |
| GRANT `safe_role`@`%` TO `safe`@`%` |
+————————————-+

登录到safe用户下之后,对其进行操作

show databases;
+——————–+
| Database           |
+——————–+
| information_schema |
| mysql              |
+——————–+

select user,host from user;
+——————+———–+
| user             | host      |
+——————+———–+
| audit_role       | %         |
| bridge           | %         |
| safe             | %         |
| safe_role        | %         |
| sys              | %         |
| sys_role         | %         |
| test             | %         |
| test1            | %         |
| test12           | %         |
| test123          | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+——————+———–+

只能做select的操作,无法对其进行别的操作。

所以安全管理员,暂时没有找到合适的操作对其进行授予权限,可以将一些查看类的权限赋予安全管理员,让其监督。

(3)审计管理员

4、分别对这三个管理员角色添加强制角色,查看root用户下是否无法删除这个三个角色,和撤销这个三个角色的相应权限后,是否是会话级别的撤销。

单独拿sys_role进行测试

首先在配置文件中添加变量

[mysqld]
mandatory_roles=’sys_role’

不单独设置数据库中的参数mandatory_roles

show variables like ‘%mandatory_roles’;
+—————–+———-+
| Variable_name   | Value    |
+—————–+———-+
| mandatory_roles | 
+—————–+———-+

重启,查看是否可以删除角色sys_role

drop role sys_role;

发现可以删除,由此可得出在配置文件中设置强制角色没有生效。

那我们单独设置数据库中的参数

SET PERSIST mandatory_roles = ‘sys_role’;

show variables like ‘%mandatory_roles’;
+—————–+———-+
| Variable_name   | Value    |
+—————–+———-+
| mandatory_roles | sys_role |
+—————–+———-+

现在再次测试强制角色sys_role是否可以删除

drop role sys_role;
ERROR 3628 (HY000): The role `sys_role`@`%` is a mandatory role and can’t be revoked or dropped. The restriction can be lifted by excluding the role identifier from the global variable mandatory_roles.

开始报错,无法删除sys_role,提示sys_role为强制角色,无法删除,需要在全局变量中来解除限制

接下来测试,收回sys_role的权限,测试是否能收回权限,并退出,重启,查看是否为会话级别的删除。

revoke create on *.* from sys_role;
提示撤销成功

那么我们去查看sys_role的权限,是否被撤销了

show grants for sys_role;
+——————————————–+
| Grants for sys_role@%                      |
+——————————————–+
| GRANT DROP, ALTER ON *.* TO `sys_role`@`%` |
+——————————————–+

权限被撤销

继续测试是否为会话级别的撤销

exit 退出当前的会话,并重新登录会话

 

再次检查权限sys_role的权限是否恢复

show grants for sys_role;
+——————————————–+
| Grants for sys_role@%                      |
+——————————————–+
| GRANT DROP, ALTER ON *.* TO `sys_role`@`%` |
+——————————————–+

发现并没有恢复

于是打算重启测试

kill掉进程之后,再次重新启动,并进入数据库,验证权限是否恢复。

show grants for sys_role;
+——————————————–+
| Grants for sys_role@%                      |
+——————————————–+
| GRANT DROP, ALTER ON *.* TO `sys_role`@`%` |
+——————————————–+

发现依旧没有恢复所撤销的权限。

5、综上所述,设置了强制角色,只是不能将强制角色删除,但是依旧可以对强制角色进行撤销权限,而且不需要在配置文件中声明强制角色,并不会生效,要在数据库中的全局变量来设置强制角色。

    原文作者:永远少年123
    原文地址: https://blog.csdn.net/weixin_44534229/article/details/120268014
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞