三权分立

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