很多時候,系統新功能要上線,可是每次系統上線,就把系統帳號全部權限開"select /insert/update/delet any table"權限,
對系統的安全性、資料的安全性也不是一件好作法,可是又不太清楚這個應用系統帳號總共需要哪些權限,這時候,
就可以使用oracle 12c的新功能Privilege Capture來review執行時所需要的全部權限,本文就這個主題來做一些說明。
Oracle 12c 引入了該DBMS_PRIVILEGE_CAPTURE軟件包,它允許您跟踪正在使用的特權,從而使執行特權分析變得更加簡單,從而使您可以撤銷不必要的特權並達到最低特權狀態。
在 19c 之前,此功能是 Oracle Database Vault 選項的一部分,因此在過去只有在您擁有適當的許可證時才能使用它。
從 19c 開始,此功能是 Enterprise Edition 的一部分,因此您不再需要 Database Vault 選項,並且文檔已移至Security Guide。
更新:此許可更改已向後移植 Oracle 12.1。在使用此功能之前,請在您的版本的許可手冊中確認。
基本用法
為了使用該DBMS_PRIVILEGE_CAPTURE包,您必須被授予該CAPTURE_ADMIN角色。
不管你試圖監控什麼,DBMS_PRIVILEGE_CAPTURE包的基本用法都是一樣的。
1.創建權限分析策略。( CREATE_CAPTURE)
2.啟用它。( ENABLE_CAPTURE)
3.等待所需的分析時間。
4.禁用權限分析策略。( DISABLE_CAPTURE)
5.分析結果。(GENERATE_RESULT和查詢字典視圖)
6.如果不再需要該策略以及記錄的數據,請刪除該策略。( DROP_CAPTURE)
分析運行之間的主要區別將基於對CREATE_CAPTURE過程的調用,這將在下面討論。
在啟用和禁用捕獲之間等待的時間是該過程中真正重要的部分。
您必須等待一段有代表性的時間,否則您可能會錯過一些重要的活動。
例如,某些特權可能與不經常發生的任務相關聯,例如年終跨年時的一些必要的系統工作。
如果您沒有在代表期間進行抽樣,您可能會錯誤地得出某些特權是不必要的結論。
注意:在多租戶環境中,這些策略(Policy)是特定於容器(container)的。
CREATE_CAPTURE
該CREATE_CAPTURE過程允許您創建具有不同粒度的權限分析策略。
G_DATABASE:分析數據庫上的所有權限使用情況,除了 SYS 用戶。ROLES和CONDITION參數不是必需的。
G_ROLE:按參數中指定的角色分析所有權限使用情況ROLES。使用該ROLE_NAME_LIST函數指定角色。
G_CONTEXT:當參數中指定的布爾表達式CONDITION評估為 TRUE 時,分析所有特權使用情況。條件可以包括對SYS_CONTEXT.
G_ROLE_AND_CONTEXTROLES:當和CONDITION條件都為真時分析所有特權使用情況。
所有策略都是在禁用狀態下創建的。下面的代碼給出了每個的簡單示例。
-- Connect to a privileged using in a PDB.
conn / as sysdba
alter session set container = pdb1;
-- Whole database (type = G_DATABASE).
begin
dbms_privilege_capture.create_capture(
name => 'db_pol',
type => dbms_privilege_capture.g_database
);
end;
/
-- One or more roles (type = G_ROLE).
begin
dbms_privilege_capture.create_capture(
name => 'role_pol',
type => dbms_privilege_capture.g_role,
roles => role_name_list('DBA', 'RESOURCE')
);
end;
/
-- A user defined condition, when user is TEST (type = G_CONTEXT).
begin
dbms_privilege_capture.create_capture(
name => 'cond_pol',
type => dbms_privilege_capture.g_context,
condition => 'sys_context(''userenv'', ''session_user'') = ''TEST'''
);
end;
/
-- Combination of roles and conditions (type = G_ROLE_AND_CONTEXT).
begin
dbms_privilege_capture.create_capture(
name => 'role_cond_pol',
type => dbms_privilege_capture.g_role_and_context,
roles => role_name_list('dba', 'resource'),
condition => 'sys_context(''userenv'', ''session_user'') in (''TEST'',''EMP'')'
);
end;
/
讓我們來檢視一下捕捉到哪些資訊,DBA_PRIV_CAPTURES視圖將顯示有關現有權限捕獲策略的信息。
column name format a15
column roles format a20
column context format a30
set linesize 100
select name,
type,
enabled,
roles,
context
from dba_priv_captures
order by name;
NAME TYPE E ROLES CONTEXT
--------------- ---------------- - -------------------- ------------------------------
cond_pol CONTEXT N SYS_CONTEXT('USERENV', 'SESSIO
N_USER') = 'TEST'
db_pol DATABASE N
role_cond_pol ROLE_AND_CONTEXT N ROLE_ID_LIST(4, 3) SYS_CONTEXT('USERENV', 'SESSIO
N_USER') IN ('TEST','EMP')
role_pol ROLE N ROLE_ID_LIST(4, 3)
4 rows selected.
SQL>
ENABLE_CAPTURE
ENABLE_CAPTURE過程用於啟用捕獲策略。通常,一次只能啟用一個分析策略。
例外情況是可以同時啟用一個G_DATABASE和一個無策略。
begin
dbms_privilege_capture.enable_capture('db_pol');
dbms_privilege_capture.enable_capture('cond_pol');
end;
/
DISABLE_CAPTURE
一旦您等待了一段有代表性的時間,就可以使用該DISABLE_CAPTURE過程禁用捕獲。
begin
dbms_privilege_capture.disable_capture('db_pol');
dbms_privilege_capture.disable_capture('cond_pol');
end;
/
GENERATE_RESULTS
捕獲完成後,GENERATE_RESULT應使用該過程將捕獲的信息推送到數據字典視圖。
begin
dbms_privilege_capture.generate_result('db_pol');
end;
/
權限分析視圖
Oracle 12c 中添加了以下視圖,以允許您查詢權限分析運行的結果。
DBA_PRIV_CAPTURES
DBA_USED_OBJPRIVS
DBA_USED_OBJPRIVS_PATH
DBA_USED_PRIVS
DBA_USED_PUBPRIVS
DBA_USED_SYSPRIVS
DBA_USED_SYSPRIVS_PATH
DBA_USED_USERPRIVS
DBA_USED_USERPRIVS_PATH
DBA_UNUSED_OBJPRIVS
DBA_UNUSED_OBJPRIVS_PATH
DBA_UNUSED_PRIVS
DBA_UNUSED_SYSPRIVS
DBA_UNUSED_SYSPRIVS_PATH
DBA_UNUSED_USERPRIVS
DBA_UNUSED_USERPRIVS_PATH
這些視圖顯示的信息將幫助您決定應該修改哪些授權和角色。
DROP_CAPTURE
分析完成後,您可以選擇刪除捕獲的信息。只能刪除禁用的策略。
begin
dbms_privilege_capture.drop_capture('cond_pol');
dbms_privilege_capture.drop_capture('db_pol');
dbms_privilege_capture.drop_capture('role_cond_pol');
dbms_privilege_capture.drop_capture('role_pol');
end;
/
ref:
https://oracle-base.com/articles/12c/capture-privilege-usage-12cr1