如何控制common user在cdb裡對於pdb資訊的訪問

來源:互聯網
上載者:User

如何控制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

 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.