如何控制common user在cdb裡對於pdb資訊的訪問
本文目的:
研究common user要在不同的pdb間切換所需具有的許可權;
研究common user在cdb上查詢container_data_objects時如何限制其只能訪問到某幾個pdb對應的資訊或者在某個特定的container_data_object對象上限制其只能訪問到某幾個pdb對應的資訊,common user一般都有比較大的許可權,但有的時候我們不想讓common user通過cdb裡的視圖去訪問到某些pdb的資訊
先解釋一下container_data_object的概念:Dba_table、dba_views中container_data=’Y’對應的表或視圖,因為這些視圖中包含了來自不同pdb的資訊,所以被稱作container_data_object
1、 只有common user才能使用alter session set container=PDBX在各個pdb間進行切換,前提是這個common user必須在這些pdb裡至少具有create session 和 set container許可權:
---在cdb裡建立一個common user,賦予create session許可權
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create user c##guser2 identified by 773946 container=all;
User created.
SQL> grant create session to c##guser2;
Grant succeeded.
---以剛建立的c##guser2使用者登陸cdb,set container到orapdba提示許可權不足
oracle@ora12c1:/home/oracle>sqlplus c##guser2/773946
SQL*Plus: Release 12.1.0.1.0 Production on Thu Dec 12 21:22:44 2013
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
SQL> alter session set container=orapdba;
ERROR:
ORA-01031: insufficient privileges
--[C1] -在orapdba裡,grant set container許可權給c##guser2
SQL> show con_name
CON_NAME
------------------------------
ORAPDBA
SQL> grant set container,create session to c##guser2;
Grant succeeded.
--- set container到orapdba成功
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container=orapdba;
Session altered.
結論:common user使用者要在不同的pdb間實現切換,必須在這些pdb上擁有create session和set container的許可權,最簡單的方法是在cdb上執行grant create session,set container to c##guser2 container=all進行全域的賦權
2、 通過alter user中的container_data_clause 進行container_data_objects存取權限控制:
---全域授權c##guser2查詢系統檢視表的許可權
SQL> grant select_catalog_role to c##guser2 container=all;
Grant succeeded.
---[C2] 以c##guser2登陸cdb$root查詢cdb_data_files、v$session兩個視圖的內容
SQL> show user
USER is "C##GUSER2"
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> select distinct con_id from v$session;
CON_ID
----------
1
0
SQL> select distinct con_id from cdb_data_files;
CON_ID
----------
1
---開放給c##guser2使用者查詢特定pdb上資訊的許可權
SQL> show user
USER is "SYS"
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> alter user c##guser2 set container_data=(CDB$root[C3] ,orapdba,orapdbb) container=current;
User altered.
---查詢cdb_container_data可以看到c##guser2使用者具有在部分pdb上查詢container_data_object的許可權
select * from CDB_container_data where username='C##GUSER2';
Grant succeeded.
---再次以c##guser2登陸cdb$root查詢cdb_data_files、v$session兩個視圖的內容,能查到除了0、1之外的其它pdb的資訊了
SQL> select distinct con_id from v$session;
CON_ID
----------
1
4
3
0
SQL> select distinct con_id from cdb_data_files;
CON_ID
----------
4
3
1
---對於v$session視圖限制c##guser2隻能訪問orapdba相關的資訊
SQL> alter user c##guser2 set container_data=(CDB$root,orapdba) for v$session container=current;
---cdb_container_data中又增加了兩行基於特定對象的控制資訊
select * from CDB_container_data where username='C##GUSER2'
---以c##guser2登陸Root查詢cdb_data_files、v$session兩個視圖的內容,發現還是能查到con_id=4,即orapdbb的記錄
SQL> select distinct con_id from v$session;
CON_ID
----------
1
4
3
0
SQL> select distinct con_id from cdb_data_files;
CON_ID
----------
4
3
1
---原因在於紅色的部分還是生效的
---去除對於orapdbb的存取權限
SQL> alter user c##guser2 remove container_data=(orapdbb) container=current;
User altered.
---以c##guser2登陸Root查詢cdb_data_files、v$session兩個視圖的內容,就不見了
con_id=4的記錄
SQL> select distinct con_id from v$session;
CON_ID
----------
1
3
0
SQL> select distinct con_id from cdb_data_files;
CON_ID
----------
3
1
---對於v$session視圖限制放寬讓c##guser2也能訪問orapdbb相關的資訊
SQL> alter user c##guser2 add container_data=(orapdbb) for v$session
container=current;
User altered.
---以c##guser2登陸Root查詢v$session視圖又能看見con_id=4的記錄,但
cdb_data_files裡依然沒有con_id=4的記錄
User altered.
[C1]此處未授權create session也可以set container成功,實際操作時還是同時附上create session比較好
[C2]由於c##guser2未進行任何的container_data設定,也即相當於設定了set container_data=default,所以只能看到con_id=0、con_id=1的記錄,0代表整個CDB,1代表CDB$ROOT
[C3]必須包含Root,否則會報ORA-65057錯誤
在CentOS 6.4下安裝Oracle 11gR2(x64)
Oracle 11gR2 在VMWare虛擬機器中安裝步驟
Debian 下 安裝 Oracle 11g XE R2