角色
📄字数 3.4K
👁️阅读量 加载中...
数据库角色是一组预定义的权限集合,简化了权限管理流程,实现权限的批量分配和统一控制。通过角色管理,数据库管理员可以高效地管理用户权限,避免为每个用户单独设置权限的繁琐操作。
一、角色介绍
1.1 角色与用户关系
- 授予角色权限:当用户被授予某个角色时,将自动获得该角色拥有的所有权限,单个角色可以授予给多个用户,单个用户可以拥有多个角色权限。这种授权方式实现了权限的集中管理和批量分配。
- 回收角色权限:当角色从用户处被收回时,用户将立即失去该角色所拥有的所有权限,仅影响被回收角色的相应权限,权限相关内容可查看 权限管理。
注意
角色管理操作需对应权限:CREATE ROLE(创建角色权限)、ALTER ROLE(授予、回收角色权限)、DROP ROLE(删除角色权限)。
1.2 角色分类
数据角色分为内置角色和用户自定义角色,其中内置角色有:DB_ADMIN、DB_POLICY_ADMIN、DB_POLICY_OPER、DB_AUDIT_ADMIN、DB_AUDIT_OPER、PUBLIC。
1.3 角色管理
- 数据库内置角色管理方式:
- DB_ADMIN:数据库管理员角色,拥有 SYSDBA 所有权限但无 DBO 权限。
- DB_POLICY_ADMIN:数据库安全管理员角色,拥有 SYSSSO 所有权限。
- DB_POLICY_OPER:数据库安全员角色,拥有对主体或客体定义、应用、删除安全策略权限。
- DB_AUDIT_ADMIN:数据库审计管理员角色,拥有 SYSAUDITOR 所有权限。
- DB_AUDIT_OPER:数据库审计员角色,拥有审计设置权限。
- PUBLIC:普通角色,未授予任何权限。
注意
- 数据库内置角色只允许授予用户不允许对其进行修改删除。
- DB_ADMIN 角色只能由拥有 DBO 权限的用户授予,只有 SYSDBA 拥有 DBO 权限(DBO 比 DBA 多一个对 DBA 权限用户的收授权),DB_POLICY_ADMIN 和 DB_POLICY_OPER 角色只能由拥有 SSO 权限的用户授予,DB_AUDIT_ADMIN 和 DB_AUDIT_OPER 角色只能由拥有 AUDITOR权限的用户授予。
- 保留无权限的 PUBLIC 角色是因为默认"零权限"比默认"有权限"更安全且显式授权比隐式授权更为可控。
- 在数据库权限设计中,DBA、SSO 和 AUDITOR 三种权限被定义为互斥权限集,任何用户或角色最多只能拥有其中一种权限(DBA、SSO 或 AUDITOR)。
- 自定义角色管理:
- 需要具有相应权限的用户手动创建和维护
- 支持完整的生命周期管理:
- 创建角色
- 为角色分配权限,授权相关内容可查看 权限管理
- 将角色授予用户
- 从用户回收角色
- 删除角色
二、创建角色
使用创建角色语法可为数据库创建一个角色,创建的角色初始并未有任何权限,用户可根据权限管理语法为角色添加相应权限,后续将角色分配给用户。
2.1 语法格式
2.2 参数说明
role_name
:要创建的角色名。对象命名需严格遵循数据库对象命名规则。[INIT | INITIALLY] USER user_list
:- 该参数用于在创建角色时指定初始授权的用户组;
user_list
表示一个或多个数据库用户名,多个用户名必须使用英文逗号分隔;- 其中
INIT
为INITIALLY
的简写方式和INITIALLY
作用一致,方便用户使用。
2.3 示例
- 创建角色
role_test1
并授予用户usr_test1
和用户usr_test2
sql
SQL> CREATE USER usr_test1 IDENTIFIED BY '1234#abcd';
SQL> CREATE USER usr_test2 IDENTIFIED BY '1234#abcd';
SQL> CREATE ROLE role_test1 INIT USER usr_test1,usr_test2;
SQL> SELECT user_name,is_role FROM dba_users WHERE user_name='ROLE_TEST1';
+-----------+---------+
| USER_NAME | IS_ROLE |
+-----------+---------+
| ROLE_TEST1 | T |
+-----------+---------+
-- 通过系统视图验证角色是否成功授予用户
SQL> SELECT du.user_name,dr.user_name AS role_name FROM dba_role_members rmem JOIN dba_users du
ON rmem.db_id = du.db_id AND rmem.user_id = du.user_id JOIN dba_roles dr ON rmem.role_id = dr.user_id WHERE du.user_name IN ('USR_TEST1', 'USR_TEST2');
+-----------+------------+
| USER_NAME | ROLE_NAME |
+-----------+------------+
| USR_TEST1 | ROLE_TEST1 |
| USR_TEST2 | ROLE_TEST1 |
+-----------+------------+
注意
在数据库设计中,角色和用户被存储在同一张堆表中,通过is_role字段来区分记录是角色还是用户。当需要查询角色信息时,可以通过系统提供的 dba_roles 系统视图来获取角色相关的数据。
三、授予角色
使用授予角色语法可将数据库角色授予指定用户,角色添加的相应权限也会同时授予用户。
注意
创建角色时直接指定成员用户 user_list
与先创建角色再单独授予用户角色权限的最终效果等价,区别仅在于操作时机:
- 直接指定成员:适用于用户已存在时快速关联
- 单独授权:适用于角色创建后新增用户的情况
3.1 语法格式
3.2 参数说明
role_name
:要授予的角色名。当前角色必须是数据库中已经存在的角色,如果指定角色不存在,数据库会抛出相应错误。user_list
:该参数用于指定授权角色的用户组。接受一个或多个数据库用户名,多个用户名必须使用英文逗号分隔。
3.3 示例
将已创建的角色role_test1
授予用户usr_test3
。
sql
SQL> CREATE USER usr_test3 IDENTIFIED BY '1234#abcd';
SQL> GRANT ROLE role_test1 TO usr_test3;
--通过系统视图验证角色是否成功授予用户
SQL> SELECT du.user_name,dr.user_name AS role_name FROM dba_role_members rmem JOIN dba_users du
ON rmem.db_id = du.db_id AND rmem.user_id = du.user_id JOIN dba_roles dr ON rmem.role_id = dr.user_id WHERE du.user_name='USR_TEST3';
+-----------+------------+
| USER_NAME | ROLE_NAME |
+-----------+------------+
| USR_TEST3 | ROLE_TEST1 |
+-----------+------------+
四、回收角色
使用回收角色语法可从数据库用户收回指定角色,该角色关联的所有权限将同步从用户权限集中移除。
4.1 语法格式
4.2 参数说明
role_name
:要收回的角色名。user_list
:该参数用于指定回收角色的用户组。接受一个或多个数据库用户名。收回用户角色的前提是这些用户已经拥有了该角色,否则会报错。
注意
指定角色必须是数据库中已经存在的角色,如果指定角色不存在,数据库会抛出相应错误,删除角色操作也遵循当前规则。
4.3 示例
收回用户usr_test1
和用户usr_test2
的角色role_test1
并通过系统视图验证角色是否回收成功
sql
SQL> REVOKE ROLE role_test1 FROM usr_test1,usr_test2;
SQL> SELECT du.user_name,dr.user_name AS role_name FROM dba_role_members rmem JOIN dba_users du
ON rmem.db_id = du.db_id AND rmem.user_id = du.user_id JOIN dba_roles dr ON rmem.role_id = dr.user_id WHERE du.user_name IN ('USR_TEST1', 'USR_TEST2');
+-----------+-----------+
| USER_NAME | ROLE_NAME |
+-----------+-----------+
+-----------+-----------+
五、删除角色
使用删除角色语句可将角色对象从数据库中删除,该角色被删除后,角色关联的所有权限将同步从用户权限集中移除。
5.1 语法格式
5.2 参数说明
role_name
:要删除的角色名。
5.3 示例
删除指定的角色。
sql
SQL> DROP ROLE role_test1;
-- 通过系统视图验证角色是否删除成功
SQL> SELECT user_name,is_role FROM dba_users WHERE user_name='ROLE_TEST1';
+-----------+---------+
| USER_NAME | IS_ROLE |
+-----------+---------+
+-----------+---------+