368
汽車大全
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訪問權限。
要在多租戶環境中授予權限,應該在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;
公用用戶可以查看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數據字典視圖。
例如:
可以通過調整用戶的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;
文章轉自數據和雲公眾號,原文鏈接
最後更新:2017-07-18 12:03:27
上一篇:
如何在多租戶環境下使用數據庫的閃回功能
下一篇:
雲和恩墨zData多租戶整合,青海移動數據庫雲化起航
10 個平板電腦上的 Python 編輯器
HTAP數據庫 PostgreSQL 場景與性能測試之 22 - (OLTP) merge insert|upsert|insert on conflict|合並寫入
Oracle日期顯示問題以及trunc方法的使用
Sql Server 查詢表中各列名稱、表中列數
同是“買買買”,亞馬遜比沃爾瑪更清楚知道自己要什麼
ARM霸氣領導100億CPU內核市場
多條記錄求和問題
網絡安全的死敵:欺騙工程
cf 204 div2 D. Jeff and Furik 逆序對
《大數據係統構建:可擴展實時數據係統構建原理與最佳實踐》一1.9 示例應用:SuperWebAnalytics.com