Oracle虛擬私有數(shù)據(jù)庫(Virtual Private Database,下文簡稱VPD)是Oracle數(shù)據(jù)庫產品中提供的一個安全功能,它能夠保證Oracle數(shù)據(jù)庫的多租戶特性,與此同時,可以幫助用戶進行數(shù)據(jù)庫的整合。
Oracle VPD能夠針對數(shù)據(jù)庫表和視圖,在行與列級別對數(shù)據(jù)訪問進行控制。從名稱來看,Oracle VPD表達的意思多少有些誤導的嫌疑,畢竟Oracle數(shù)據(jù)庫已經(jīng)是一個多用戶的數(shù)據(jù)庫,每個用戶也許沒有意識到他們正在共享數(shù)據(jù)庫。因此,將Oracle VPD稱為虛擬私有模式對象(Virtual Private Schema Object,VPSO)更為貼切,因為它會在數(shù)據(jù)庫內將表、視圖以及同義詞進行虛擬化。但是在本文中,我們還是現(xiàn)將其稱為VPD。
鑒于Oracle的用戶/角色安全權限模型允許訪問模式對象,因此VPD將通過訪問策略來強制對模式對象數(shù)據(jù)的細粒度訪問。當訪問策略開始執(zhí)行,VPD將會動態(tài)地調整SQL語句,如SELECT、UPDATE和INSERT,其方式就是加一個WHERE條件來過濾結果。VPD不僅對用戶是透明的,而且它的安全性是無法被忽視的。在Oracle企業(yè)版數(shù)據(jù)庫產品中,VPD選項還是免費提供的。
在下文要提到的VPD用例中,將介紹它如何在同一個模式下存儲多個公司的數(shù)據(jù)。

使用Oracle VPD
在許多初創(chuàng)的公司中,口香糖生產公司ABC看到了商機,希望能夠借助托管的業(yè)務系統(tǒng)來迅速占領市場。他們決定建立一個客戶信息系統(tǒng)(CIS)作為集中的網(wǎng)絡托管與數(shù)據(jù)服務應用。為了讓這個基于云的SaaS交付模型能夠取得成功,他們必須整理一套解決方案,能夠不修改現(xiàn)有的應用代碼,并提供數(shù)據(jù)安全性保障,并快速地進行測試,將投資回報率最大化。
公司的IT團隊否定了為每個客戶端部署單獨的數(shù)據(jù)庫策略,因為這樣做無法滿足所有的需求。因此他們開始考慮共享一個單獨的數(shù)據(jù)庫,其中數(shù)據(jù)庫負責人建議在同一個數(shù)據(jù)庫模式下用Oracle VPD存儲多客戶數(shù)據(jù)。他解釋了VPD對于應用是完全透明的,能夠提供行級數(shù)據(jù)安全,滿足銷售團隊的靈活性需求,它是最劃算的部署策略。他解釋了客戶為何無法認識到他們在共享一個模式對象。
此外,他還描述了設計的主要組件是如何部署的(表1)。首先,用戶將繼續(xù)使用特定客戶端連接池作為一個代理,通過現(xiàn)有的Web應用來連接到數(shù)據(jù)庫。當數(shù)據(jù)庫會話建立之后,一個應用語境將被設置來高效地捕獲客戶端標識符屬性。安全性訪問策略將基于一個策略函數(shù),它將應用到模式對象中以強制客戶端數(shù)據(jù)的邏輯分離。策略函數(shù)將使用應用語境和一個客戶端標識列來返回一個條件限制行,訪問CIS的表、視圖以及同義詞。