天天看點

oralce12c+使用者權限管理一.使用者管理二.權限管理三.鎖定概要檔案(lockdown profile)

一.使用者管理

1.公共使用者和本地使用者

12c+中的使用者分為:公共使用者和本地使用者

公共使用者:可以為CDB管理者建立,公共使用者是在所有的PDB中都可以使用的使用者,公共使用者的資訊存在CDB$ROOT中,并且存在于所有的PDB中.公共使用者需要連到CDB進行建立和管理.在CDB中建立的使用者預設就是公共使用者,可以省略container=all.在CDB中隻能建立公共使用者,不能建立本地使用者.

本地使用者:本地使用者隻會存儲在對應的PDB中.在PDB中建立的使用者預設就是本地使用者,可以省略container=current.在PDB中隻能建立本地使用者,不能建立公共使用者.

為了區分公共用和本地使用者,引進了新的參數common_user_perfix,表示公共使用者的字首.預設為c##,也就是說如果你想建立了一個公共使用者,必須帶上字首.此字首是可以進行修改的,但是建議不要修改.

SQL> show parameter common_user      
NAME                     TYPE    VALUE      
------------------------------------ ----------- ------------------------------      
common_user_prefix           string  C##      

2.建立使用者

1).建立公共使用者

公共使用者隻能在CDB$ROOT進行建立和管理.在CDB中建立的使用者,預設就為container=all,在建立公共使用者的時候,必須指定字首,否則報錯:

SQL> create user suq identified by suq container=all;      
create user suq identified by suq container=all      
*      
ERROR at line 1:      
ORA-65096: invalid common user or role name      
SQL> create user c##suq identified by suq;            
User created.      

在CDB$ROOT中隻能建立公共使用者,不能建立本地使用者,否則報錯:

SQL> create user amy identified by amy container=current;      
create user amy identified by amy container=current      
*      
ERROR at line 1:      
ORA-65049: Creation of local user or role is not allowed in this container.      

建立資料庫的時候建立的一些系統使用者也是公共使用者,例如sys,system等,隻是他們沒有以c##開頭,我想可能是為了和以前版本相容.

2).建立本地使用者

先連接配接到具體的PDB,再進行建立,則建立的就是本地使用者,建立本地使用者的文法和12c以前的沒什麼差別,但是建立的本地使用者隻有在目前PDB中才存在:

SQL> alter session set container=brent;      
Session altered.      
SQL> create user amy identified by amy ;      
User created.      

在PDB中不能建立公共使用者:

SQL> create user c##carol identified by carol container=all;      
create user c##carol identified by carol container=all      
*      
ERROR at line 1:      
ORA-65050: Common DDLs only allowed in root.      

3.查詢使用者

在12c中對dba_的資料字典做了修改.如果你處在CDB$ROOT中,如果查詢DBA_視圖,那麼你隻能查詢到公共的資料字典.如果你處在PDB中,那麼你查詢DBA_視圖隻能查到此PDB的資料字典.

12c中新增了CDB_資料字典,可以檢視所有的資料字典.

是以,當你在CDB中查詢dba_users,那你隻能查詢到公共的使用者,當你處于PDB中,那麼你隻能查到PDB中的本地使用者.

如果你想查詢所有的使用者,可以使用下的語句,其中新增oracle_maintained字段提示了此使用者是否由oracle管理.

select a.username,a.common,a.con_id,decode(a.CON_ID,1,'CDB$ROOT',b.pdb_name) name from cdb_users a,cdb_pdbs b 

where a.con_id=b.con_id(+) and oracle_maintained='N'

order by a.con_id,a.username;

SQL> select a.username,a.common,a.con_id,decode(a.CON_ID,1,'CDB$ROOT',b.pdb_name) name from cdb_users a,cdb_pdbs b       
where a.con_id=b.con_id(+) and oracle_maintained='N'      
order by a.con_id,a.username;  2    3        
USERNAME               COM     CON_ID NAME      
------------------------------ --- ---------- --------------------------------------------------------------------------------------------------------------------------------      
C##DSG                 YES      1 CDB$ROOT      
C##SUQ                 YES      1 CDB$ROOT      
AMY                     NO      3 BRENT      
C##DSG                 YES      3 BRENT      
C##SUQ                 YES      3 BRENT      
SUQ                     NO      3 BRENT      
C##DSG                 YES      4 TESTPDB1      
C##SUQ                 YES      4 TESTPDB1      
SUQ                     NO      4 TESTPDB1      
C##DSG                 YES      5 TESTPDB2      
C##SUQ                 YES      5 TESTPDB2      
SUQ                     NO      5 TESTPDB2      
C##DSG                 YES      7 TESTPDB3      
C##SUQ                 YES      7 TESTPDB3      
SUQ                     NO      7 TESTPDB3      

5.修改使用者

修改使用者密碼和上面建立的思想一樣,公共使用者隻能在CDB$ROOT中進行修改.本地使用者隻能在PDB中進行修改:

SQL> alter user c##suq identified by suq2;      
User altered.      

6.删除使用者

和上面的思想一樣:

SQL> drop user c##suq cascade;      
User dropped.      

二.權限管理

1)本地授權

在PDB内部的授權為本地授權.本地授權和以前的授權方法幾乎一樣.額外的,我們可以在PDB中對公共使用者進行授權.也就是說公共使用者雖然在所有PDB中都存在這個使用者,并不是說你建立了公共使用者,他就有權限通路所有PDB,

需要單獨賦予create session 權限.

例如我們建立一個公共使用者,剛建立玩的使用者是沒有登入權限的:

SQL> create user c##suq identified by suq;      
User created.      
SQL> show pdbs;      
CON_ID CON_NAME           OPEN MODE  RESTRICTED      
---------- ------------------------------ ---------- ----------      
2 PDB$SEED           READ ONLY  NO      
3 BRENT              READ WRITE NO      
4 TESTPDB1           READ WRITE NO      
5 TESTPDB2           READ WRITE NO      
7 TESTPDB3           READ WRITE NO      
SQL>              
SQL> show con_name            
CON_NAME      
------------------------------      
CDB$ROOT      
SQL> conn c##suq/suq      
ERROR:      
ORA-01045: user C##SUQ lacks CREATE SESSION privilege; logon denied      
Warning: You are no longer connected to ORACLE.      

如果我們在CDB中賦予了c##suq登入權限,他就可以登入到CDB,(注意,這裡如果不添加container子句,則預設為current)

SQL> conn / as sysdba      
Connected.      
SQL> grant create session to c##suq;      
Grant succeeded.      
SQL> conn c##suq/suq      
Connected.      

但是我們此時還沒有賦予單獨的PDB權限給他,是以他嘗試連接配接其他PDB的時候會報錯:

SQL> alter session set container=brent;      
ERROR:      
ORA-01031: insufficient privileges      

此時我們就需要為公共使用者授權:

SQL> conn / as sysdba      
Connected.      
SQL> show con_name      
CON_NAME      
------------------------------      
CDB$ROOT      
SQL> alter session set container=brent;      
Session altered.      
SQL> grant create session to c##suq with admin option container=current;      
Grant succeeded.      

2)公共授權

公共授權的的意思是我們可以在CDB$ROOT中,對公共使用者進行公共授權,授權之後的使用者就擁有了所有PDB的相關權限:

公共授權添加container=all關鍵字即可:

SQL> conn / as sysdba      
Connected.      
SQL> show con_name      
CON_NAME      
------------------------------      
CDB$ROOT      
SQL> grant create session to c##suq container=all;      
Grant succeeded.      
[[email protected] ~]$ sqlplus c##suq/[email protected]/brent      
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 25 23:41:17 2019      
Version 19.3.0.0.0      
Copyright (c) 1982, 2019, Oracle.  All rights reserved.      
Last Successful login time: Wed Sep 25 2019 23:40:13 +08:00      
Connected to:      
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production      
Version 19.3.0.0.0      
SQL>       

那麼此時c##suq就擁有的所有PDB的登入權限:

[[email protected] ~]$ sqlplus c##suq/[email protected]/testpdb2      
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 25 23:41:24 2019      
Version 19.3.0.0.0      
Copyright (c) 1982, 2019, Oracle.  All rights reserved.      
Last Successful login time: Wed Sep 25 2019 23:41:17 +08:00      
Connected to:      
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production      
Version 19.3.0.0.0      
SQL>       

常用的一些權限:

grant Create Session to c##Test container=all;

grant Set Container to c##Test container=all;

grant Set Container to c##Test container=all;

3)檢視權限

可以通過檢視dba_sys_privs檢視賦予的權限:

SQL> select * from dba_sys_privs where grantee like 'C##%';      
GRANTEE                                                              PRIVILEGE                ADM COM INH      
-------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------- --- --- ---      
C##SUQ                                                               CREATE SESSION               NO  NO  NO      
C##SUQ                                                               CREATE SESSION               NO  YES NO      

4)修改公共使用者的公共通路資源

預設公共使用者可以檢視CDB的資訊,也可以檢視v$視圖.但是我們可以使用container_data參數控制公共使用者通路的粒度.

例如下面我們設定公共使用者對v$session隻能查詢某個PDB上的資料:

SQL> alter user c##suq set container_data=(CDB$ROOT,BRENT) for v_$session container=current;      
User altered.      

可以通過查詢dba_container_data字典,查詢剛剛的操作:

SQL> select * from dba_container_data;      
USERNAME         D OWNER            OBJECT_NAME            A CONTAINER_NAME      
-------------------- - -------------------- ------------------------------ - ------------------------------      
GSMADMIN_INTERNAL    N SYS          GV_$ACTIVE_SERVICES        Y      
GSMADMIN_INTERNAL    N SYS          CDB_SERVICES            Y      
APPQOSSYS        N SYS              V_$WLM_PCMETRIC          Y      
APPQOSSYS        N SYS              V_$WLM_DB_MODE         Y      
APPQOSSYS        N SYS              V_$WLM_PCSERVICE           Y      
APPQOSSYS        N SYS              GV_$WLM_DB_MODE        Y      
APPQOSSYS        N SYS              V_$CONTAINERS          Y      
APPQOSSYS        N SYS              DBA_PDBS               Y      
C##SUQ           N SYS              V_$SESSION             N CDB$ROOT      
C##SUQ           N SYS              V_$SESSION             N BRENT      
SYSTEM           Y                             Y      
DBSFWUSER        Y                             Y      
DBSNMP           Y                             Y      

但是注意,這種限制隻能限制在CDB中的通路,如果此公共使用者擁有PDB的set container權限,那麼他就可以先alter session set container,然後再進行查詢.

5)使用者代理

使用者代理可以允許我們以其他使用者的身份登入資料庫,然後在資料庫裡看來,和此使用者登入資料庫一模一樣,

SQL> alter user suq grant connect through test;      
User altered.      
SQL> connect test[suq]/test      
Connected.      
SQL> show user;      
USER is "SUQ"      

三.鎖定概要檔案(lockdown profile)

我們可以在某個PDB中給某個使用者DBA權限,這樣此使用者就會擷取到此PDB的DBA權限,但是沒有CDB的DBA權限.但是在12.1中,此使用者還是可能潛在存在對CDB或者伺服器破壞的權限,

例如生産大量的trc檔案.在12.2中引入了鎖定概要檔案.

1.首先連接配接到CDB,建立鎖定概要檔案

SQL> create lockdown profile test_lockdown_profile;      
Lockdown Profile created.      

檢視概要檔案通過字典:DBA_LOCKDOWN_PROFILES

2.通過概要檔案,建立規則

例如資料庫中沒有分區表,為了確定沒有人會建立,禁用分區表的建立:

SQL> alter lockdown profile test_lockdown_profile disable option=('Partitioning');      
Lockdown Profile altered.      

3.将鎖定概要檔案應用到指定PDB

SQL> alter session set container=testpdb3;      
Session altered.      
SQL> alter system set pdb_lockdown=test_lockdown_profile;      
System altered.      

鎖定概要檔案非常強大,可以對一些特定的選項做啟用或者禁止.