天天看點

Oracle12.2 多租戶環境下的授權管理

題記:在多租戶環境中,權限可以全局授予整個cdb,一個應用容器資料庫(application container),或者單個的pdb。在多租戶環境下,往往牽一發而動全身,是以合理授權就顯得格外重要。通過本文我們首先來認識多租戶中的全局授權和本地授權。

概述

在多租戶環境下,common user和local user之間可以互相授權。他們本身的權限既不屬于公共權限也不屬于本地權限。那麼他們的權限如何起作用,這取決于權限是被全局授予還是本地授予的。

關于公用使用者common user和本地使用者local user的内容,請檢視:

權限生效滿足以下規則:

Oracle12.2 多租戶環境下的授權管理

全局授予的權限

1、被全局授予的權限能夠應用于現有和将來建立的container中。

2、隻有common 使用者才能被授予公共權限,并且需要授權者也是common使用者。

3、common 使用者可以給另一個common 使用者或者common 角色進行授權。

4、在進行授權的時候,授權者必須連接配接到root 容器,并且在授權語句中指定 container=all。

5、系統權限和對象權限都可以被全局授予。

6、當一個common使用者連接配接或者轉換到現有的一個容器中時,該使用者的權限除了受到目前被授予權限的限制,還受到所在容器具有的權限的限制。

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

Oracle12.2 多租戶環境下的授權管理

本地授予的權限

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。

全局授予對象權限

公共對象上的對象權限對該對象以及此對象上的所有關聯連結生效。如果滿足下面的一些要求,這些連結包括所有中繼資料連結,資料連結(以前稱為對象連結)或與其相關聯的擴充資料連結(屬于該容器的所有pdb(包括新建立的pdb))。

1、對象特權授予者是公用使用者,而被授權者是公用使用者,公用角色或public角色。

2、對象特權授權者擁有全局授予的grant權限。

3、grant語句包含container = all子句。

以下示例顯示如何向公用使用者c## hr_admin授予對象特權,以便他可以從cdb根目錄中的任何與之相關聯的pdb中的dba_pdbs視圖進行select查詢。

授予或回收pdb的通路權限

可以在多租戶環境中授予和撤銷pdb通路權限。

要在多租戶環境中授予權限,應該在grant或revoke語句中包含container子句。

将container設定為all,将特權應用于所有現有和新建立的容器; 将其設定為current僅将權限應用于本地容器。 省略container子句将特權應用于本地容器。 如果從root發出grant語句,并忽略container子句,則該特權将在本地pdb應用。

下面的語句是如何通用授予公用使用者c## hr_admin的create table權限,以便此使用者可以在所有現有和新建立的容器中使用此權限。

啟用公用使用者檢視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資料字典視圖。

例如:

Oracle12.2 多租戶環境下的授權管理

啟用公用使用者檢視指定pdb的資訊

可以通過調整使用者的container_data屬性來啟用公用使用者通路與特定pdb相關的資料。(要使公用使用者能夠通路有關特定pdb的資料,請在root中發出alter user語句。)

以下示例顯示如何發出alter user語句以啟用通用使用者c##hr_admin在v $ session視圖中檢視與cdb $ root,sales_pdb和hrpdb容器相關的資訊(假設此使用者可以查詢該視圖)。

在上面的示例中:

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。 例如: