Oracle12.2 多租户环境下的授权管理

题记:在多租户环境中,权限可以全局授予整个CDB,一个应用容器数据库(application container),或者单个的PDB。在多租户环境下,往往牵一发而动全身,因此合理授权就显得格外重要。通过本文我们首先来认识多租户中的全局授权和本地授权。

概述

在多租户环境下,common user和local user之间可以互相授权。他们本身的权限既不属于公共权限也不属于本地权限。那么他们的权限如何起作用,这取决于权限是被全局授予还是本地授予的。

关于公用用户common user和本地用户local user的内容,请查看:

Oracle 12c多租户特性详解:全局用户与本地用户的原理与维护

权限生效满足以下规则:

全局授予的权限

1、被全局授予的权限能够应用于现有和将来创建的container中。

2、只有common 用户才能被授予公共权限,并且需要授权者也是common用户。

3、common 用户可以给另一个common 用户或者common 角色进行授权。

4、在进行授权的时候,授权者必须连接到root 容器,并且在授权语句中指定 CONTAINER=ALL。

5、系统权限和对象权限都可以被全局授予。

6、当一个common用户连接或者转换到现有的一个容器中时,该用户的权限除了受到当前被授予权限的限制,还受到所在容器具有的权限的限制。

7、避免全局地授予public权限。

本地授予的权限

1、本地授予的权限只能在当前的container中起作用,哪怕是对于root 容器,如果权限被本地授予,只能在root中起作用。

2、common 用户和local 用户都可以进行本地授权。

3、授权者必须连接到某一个container中,并在授权语句中指定CONTAINER=CURRENT。

4、common用户和local用户都可以对common或local的角色授予权限。

5、任何用户都可以对其他的用户、角色(包含public角色)进行本地授权。

全局授予系统权限

用户只能在被授权的PDB内使用对应的系统权限。例如,如果用户A在PDB B中被授予某种权限,该权限只有当用户A连接到PDB B中时才会生效。

在满足下列条件的情况下,系统权限可以被root及所有现有的和新创建的PDB中生效:

1、授权者属于common 用户,而被授权者是common用户、common角色或者public 角色,不要全局地对public角色授予系统权限,这会影响到所有能访问到的用户。

2、系统权限的授予者在进行全局授权的时候包含了ADMIN OPTION的选项。

3、在授权语句中包含了CONTAINER=ALL 的选项。

下面的例子显示了如何全局授权给公用用户c##hr_admin。

CONNECT SYSTEM 
Enter password: password Connected.

GRANT CREATE ANY TABLE TO c##hr_admin CONTAINER=ALL;

全局授予对象权限

公共对象上的对象权限对该对象以及此对象上的所有关联链接生效。如果满足下面的一些要求,这些链接包括所有元数据链接,数据链接(以前称为对象链接)或与其相关联的扩展数据链接(属于该容器的所有PDB(包括新创建的PDB))。

1、对象特权授予者是公用用户,而被授权者是公用用户,公用角色或PUBLIC角色。

2、对象特权授权者拥有全局授予的GRANT权限。

3、GRANT语句包含CONTAINER = ALL子句。

以下示例显示如何向公用用户c## hr_admin授予对象特权,以便他可以从CDB根目录中的任何与之相关联的PDB中的DBA_PDBS视图进行select查询。

CONNECT SYSTEM
Enter password: password Connected.

GRANT SELECT ON DBA_OBJECTS TO c##hr_admin 
CONTAINER=ALL;

授予或回收PDB的访问权限

可以在多租户环境中授予和撤销PDB访问权限。

要在多租户环境中授予权限,应该在GRANT或REVOKE语句中包含CONTAINER子句。

将CONTAINER设置为ALL,将特权应用于所有现有和新创建的容器; 将其设置为CURRENT仅将权限应用于本地容器。 省略CONTAINER子句将特权应用于本地容器。 如果从root发出GRANT语句,并忽略CONTAINER子句,则该特权将在本地PDB应用。

下面的语句是如何通用授予公用用户c## hr_admin的CREATE TABLE权限,以便此用户可以在所有现有和新创建的容器中使用此权限。

CONNECT SYSTEM
Enter password: password Connected.

GRANT CREATE TABLE TO c##hr_admin CONTAINER=ALL;

启用公用用户查看CONTAINER_DATA对象信息

公用用户可以查看root中的CONTAINER_DATA对象或特定PDB中的数据。

连接到root时查看有关root,CDB和PDB的数据

当公用用户执行查询时,可以限制X $表和V $,GV $和CDB_ *视图的视图信息。X$表和这些视图包含有关应用程序root及其关联应用程序PDB的信息,或者如果连接到CDB root,则是整个CDB。

当不想全局其他PDB的敏感信息时,限制此信息很有用。 要启用此功能,Oracle数据库将这些表和视图提供为容器数据对象。 可以通过查询USER_ | DBA_ | ALL_VIEWS | TABLES字典视图的TABLE_NAME,VIEW_NAME和CONTAINER_DATA列来查找特定表或视图是否为容器数据对象。

要查找有关默认(用户级别)和特定于对象的CONTAINER_DATA属性的信息,请查询CDB_CONTAINER_DATA数据字典视图。

例如:

启用公用用户查看指定PDB的信息

可以通过调整用户的CONTAINER_DATA属性来启用公用用户访问与特定PDB相关的数据。(要使公用用户能够访问有关特定PDB的数据,请在root中发出ALTER USER语句。)

以下示例显示如何发出ALTER USER语句以启用通用用户c##hr_admin在V $ SESSION视图中查看与CDB $ ROOT,SALES_PDB和HRPDB容器相关的信息(假设此用户可以查询该视图)。

CONNECT SYSTEM
Enter password: password Connected.

ALTER USER c##hr_admin
SET CONTAINER_DATA = (CDB$ROOT, SALESPDB, HRPDB) 
FOR V$SESSION CONTAINER=CURRENT;

在上面的示例中:

  • SET CONTAINER_DATA列出容器,有关用户可以访问的数据。
  • FOR V$SESSION指定CONTAINER_DATA动态视图,公用用户c## hr_admin将可以做select查询。
  • 必须指定CONTAINER = CURRENT,因为当连接到根时,CONTAINER = ALL是ALTER USER语句的默认值,但CONTAINER_DATA属性的修改必须限制为root。

如果要启用用户c##hr_admin来查看与该用户可访问的所有CONTAINER_DATA对象中的CDB$ROOT,SALES_PDB,HR_PDB容器相关的信息,请忽略FOR V$SESSION。 例如:

ALTER USER c##hr_admin
SET CONTAINER_DATA = (CDB$ROOT, SALESPDB, HRPDB) 
CONTAINER=CURRENT;

关于多租户的权限控制:

【动手实践】:Lockdown Profile 的多租户权限控制

数据库的权限安全管理:

【安全为王】听说你最喜欢给所有用户授DBA的权限

数据库权限管理:

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

关注数据和云微信公众号,获取持续精彩分享。

----本文来自Oracle官方文档翻译。

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

原文发表时间:2017-04-14

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Porschev[钟慰]的专栏

MySQL数据同步【双主热备】

应用环境 数据库服务器  虚拟机  OS:  Windows Server 2003  1.数据库服务器242 IP:192.168.206.242   2...

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

使用句柄实现特定场景的无备份恢复 (r3笔记第61天)

在dba的工作中,备份是一切工作的基础。如果没有备份,本来很简单的恢复工作也会难上加难,如果业务数据要求很高,造成数据的丢失或者损坏,就是重大事故了。 使用rm...

3337
来自专栏乐沙弥的世界

Oracle 数据库实例启动关闭过程

Oracle数据库实例的启动,严格来说应该是实例的启动,数据库仅仅是在实例启动后进行装载。Oracle数据启动的过程被划分为

744
来自专栏散尽浮华

mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

在mysql工作中接触最多的就是mysql replication,mysql在复制方面还是会有一些常规问题,比如主库宕机或者从库宕机有可能会导致复制中断,通常...

31310
来自专栏乐沙弥的世界

MySQL 二进制日志(Binary Log)

    同大多数关系型数据库一样,日志文件是MySQL数据库的重要组成部分。MySQL有几种不同的日志文件,通常包括错误日志文件,二进制日志,通用日志,慢查询日...

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

MySQL句柄恢复文件的简单尝试

今天突然想起一个问题,那就是对于ibdata的恢复,如果我们简单模拟一下,就会发现还是蛮有意思的。 首先我们得到两个参数值,一个是刷脏页的指标,另外一个是数据文...

2818
来自专栏数据和云

备份策略 - 单表备份的隐患与应对方案

作者介绍: 刘鹏松,任职云和恩墨北区交付部,负责山东部分客户业务交付。 在通过mysqldump进行MySQL数据库(InnoDB引擎)逻辑备份的时候经常使用的...

3447
来自专栏我的博客

Thinkphp连接Oracle

'DB_TYPE' => 'oracle', // 数据库类型 'DB_HOST' => 'XXXXXXX', //...

3098
来自专栏乐沙弥的世界

InnoDB: Error: io_setup() failed with EAGAIN

    最近安装好了MySQL之后,在启动MySQL服务时无法正常启动MySQL。提示没有更新/var/lib/mfailedZDB.pid并退出。该MySQL...

611
来自专栏乐沙弥的世界

理解 using backup controlfile

        using backup controlfile 通常用于恢复由于当前控制文件丢失且原来备份的控制文件较当前发生变化的情形之下。using ba...

873

扫码关注云+社区