利用Label Security實現行級安全性 Step By Step
利用Label Security實現行級安全性 Step By Step[@more@]相關閱讀:
利用VPD細粒度訪問策略實現行級安全性 Step By Step
前言:
在Oracle9i中有一個元件稱為Oracle Label Security,這個元件實現了基於自定義策略而對資料庫中的表甚或是整個Schema提供行級安全性功能。實際上Oracle Label Security是在Oracle8.1.7中提出的,在9i版本中功能得到了大幅度增強。
本文透過一個簡單的例子對Oracle Label Security的功能作初步的探討,本文使用的環境是Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 for Windows 32 bit。
流程:
首先我們瞭解一下實現Oracle Label Security的大體流程。
透過Oracle提供的一系列儲存過程,先建立一個policy,然後在policy中建立level,compartment,group,之後透過這些定義好的level,compartment,group再定義label,然後將policy繫結到某張表或者某個schema,最後再給相應的使用者設定label。
其中牽涉到幾個名詞,解釋一下:
Policy:就是安全策略,一個安全策略是level,compartment,group,label的集合。
Level:等級,這是最基礎的安全控制等級,必須設定。
Compartment:分隔(這不是官方翻譯),提供第二級的安全控制,是可選的。
Group:組(這不是官方翻譯),提供第三級的安全控制,是可選的。
Label:標籤,最終體現到每一行上的安全標籤,必須設定。只有使用者被賦予的標籤和此行上的標籤相同或者等級更高的時候,該行才能夠被使用者存取。
方法:
然後再來了解一下Oracle實現Label Security的大體方法。
在設定完Label以後,透過SQL Trace,我們可以看到使用者發出的select語句執行計劃有了變化,即使是全表掃描,也會多出一個filter的操作。
select *
from
documents
Rows Row Source Operation
------- ---------------------------------------------------
5 FILTER (cr=7 pr=0 pw=0 time=184 us)
5 TABLE ACCESS FULL DOCUMENTS (cr=7 pr=0 pw=0 time=131 us)
透過檢視raw trace file可以看到Oracle在parse這個SQL的時候,自動新增了一個條件:
begin :con := LBAC_RLS.READ_FILTER(:sn, :on); end;
而這個條件的具體操作在trace file中也有儲存,此處就不多說了。總之,透過trace我們知道對於設定了label的表的select操作,Oracle自動新增了條件來保證使用者只能選擇到自己能夠看到的記錄。
那麼,對於DML(insert,update,delete)操作呢?其實,Oracle是自動在表上新增了觸發器,這一點我們可以在設定完label以後,透過dba_triggers檢視驗證,新增的是INSERT AFTER EACH ROW,UPDATE AFTER EACH ROW和DELETE BEFORE EACH ROW三個trigger,Oracle的很多功能在內部其實都是透過trigger完成,比如高階複製同樣如此,但是Oracle一直聲稱這些trigger是內部實現的,所以比使用者自定義的trigger效率要高。當然,內部trigger和自定義trigger在實現機制上是否真的不同,還有待驗證。
利用VPD細粒度訪問策略實現行級安全性 Step By Step
前言:
在Oracle9i中有一個元件稱為Oracle Label Security,這個元件實現了基於自定義策略而對資料庫中的表甚或是整個Schema提供行級安全性功能。實際上Oracle Label Security是在Oracle8.1.7中提出的,在9i版本中功能得到了大幅度增強。
本文透過一個簡單的例子對Oracle Label Security的功能作初步的探討,本文使用的環境是Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 for Windows 32 bit。
流程:
首先我們瞭解一下實現Oracle Label Security的大體流程。
透過Oracle提供的一系列儲存過程,先建立一個policy,然後在policy中建立level,compartment,group,之後透過這些定義好的level,compartment,group再定義label,然後將policy繫結到某張表或者某個schema,最後再給相應的使用者設定label。
其中牽涉到幾個名詞,解釋一下:
Policy:就是安全策略,一個安全策略是level,compartment,group,label的集合。
Level:等級,這是最基礎的安全控制等級,必須設定。
Compartment:分隔(這不是官方翻譯),提供第二級的安全控制,是可選的。
Group:組(這不是官方翻譯),提供第三級的安全控制,是可選的。
Label:標籤,最終體現到每一行上的安全標籤,必須設定。只有使用者被賦予的標籤和此行上的標籤相同或者等級更高的時候,該行才能夠被使用者存取。
方法:
然後再來了解一下Oracle實現Label Security的大體方法。
在設定完Label以後,透過SQL Trace,我們可以看到使用者發出的select語句執行計劃有了變化,即使是全表掃描,也會多出一個filter的操作。
select *
from
documents
Rows Row Source Operation
------- ---------------------------------------------------
5 FILTER (cr=7 pr=0 pw=0 time=184 us)
5 TABLE ACCESS FULL DOCUMENTS (cr=7 pr=0 pw=0 time=131 us)
透過檢視raw trace file可以看到Oracle在parse這個SQL的時候,自動新增了一個條件:
begin :con := LBAC_RLS.READ_FILTER(:sn, :on); end;
而這個條件的具體操作在trace file中也有儲存,此處就不多說了。總之,透過trace我們知道對於設定了label的表的select操作,Oracle自動新增了條件來保證使用者只能選擇到自己能夠看到的記錄。
那麼,對於DML(insert,update,delete)操作呢?其實,Oracle是自動在表上新增了觸發器,這一點我們可以在設定完label以後,透過dba_triggers檢視驗證,新增的是INSERT AFTER EACH ROW,UPDATE AFTER EACH ROW和DELETE BEFORE EACH ROW三個trigger,Oracle的很多功能在內部其實都是透過trigger完成,比如高階複製同樣如此,但是Oracle一直聲稱這些trigger是內部實現的,所以比使用者自定義的trigger效率要高。當然,內部trigger和自定義trigger在實現機制上是否真的不同,還有待驗證。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-899029/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Promise的實現(step by step)Promise
- React Step by StepReact
- 實時 Linux 抖動分析 Step by stepLinux
- Command 模式 Step by Step模式
- 實現Vue-MVVM-step1VueMVVM
- Shell Step by Step (4) —— Cron & Echo
- Step by Step 安裝 BizTalk Server 2009Server
- Step by Step Data Replication Using Oracle GoldenGateOracleGo
- TIDB DM資料同步step by stepTiDB
- 單步除錯 step into/step out/step over 區別詳解除錯
- ABP應用開發(Step by Step)-下篇
- ABP應用開發(Step by Step)-上篇
- 實現 VUE 中 MVVM - step11 - ExtendVueMVVM
- 實現 VUE 中 MVVM - step10 - ComputedVueMVVM
- 實現 VUE 中 MVVM - step5 - ObserveVueMVVM
- 實現 VUE 中 MVVM - step6 - ArrayVueMVVM
- 實現 VUE 中 MVVM - step3 - WatcherVueMVVM
- 實現 VUE 中 MVVM - step2 - DepVueMVVM
- Vue.js SSR Step by Step (1) – 實現簡單的client-only vue-webpack 配置Vue.jsclientWeb
- Linkerd 2.10(Step by Step)—多叢集通訊
- Sql Server Linux(Redhat) Distributed Availability Group Setup — step by stepSQLServerLinuxRedhatAI
- 10GR2下建立物理standby STEP BY STEP
- Step-by-step,打造屬於自己的vue ssrVue
- Adaboost Algorithm StepGo
- 機器學習之step by step實戰及知識積累筆記機器學習筆記
- Linkerd 2.10(Step by Step)—使用 Kustomize 自定義 Linkerd 的配置
- 深度學習之step by step搭建神經網路深度學習神經網路
- Linkerd 2.10(Step by Step)—設定服務配置檔案
- 實現 VUE 中 MVVM - step4 - 優化WatcherVueMVVM優化
- 實現 VUE 中 MVVM – step13 – inject & 總結VueMVVM
- 實現 VUE 中 MVVM – step8 – 優化EventVueMVVM優化
- 使用Eclipse 安裝 構建Maven專案 (step-by-step)EclipseMaven
- Linkerd 2.10(Step by Step)—4. 如何配置外部 Prometheus 例項Prometheus
- LEARNED STEP SIZE QUANTIZATION論文復現
- 簡單實現 VUE 中 MVVM – step4 – 優化Watcher實現VueMVVM優化
- HTML step 屬性HTML
- 【Step-By-Step】高頻面試題深入解析 / 週刊06面試題
- 【Step-By-Step】高頻面試題深入解析 / 週刊07面試題
- 【Step-By-Step】高頻面試題深入解析 / 週刊04面試題