【合理授权,安全第一】聊一聊Oracle数据库的用户权限

编辑手记:年底大家最关注数据安全,之前我们说过,数据库的风险分为外部风险和内部风险。外部风险无法预估但概率较小,平时发生最多的还是内部操作的风险,因此合理控制权限就非常重要。本文节选自《循序渐进Oracle》

正文

当一个员工被一个公司录用,要想进入公司通常你还需要得到授权,授权可能是一张ID卡或是一个工作证,当然在没有得到充分的信任之前,你能得到的权限可能还非常有限,在不断的工作和努力之后,你的权限可能会逐步提高,你可能可以翻阅公司的机密档案,还可能被授权打开公司的保险柜,然后你就可以……Ok,到这里打住,如果你不是一个间谍。

数据库的用户,情形和此类似,用户被创建并不意味着你就可以进入公司,在进入公司前你可能需要得到一些授权,在数据库中,这个权限是Create Session,这是进入数据库需要的最小权限。

继续前面的试验,如果以刚刚创建的用户登录就会收到一个错误提示:

这表示用户EYGLE缺少一个CREATE SESSION的权限。在将CREATE SESSION权限授予之后,用户就可以连接到数据库内部:

SQL> grant create session to eygle; 授权成功。 SQL> connect eygle/eygle 已连接。

好了进入公司内部了,可以随便看看了,我们可以翻翻字典,看看而已:

SQL> select count(*)from dict; COUNT(*) ---------- 628 SQL> select table_namefrom dict where rownum <6; TABLE_NAME ------------------------------ ALL_XML_SCHEMAS ALL_XML_SCHEMAS2 USER_RESOURCE_LIMITS USER_PASSWORD_LIMITS USER_CATALOG 已选择5行。

至于属于我自己的对象、表、视图等都还没有:

SQL> select count(*) from user_tables; COUNT(*) ---------- 0 SQL> select count(*) from user_views; COUNT(*) ---------- 0

如果此时试图创建数据表,则会收到权限不足的提示:

SQL> create table eygle (name varchar2(20)); create table eygle (name varchar2(20)) * 第 1 行出现错误: ORA-01031: 权限不足

此时又要去获得权限:

SQL> connect / as sysdba 已连接。 SQL> grant create table to eygle; 授权成功。

注意此时的权限还是不足够的,用户还没有获得空间授权:

SQL> connect eygle/eygle 已连接。 SQL> create table eygle (name varchar2(20)); create table eygle (name varchar2(20)) * 第 1 行出现错误: ORA-01950: 对表空间 'USERS' 无权限

需要继续授予用户使用USERS表空间的权限:

SQL> connect / as sysdba 已连接。 SQL> alter user eygle quota 10m on users; 用户已更改。 SQL> connect eygle/eygle 已连接。 SQL> create table eygle (name varchar2(20)); 表已创建。

终于数据表创建成功了。

回顾一下,如果用户需要连接数据库并创建数据表,那么需要获得至少两个授权:CREATE SESSION和CREATE TABLE。

Oracle的权限可以分为两类:

  • 系统权限,每个系统权限允许用户对Schema对象执行一种或一类特定的数据库操作,例如CREATE SESSION、CREATE TABLESPACE、CREATE TABLE都是系统权限。

数据库中有超过100种不同的系统权限,DBA_SYS_PRIVS可以查询授予用户的系统权限。

  • 对象权限,每个对象权限允许用户针对特定的对象执行一种特定的行为,例如对某个表的查询权限,如SELECT ON EYGLE就是对表EYGLE这个对象的查询权限。

常见的各类对象权限可以通过如下方式进行授予:

表权限:SELECT、DELETE、UPDATE、INSERT、ALTER

GRANT SELECT ON eygle TO scott;

视图权限:SELECT、DELTE、INSERT、UPDATE

GRANT SELECT ON v_eygle TO scott;

过程、函数、程序包权限:EXECUTE、DEBUG

GRANT EXECUTE ON dbms_sql TO scott;

GRANT和REVOKE是用来执行权限授予与回收的主要手段。

系统权限的授予情况可以通过Oracle的视图DBA_SYS_PRIVS来查询,这个视图包含被授予权限的用户信息(GRANTEE)以及具体的权限(PRIVILEGE)信息,如果授予权限时允许用户转授这个权限,那么ADMIN_OPTION就为YES:

可以看看此时EYGLE用户获得的权限:

进一步可以查询数据库中和TABLE有关的权限:

可以想象,如果数据库中存在大量用户,如果我们将这些权限一一授予这些用户,操作将会极其繁琐,于是Oracle设计了一个新的技术:角色(Role)。角色是一系列权限的集合,被授予某个角色的用户将获得这个集合中的所有权限,这大大简化了权限的授予和回收工作。

通常一个用户创建之后,我们授予用户两个角色就足够使用了,这两个角色是CONNECT和RESOURCE,接下来来看一下这两个角色是哪些权限的集合:

Oracle在10gR2中对角色权限进行了重新定义,Oracle9i/Oracle 10gR1中CONNECT角色具有更多的权限:

由于Oracle 10gR2之前,CONNECT角色的权限过多,比如CREATE DATABASE LINK、CREATE TABLE、CREATE VIEW等,都具有重要作用,可能并不需要授予特定用户,所以在后期版本中,这个角色的权限被缩减。

通常在权限授予时,应当遵守权限最小化原则,即仅授予用户完成工作所必须的权限,而且绝不过度授予权限。

现在回顾一下,为了创建一个可以访问数据库的用户,我们可能需要执行如下步骤:

注意到和前面测试的不同了么?此处不再需要对空间进行授权,因为在RESOURCE角色的授予过程中,Oracle潜在的给用户EYGLE分配了无限制使用默认表空间的权限(UNLIMITED TABLESPACE):

具备了这个权限,用户也就获得了在所有数据表空间上不限制空间使用的权限,现在用户EYGLE甚至可以将数据表建立到SYSTEM表空间:

这一权限是为了向后兼容保留的,如果被不当使用,则会对数据库造成严重影响。大家可能尝试过通过exp/imp进行数据迁移,迁移过程希望同时转换表空间,可是往往导入后发现,表空间并没有变化,这就是因为这个权限使得用户仍然能够将数据写入原来的表空间(很多时候就是SYSTEM表空间)。

如果为了更严谨的管理,可以回收用户的UNLIMITED TABLESPACE权限,然后对用户的空间限额进行单独授权:

此时独立的空间授权可以通过dba_ts_quotas查询得到,可以看到用户EYGLE在表空间USERS上的最大空间使用限额(MAX_BYTES)为-1,也就是无限制:

这样当用户再试图在其他表空间创建对象时,就会收到错误提示:

系统权限可以通过DBA_SYS_PRIVS视图查询,相应的,可以通过DBA_TAB_PRIVS来查询对象权限。

在数据库内部,不同用户的对象是彼此隔离的,通过授权才能使数据库内部相通,由于相通可能带来风险,所以应当严格控制权限的授予。

不同用户创建的对象,如表、视图等,通过授权可以将不同的访问权限转授给其他用户,实现跨用户对象的访问:

以上对TEST数据表进行了跨用户授权,有了查询权限之后,用户julia才能够访问eygle用户的数据表:

SQL> connect julia/julia 已连接。 SQL> select * from eygle.test; D - X

这里的查询TEST表的对象权限,可以通过字典表查询得到:

除了对象的所有者之外,具有系统权限GRANT ANY OBJECT PRIVILEGE或者WITH GRANT OPTION权限的用户也可以将对象权限进行跨用户授予:

注意以上使用SYS进行授权,显示的GRANTOR仍然是对象属主。

回收权限可以使用REVOKE命令进行:

SQL> revoke delete on eygle.test from julia; 撤销成功。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-01-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏搜云库

Mycat 读写分离 数据库分库分表 中间件 安装部署,及简单使用

MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可...

3808
来自专栏杨建荣的学习笔记

清理session的小插曲(二) (r6笔记第4天)

在上周巡检系统的时候发现session列表中显示有一个session的状态为“KILLED",当时没有太在意,等到周一回来做检查的时候,发现那个session的...

2706
来自专栏MySQL实战分享

MongoDB 第五期 : 托管 MongoDB 操作指南

本文从自动化部署工具的介绍开始,从四点介绍了MongoDB的部署流程,并从结构、采集部署配置、日报及数据库表结构介绍了MongoDB的监控,以及从策略、状态查询...

3633
来自专栏史上最简单的Spring Cloud教程

SpringBoot非官方教程 | 第七篇:springboot开启声明式事务

springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis...

2187
来自专栏杨建荣的学习笔记

通过shell脚本监控日志切换频率 (94天)

在数据库遇到性能问题的时候,可能从io,cpu等角度能够下手找到性能瓶颈,日志的切换也是影响性能的一个因素,如果日志切换台频繁,等待时间就会在日志相关的事件上,...

2808
来自专栏蓝天

大压力下Redis参数调整要点

最重要的原因之一Redis的主从复制,两者复制共享同一线程,虽然是异步复制的,但因为是单线程,所以也十分有限。如果主从间的网络延迟不是在0.05左右,比如达...

1247
来自专栏乐沙弥的世界

Oracle 基于用户管理恢复的处理

Oracle支持多种方式来管理数据文件的备份与恢复来保证数据库的可靠与完整。除了使用RMAN工具以及第三方备份与恢复工具之外,基于

432
来自专栏Hadoop数据仓库

HAWQ技术解析(六) —— 定义对象

        HAWQ本质上是一个数据库系统,所以这里所说的对象指的是数据库对象。和其它关系数据库类似,HAWQ中有数据库、表空间、表、视图、自定义数据类型、...

2775
来自专栏王硕

原 PostgreSQL基于时间点恢复(PITR)实验记录

3459
来自专栏杨建荣的学习笔记

MySQL和Oracle对比学习之事务(r5笔记第4天)

MySQL中的存储引擎很是丰富,常用的有InnoDB,MyISAM等,也查看了不少的资料,基本也有所了解,从一些参考书中看MySQL中的sql部分也是一扫而过,...

4208

扫码关注云+社区