暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库中的重要角色

原创 eygle 2019-09-23
1105

在上一节我们谈到角色,角色是为了授权方便建立的权限集合,而一旦这个集合的权限超过了用户的最低需要,就可能带来数据库的安全风险。所以应当清楚的了解数据库中重要角色所具备的权限。


在数据库内部,用户和角色信息都存储在USER$表中,其中的TYPE字段用于标识类型,0位绝色,1为用户:


  type#         number not null,                       /* 0 = role, 1 = user */


通过视图DBA_ROLES可以查询数据库中定义的角色:


SQL> set autotrace on
SQL> select * from dba_roles;
 
ROLE                           PASSWORD
------------------------------ --------
CONNECT                        NO
RESOURCE                       NO
DBA                            NO
SELECT_CATALOG_ROLE            NO
EXECUTE_CATALOG_ROLE           NO
DELETE_CATALOG_ROLE            NO
EXP_FULL_DATABASE              NO
IMP_FULL_DATABASE              NO
RECOVERY_CATALOG_OWNER         NO
GATHER_SYSTEM_STATISTICS       NO
LOGSTDBY_ADMINISTRATOR         NO
AQ_ADMINISTRATOR_ROLE          NO
AQ_USER_ROLE                   NO
GLOBAL_AQ_USER_ROLE            GLOBAL
SCHEDULER_ADMIN                NO
HS_ADMIN_ROLE                  NO
OEM_ADVISOR                    NO
OEM_MONITOR                    NO
WM_ADMIN_ROLE                  NO
MGMT_USER                      NO
 
20 rows selected.


查询显示Oracle 10gR2的数据库中,包含20个角色,下面显示了SQL的执行计划,数据查询来自USER$:


 

Execution Plan
----------------------------------------------------------
Plan hash value: 4163253942
 
---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |    21 |   483 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| USER$ |    21 |   483 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter("TYPE#"=0 AND "NAME"<>'PUBLIC' AND "NAME"<>'_NEXT_USER')


注意查询的谓词信息,查询过滤了TYPE#=0和"NAME"<>'PUBLIC' AND "NAME"<>'_NEXT_USER'。这是视图中的特殊处理。从$ORACLE_HOME/rdbms/admin/ catalog.sql中可以获得DBA_ROLES创建的全部语句和过程:


create or replace view DBA_ROLES (ROLE, PASSWORD_REQUIRED)
as
select name, decode(password, null, 'NO', 'EXTERNAL', 'EXTERNAL',
                      'GLOBAL', 'GLOBAL', 'YES')
from  user$
where type# = 0 and name not in ('PUBLIC', '_NEXT_USER')
/


那么也就可以知道数据库中存在两个特殊的用户角色对象:


SQL> select name from user$ where type#=0
  2  minus
  3  select role from dba_roles;
NAME
------------------------------
PUBLIC
_NEXT_USER


在Oracle 10gR2中CONNECT、RESOURCE两个角色的权限已经非常精简,可以通过查询ROLE_SYS_PRIVS视图获得角色具有的系统权限:


SQL> SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE='CONNECT';
ROLE                           PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
CONNECT                        CREATE SESSION                           NO
 
SQL> SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE='RESOURCE';
ROLE                           PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
RESOURCE                       CREATE TRIGGER                           NO
RESOURCE                       CREATE SEQUENCE                          NO
RESOURCE                       CREATE TYPE                              NO
RESOURCE                       CREATE PROCEDURE                         NO
RESOURCE                       CREATE CLUSTER                           NO
RESOURCE                       CREATE OPERATOR                          NO
RESOURCE                       CREATE INDEXTYPE                         NO
RESOURCE                       CREATE TABLE                             NO


在开发环境中,通常我们建议用户创建自己的角色来管理权限集合,以最小化原则来进行权限分配。


对于角色的授予情况,可以通过DBA_ROLE_PRIVS视图来查询,例如如下查询可以找出那些具有DBA角色的用户:


SQL> select * from dba_role_privs where granted_role='DBA';
GRANTEE                        GRANTED_ROLE                   ADM DEF
------------------------------ ------------------------------ --- ---
SMS8888                        DBA                            NO  YES
SYS                            DBA                            YES YES
SYSMAN                         DBA                            NO  YES
SMSSINA                        DBA                            NO  YES
SMS9999                        DBA                            NO  YES
EYGLE                          DBA                            NO  YES


对应于系统权限、对象权限、角色权限,相对应有DBA_SYS_PRIVS、DBA_TAB_PRIVS、DBA_ROLE_PRIVS提供常规查询,这是三个重要的视图,可以类比进行记忆。

最后修改时间:2019-09-23 17:01:58
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论