博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实验:体会Oracle权限/角色赋予的差异
阅读量:7287 次
发布时间:2019-06-30

本文共 8237 字,大约阅读时间需要 27 分钟。

环境:Oracle 11.2.0.4

目的:验证业务用户的权限/角色赋予的差异

现在创建两个用户jingyu2和jingyu3;

SYS@jyzhao1> create user jingyu2 identified by jingyu2 DEFAULT tablespace tbs_jingyu;SYS@jyzhao1> create user jingyu3 identified by jingyu3 DEFAULT tablespace tbs_jingyu;SYS@jyzhao1> grant connect, resource to jingyu2, jingyu3;

模拟jingyu2用户下有一张表T_jingyu2;jingyu3用户下有一张表T_jingyu3;

JINGYU2@jyzhao1> create table t_jingyu2 as select * from user_objects;Table created.JINGYU3@jyzhao1> create table t_jingyu3 as select * from user_objects;Table created.

分别在两个用户的session下查询被赋予的角色/权限:

JINGYU2@jyzhao1>select * from session_privs;PRIVILEGE----------------------------------------CREATE SESSIONUNLIMITED TABLESPACECREATE TABLECREATE CLUSTERCREATE SEQUENCECREATE PROCEDURECREATE TRIGGERCREATE TYPECREATE OPERATORCREATE INDEXTYPE10 rows selected.JINGYU2@jyzhao1>select * from session_roles;ROLE------------------------------CONNECTRESOURCE

JINGYU3用户的会话权限和会话角色查询结果一致,输出略。

可以看到赋予connect,resource这两个最常被用于应用开发的角色之后,该用户具有上述10个权限,一般基础开发就够用了。

需求: jingyu2用户访问jingyu3的表jingyu3,并创建同义词jingyu3;

显然当前的这个需求,对于目前的角色/权限是不能满足需求的:

JINGYU2@jyzhao1>select count(1) from jingyu3.t_jingyu3;select count(1) from jingyu3.t_jingyu3                             *ERROR at line 1:ORA-00942: table or view does not existJINGYU2@jyzhao1>create synonym t_jingyu3 for jingyu3.t_jingyu3;create synonym t_jingyu3 for jingyu3.t_jingyu3*ERROR at line 1:ORA-01031: insufficient privileges

一是jingyu2用户不能访问其他用户jingyu3的表,二是jingyu2用户没有创建同义词的权限。

那么为了满足需求,考虑如何解决。

解决方案一:赋予缺少的权限(推荐使用)。

方案宗旨:根据业务需求,缺什么权限赋予什么权限,精确控制。

赋予缺少的权限:

JINGYU3@jyzhao1> grant select on t_jingyu3 to jingyu2;Grant succeeded.SYS@jyzhao1>grant create synonym to jingyu2;Grant succeeded.

此时赋予完权限后再次尝试,发现已经可以正常满足需求。

JINGYU2@jyzhao1>select count(1) from jingyu3.t_jingyu3;  COUNT(1)----------         1JINGYU2@jyzhao1>create synonym t_jingyu3 for jingyu3.t_jingyu3;Synonym created.JINGYU2@jyzhao1>select count(1) from t_jingyu3;     COUNT(1)----------         1

查看此时的session权限/角色:

JINGYU2@jyzhao1>select * from session_privs;PRIVILEGE----------------------------------------CREATE SESSIONUNLIMITED TABLESPACECREATE TABLECREATE CLUSTERCREATE SYNONYMCREATE SEQUENCECREATE PROCEDURECREATE TRIGGERCREATE TYPECREATE OPERATORCREATE INDEXTYPE11 rows selected.JINGYU2@jyzhao1>select * from session_roles;ROLE------------------------------CONNECTRESOURCE

发现用户会话权限只多了一个CREATE SYNONYM权限,没有增加额外的风险。

解决方案二:赋予dba角色(不推荐)。

方案宗旨:为了操作简便,直接统一赋予DBA角色,满足一切应用潜在权限要求。

实际在很多应用场景中,尤其是开发测试环境,DBA或是开发人员往往会为了方便直接赋予高权限的dba角色,避免麻烦。当然这是不推荐的方法。

但也是一种解决方案,下面是演示实验,且在过程中还发现了一些有意思的细节。

首先回收方案一的权限赋予:

SYS@jyzhao1>revoke create synonym from jingyu2;Revoke succeeded.JINGYU3@jyzhao1>revoke select on t_jingyu3 from jingyu2;Revoke succeeded.

这样又恢复了初始环境.

然后我们尝试直接赋予jingyu2用户高大上的dba角色,理应一切ok了吧。

SYS@jyzhao1>grant dba to jingyu2;Grant succeeded.

结果让人大跌眼镜,不可以!

JINGYU2@jyzhao1>select count(1) from jingyu3.t_jingyu3;select count(1) from jingyu3.t_jingyu3                             *ERROR at line 1:ORA-00942: table or view does not existJINGYU2@jyzhao1>create synonym t_jingyu3 for jingyu3.t_jingyu3;create synonym t_jingyu3 for jingyu3.t_jingyu3*ERROR at line 1:ORA-01031: insufficient privileges

至高无上的dba权限居然解决不了跨用户访问和创建同义词?

没搞错吧?
看到这里,你是怎么想的呢?

如果这时候你去尝试重新连接一个会话,会发现是可以成功实现需求的?

那么这样看来,oracle对于权限的赋予是立即生效的,但是角色却需要重新连接会话才会生效。
到这里还不甘心?
来看看旧的会话权限:

JINGYU2@jyzhao1>select * from session_roles;ROLE------------------------------CONNECTRESOURCE

发现的确没有变化,那么有没有命令可以让旧的会话不重新连接就能够生效呢?

答案是肯定的,来看看 set role all 这条命令吧,可以在历史会话中执行,从而使得新赋予的角色生效。

JINGYU2@jyzhao1>set role all;Role set.JINGYU2@jyzhao1>select * from session_roles;ROLE------------------------------CONNECTRESOURCEDBASELECT_CATALOG_ROLEHS_ADMIN_SELECT_ROLEEXECUTE_CATALOG_ROLEHS_ADMIN_EXECUTE_ROLEDELETE_CATALOG_ROLEEXP_FULL_DATABASEIMP_FULL_DATABASEDATAPUMP_EXP_FULL_DATABASEDATAPUMP_IMP_FULL_DATABASEGATHER_SYSTEM_STATISTICSSCHEDULER_ADMINWM_ADMIN_ROLEJAVA_ADMINJAVA_DEPLOYXDBADMINXDB_SET_INVOKEROLAP_XS_ADMINOLAP_DBA21 rows selected.

另外,可以看到只赋予了DBA的角色,却额外包含了很多角色,如果此时查下权限会发现:

JINGYU2@jyzhao1>select * from session_privs;PRIVILEGE----------------------------------------ALTER SYSTEMAUDIT SYSTEMCREATE SESSIONALTER SESSIONRESTRICTED SESSIONCREATE TABLESPACEALTER TABLESPACEMANAGE TABLESPACEDROP TABLESPACEUNLIMITED TABLESPACECREATE USERBECOME USERALTER USERDROP USERCREATE ROLLBACK SEGMENTALTER ROLLBACK SEGMENTDROP ROLLBACK SEGMENTCREATE TABLECREATE ANY TABLEALTER ANY TABLEBACKUP ANY TABLEDROP ANY TABLELOCK ANY TABLECOMMENT ANY TABLESELECT ANY TABLEINSERT ANY TABLEUPDATE ANY TABLEDELETE ANY TABLECREATE CLUSTERCREATE ANY CLUSTERALTER ANY CLUSTERDROP ANY CLUSTERCREATE ANY INDEXALTER ANY INDEXDROP ANY INDEXCREATE SYNONYMCREATE ANY SYNONYMDROP ANY SYNONYMCREATE PUBLIC SYNONYMDROP PUBLIC SYNONYMCREATE VIEWCREATE ANY VIEWDROP ANY VIEWCREATE SEQUENCECREATE ANY SEQUENCEALTER ANY SEQUENCEDROP ANY SEQUENCEPRIVILEGE----------------------------------------SELECT ANY SEQUENCECREATE DATABASE LINKCREATE PUBLIC DATABASE LINKDROP PUBLIC DATABASE LINKCREATE ROLEDROP ANY ROLEGRANT ANY ROLEALTER ANY ROLEAUDIT ANYALTER DATABASEFORCE TRANSACTIONFORCE ANY TRANSACTIONCREATE PROCEDURECREATE ANY PROCEDUREALTER ANY PROCEDUREDROP ANY PROCEDUREEXECUTE ANY PROCEDURECREATE TRIGGERCREATE ANY TRIGGERALTER ANY TRIGGERDROP ANY TRIGGERCREATE PROFILEALTER PROFILEDROP PROFILEALTER RESOURCE COSTANALYZE ANYGRANT ANY PRIVILEGECREATE MATERIALIZED VIEWCREATE ANY MATERIALIZED VIEWALTER ANY MATERIALIZED VIEWDROP ANY MATERIALIZED VIEWCREATE ANY DIRECTORYDROP ANY DIRECTORYCREATE TYPECREATE ANY TYPEALTER ANY TYPEDROP ANY TYPEEXECUTE ANY TYPEUNDER ANY TYPECREATE LIBRARYCREATE ANY LIBRARYALTER ANY LIBRARYDROP ANY LIBRARYEXECUTE ANY LIBRARYCREATE OPERATORCREATE ANY OPERATORALTER ANY OPERATORPRIVILEGE----------------------------------------DROP ANY OPERATOREXECUTE ANY OPERATORCREATE INDEXTYPECREATE ANY INDEXTYPEALTER ANY INDEXTYPEDROP ANY INDEXTYPEUNDER ANY VIEWQUERY REWRITEGLOBAL QUERY REWRITEEXECUTE ANY INDEXTYPEUNDER ANY TABLECREATE DIMENSIONCREATE ANY DIMENSIONALTER ANY DIMENSIONDROP ANY DIMENSIONMANAGE ANY QUEUEENQUEUE ANY QUEUEDEQUEUE ANY QUEUECREATE ANY CONTEXTDROP ANY CONTEXTCREATE ANY OUTLINEALTER ANY OUTLINEDROP ANY OUTLINEADMINISTER RESOURCE MANAGERADMINISTER DATABASE TRIGGERMERGE ANY VIEWON COMMIT REFRESHRESUMABLESELECT ANY DICTIONARYDEBUG CONNECT SESSIONDEBUG ANY PROCEDUREFLASHBACK ANY TABLEGRANT ANY OBJECT PRIVILEGECREATE EVALUATION CONTEXTCREATE ANY EVALUATION CONTEXTALTER ANY EVALUATION CONTEXTDROP ANY EVALUATION CONTEXTEXECUTE ANY EVALUATION CONTEXTCREATE RULE SETCREATE ANY RULE SETALTER ANY RULE SETDROP ANY RULE SETEXECUTE ANY RULE SETEXPORT FULL DATABASEIMPORT FULL DATABASECREATE RULECREATE ANY RULEPRIVILEGE----------------------------------------ALTER ANY RULEDROP ANY RULEEXECUTE ANY RULEANALYZE ANY DICTIONARYADVISORCREATE JOBCREATE ANY JOBEXECUTE ANY PROGRAMEXECUTE ANY CLASSMANAGE SCHEDULERSELECT ANY TRANSACTIONDROP ANY SQL PROFILEALTER ANY SQL PROFILEADMINISTER SQL TUNING SETADMINISTER ANY SQL TUNING SETCREATE ANY SQL PROFILEMANAGE FILE GROUPMANAGE ANY FILE GROUPREAD ANY FILE GROUPCHANGE NOTIFICATIONCREATE EXTERNAL JOBCREATE ANY EDITIONDROP ANY EDITIONALTER ANY EDITIONCREATE ASSEMBLYCREATE ANY ASSEMBLYALTER ANY ASSEMBLYDROP ANY ASSEMBLYEXECUTE ANY ASSEMBLYEXECUTE ASSEMBLYCREATE MINING MODELCREATE ANY MINING MODELDROP ANY MINING MODELSELECT ANY MINING MODELALTER ANY MINING MODELCOMMENT ANY MINING MODELCREATE CUBE DIMENSIONALTER ANY CUBE DIMENSIONCREATE ANY CUBE DIMENSIONDELETE ANY CUBE DIMENSIONDROP ANY CUBE DIMENSIONINSERT ANY CUBE DIMENSIONSELECT ANY CUBE DIMENSIONCREATE CUBEALTER ANY CUBECREATE ANY CUBEDROP ANY CUBEPRIVILEGE----------------------------------------SELECT ANY CUBEUPDATE ANY CUBECREATE MEASURE FOLDERCREATE ANY MEASURE FOLDERDELETE ANY MEASURE FOLDERDROP ANY MEASURE FOLDERINSERT ANY MEASURE FOLDERCREATE CUBE BUILD PROCESSCREATE ANY CUBE BUILD PROCESSDROP ANY CUBE BUILD PROCESSUPDATE ANY CUBE BUILD PROCESSUPDATE ANY CUBE DIMENSIONADMINISTER SQL MANAGEMENT OBJECTFLASHBACK ARCHIVE ADMINISTER202 rows selected.

很可怕吧,赋予DBA角色后居然让会话的权限从原来的10个变成了202个,这也是为什么不建议赋予DBA角色的原因。因为这对于数据库来说,普通应用用户的权限这么高,安全隐患太大了。

总结:

  • 1.赋予权限时,无论是是否是之前连接的会话,都立即生效;赋予角色时,新连接会话生效,历史连接会话如果无法重新连接,就需要使用set role all才可以生效。
  • 2.对于数据库的应用用户而言,建议最好可以严格控制角色/权限。
    一般来说,对于应用而言,connect和resource角色已经可以满足大部分应用开发的需求,若有其他特殊需求,建议单独授予,强烈不建议直接赋予具有N多权限的DBA角色。

转载地址:http://kopjm.baihongyu.com/

你可能感兴趣的文章
在iOS上实现一个简单的日历控件
查看>>
Android——Type mismatch类型转换错误的根源
查看>>
4.Utm详细实现-用户资源管理
查看>>
CentOS7.3安装Python3.6
查看>>
怎么才能用ABBYY FineReader提高工作效率
查看>>
STORM 落入MONGO速度优化
查看>>
python:守护进程deamon
查看>>
coding项目怎样和其他人共享
查看>>
Android wifi 设置相关
查看>>
vue中一个关于input元素的小坑
查看>>
oracle避免约束带来的导入数据解决方案
查看>>
多行文本字段运行时展示成单行文本
查看>>
sharepoint 禁用使用资源管理器打开
查看>>
jquery iframe弹出多选框
查看>>
记某个客户不能通过HTTPS访问在AWS部署站点的问题
查看>>
[Voice Tips 2] IPHONE
查看>>
Ubuntu Server版安装Gnome图形桌面
查看>>
360抢夺“度娘”?
查看>>
我的友情链接
查看>>
firewall-cmd防火墙概述
查看>>