程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 授權訪問動態時空數據

授權訪問動態時空數據

編輯:Oracle數據庫基礎

在集合和用戶群規模都較大且是動態的情況下,對集合中的單個數據對象進行訪問授權會比較困難。如果授權策略是基於數據對象的時間和空間參照,這將變得更為復雜。本文以我的公司CycloMedia Technology的真實場景為例,給大家介紹了這一問題的解決方案,該方案結合使用了Oracle數據庫企業版的兩個組件:Spatial選件和虛擬專用數據庫特性。

CycloMedia Technology

CycloMedia專業從事基於360度的全景圖像(即環形全景圖)實現環境的系統性大規模可視化。要創建環形全景圖,需要對廣闊區域進行拍照,並將其輸入到聯機數據庫。注冊完每個記錄、位置、方位後,就可以實現多樣化的應用,如3-D測量和建模。(請參見以下示例。)

圖像 Id 記錄位置 記錄日期時間 43c5klf8h0cg 5.70698580234006,50.8474750817698 2005-03-12 15:22 6ju83ks7u6pg 4.59019800392403,52.4622636292842 2004-08-02 08:51 85s8hi4nl7u2 6.9008111752263,52.4115443666161 2006-06-21 12:17 .... .... ....

圖 1 使用地理空間數據的環形全景圖示例

DCR7 是 CycloMedia 自行開發的一系列記錄系統中最新的模型,可用於表現外觀質量、量度精度和高速直觀記錄。DCR7 能夠以 5 米間隔、80 公裡/小時的速度生成環形全景圖,CycloMedia 有意使用它將歐洲大部分公共空間轉化為圖像。由於這些進步,環形全景圖集合有望快速增長。

授權挑戰

在 CycloMedia 案例中,我們面臨著這樣一種情況,即需要向許多用戶授予對帶有空間和時間參照的動態對象集合的訪問權。授權參數基於集合的時間和空間維度。

傳統上,這一問題的解決方案是創建靜態數據集或授權表來描述每個主體(客戶端或用戶)與集合中各對象之間的每一種單一關系。構建這些數據集和表通常要使用專業工具來計算對象和授權區域之間的空間關系。

當用戶群體和集合都較大且是動態的情況下,構建和維護這些即席數據集和授權表以支持訪問控制並不合適。而且,即席數據不支持訪問控制策略中的靈活保護粒度和動態變化。

近來提出的幾個解決方案有著不同缺點。導致這些缺點的主要原因與所提出的解決方案的體系結構相關。在數據庫外實施授權,或在執行查詢後實施授權,因此限制了數據的使用。甚至 Open Geospatial Consortium 當前建議的新標准 GeoXACML 體系結構也存在問題。它基於用於空間數據(GML、WMS)和授權 (XACML) 的標准,為不受保護的 Web 地圖服務提供了一種無需更改現有基礎架構即可進行訪問控制的解決方案。為此,它攔截了傳輸至 WMS 的消息,對目標 WMS 執行檢索任務,將檢索結果發送至決策點,然後基於得到的授權決定創建結果集。

這一概念在很大程度上基於這一體系結構原型,該原型會導致一些效率低下的後果:所有數據均選自原始數據庫,然後轉換為 GML, 再使用外部工具根據授權策略按特征逐一劃分並計算。因此無法使用原始數據庫中的空間索引,而且必須在其他組件中實施空間比較函數。另外,該體系結構不能執行復雜的分析任務,因為數據首先經過了選擇然後依據授權策略進行了篩選。即使是簡單查詢最近鄰居也會出問題:您最後可能會發現一開始所選擇的最近對象是無法到達的。

數據庫級授權評估

因為主流數據庫已經實施了空間數據類型和空間函數(通常基於 Open Geospatial Consortium 的 SFS [空間類型和函數] 標准),在數據庫級別上執行授權策略似乎是可行的。然而,當前的 SQL 授權機制卻限制在表、視圖和列級別上。用戶可以想像為每個用戶創建視圖,但如果有大量用戶和不斷變化的策略,該方法將再次失效。

由於上述問題,當前的信息系統通常繞過數據庫訪問控制工具,將訪問控制嵌入到用於訪問數據庫的應用程序中。這可以是最終用戶應用程序或中間件應用程序。將訪問控制嵌入到最終用戶應用程序中的情況下,如果用戶無法控制應用程序的來源或者使用了多個應用程序,那麼就會出問題。授權策略的變化也必須應用於多個控制機制,但甚至在那種情形下用戶也依賴於應用更新策略來使更改生效。此外,還存在著用戶或黑客提交隨意性查詢的風險。第二個選擇是在中間件應用程序中構建查詢。然後,該應用程序應編輯由最終用戶應用程序執行的查詢,以加入授權策略。然而,當遇到復雜的檢索任務和經常變化的授權策略時,這將變得非常困難。另外一個選擇是提供幾個默認的檢索任務作為最終用戶應用程序的函數。盡管這可能會簡化過程,但它直接限制了用戶的選擇。

數據庫級授權執行

出於上述原因,理想情況下應該在數據庫級指定並實施細粒度的訪問控制。U.C. Berkeley 的 Shariq Rizvi 和其他人提出了 Truman 模型,該模型基於數據庫級別修改查詢,以包括授權策略。盡管其他人曾討論過這一概念,但 Truman 模型使用參數化的視圖框架對這一在數據庫級修改查詢的方法進行了統一。Truman 模型背後的想法是為每個用戶提供完整數據庫的個人限制性視圖。為實現此目的,需要對用戶的查詢進行修改以確保用戶不能查看允許之外的內容。將授權策略加入提交的查詢作為謂詞,這些策略實際上就是邏輯表達式。下面是該模型的示意圖。

圖 2 Truman 模型:用戶提供的 query 將重寫至 query´,由系統執行。

因為查詢的修改過程對用戶是透明的,用戶幾乎不會察覺到訪問控制機制的存在。因此,最終用戶將認為該體系結構沒有對數據應用限制,他可以訪問表中的所有對象。Truman 模型視圖示意圖:

圖 3 Truman 模型下的查詢修改對用戶是透明的。由於這一原因,也可以這樣認為,在該模型中,用戶查詢中的每個關系由用戶有權查看的視圖所代替。

Truman 模型有時也稱為細粒度訪問控制 (FGAC) 或行級安全 (RLS)。(該模型名稱的靈感源自於 1998 年的電影 The Truman Show 中 Truman Burbank 角色所處的人工世界)。

該模型的優點包括:單點授權實施、可以擁有動態的集合、最終用戶查詢功能以及高效的數據處理(這是空間數據一個主要方面)。

Oracle 虛擬專用數據庫

Oracle 虛擬專用數據庫 (VPD) 在 Oracle 文檔中有其他幾個名稱,包括 FGAC 或 RLS。無論名稱是什麼,VPD 安全都提供了一個全新的數據訪問控制方法。它基於這樣的思路:將定義的安全策略函數附加到數據庫表或視圖,每次查詢或更改表或視圖中的數據時都執行該安全策略函數。該函數將返回另外一個 SQL(稱為謂詞),在使用該 SQL 前將其附加到原始 SQL 的 WHERE 子句上。從而與 Truman 模型的概念相匹配。查詢修改在查詢優化器中完成,實際上是在分析和執行 SQL 時進行。執行 SQL 時,實際上是代表用戶執行修改過的 SQL。這表示策略函數控制返回哪幾行數據。可以將該過程看作一個系統觸發器,當訪問定義了策略的表時,將執行該觸發器。一個重要的特征是 VPD 的動態本質。

實施

為了解 Truman 模型是否適用於預定情況,我們在啟用了 Spatial 選件的 Oracle 數據庫 10g 企業版上建立一個測試實施。只有 Oracle 數據庫企業版才包含的 VPD 組件用於修改查詢。在數據庫中構建集合相對容易,只需要一個包含 image_id、recording_location 和 recording_datetime 列的表就夠了。將 image_id 指定為主鍵。因為授權謂詞和檢索任務中使用了位置和日期時間,所以基於它們創建索引。recording_location 是 SDO_GEOMETRY 類型。該空間數據類型可以保存不同的空間幾何信息。

接下來,向數據庫中導入原始數據。因為原始數據使用的是 Dutch National Grid 格式,需要將它們轉化為世界大地坐標系 (WGS84) 格式。該集合最終包含大約 10 年期間在荷蘭所記錄的近 1 千萬張圖像。

下面我們要設計一個數據模型,其中將包含合同、客戶端、用戶、每個合同的可訪問范圍(使用空間和時間類型)。創建一個名為 condition_sets 的公共視圖,其中集中了來自那些表的數據,從而提供所有“可訪問”的空間和時間范圍組合。最後插入一些測試數據。

要將用戶限制為僅訪問其自己的數據,我們為 condition_sets 定義了以下謂詞:

(WHERE) client_id = SYS_CONTEXT('THE_CTX','THE_CLIENT_ID')

除了 client_id 是在會話上下文(the_ctx)中的 the_clIEnt_id 值內設置的行外,該謂詞將移除其他所有行,從而阻止用戶訪問其無權訪問的數據。該會話上下文使用登錄觸發器創建,登錄觸發器將確定該用戶屬於哪個客戶端。因為 VPD 還提供了一個使用函數來設定上下文的函數,這將使得應用服務器和數據庫之間的會話是持久的,且能夠移除登錄觸發器。

現在需要將這一謂詞附加到 condition_sets 表。Oracle 為此提供了 dbms_rls.add_policy 函數。但它不能直接添加謂詞,而是需要一個返回謂詞的函數。該函數稱為策略函數。因此我在名為 exp_security 的程序包中創建了一個 clIEnt_id_security 函數:

CREATE OR REPLACE PACKAGE exp_security As
FUNCTION clIEnt_id_security(owner VARCHAR2, objname VARCHAR2)
RETURN VARCHAR2;
END exp_security;

該函數的主體如下所示:

CREATE OR REPLACE PACKAGE BODY exp_security Is
FUNCTION clIEnt_id_security(owner VARCHAR2, objname VARCHAR2) RETURN VARCHAR2 IS predicate VARCHAR2(2000);
BEGIn
predicate := 'CLIENT_ID = sys_context(''THE_CTX'',''THE_CLIENT_ID'')';
RETURN predicate;
END clIEnt_id_security;
END;

現在我們已經有了一個策略函數,可以執行特別函數 dbms_rls.add_policy。該函數會將策略函數添加到定義的表或視圖。當選擇來自該表的數據時,將執行策略函數然後返回謂詞。這個謂詞用於在執行查詢前對其進行修改。dbms_rls.add_policy 函數的第一個參數定義擁有表(或視圖)的用戶,表(或視圖)定義為第二個參數。第三個參數賦予該新策略一個名稱,稍後可能使用它來移除或更改策略。第四和五個參數定義要添加哪個策略以及可以找到該策略的位置。最後一個參數定義只有當選擇數據時才使用該策略。

CALL dbms_rls.add_policy('BART', 'condition_sets', 'condition_sets_policy', 'BART', 'exp_security.clIEnt_id_security', 'SELECT');

現在每次查詢 bart.condition_sets 時,都會從策略函數 bart.exp_security.clIEnt_id_security 返回一個謂詞,該謂詞將行限制到當前用戶范圍。現在將使用該謂詞進行查詢修改,如 Truman 模型中所述。在以下段落中,該視圖將用於實際數據的授權。在計算部分中,您將看到修改用戶提交的查詢後的結果。

Images_authorized 和 images_unauthorized 表

應當以兩種方式、按兩種不同的策略完成 images 表的授權。第一個策略應當排除所有不滿足 condition_sets 中授權范圍條件的行。第二個策略應當排除所有授權的圖像行,並隱藏其余行的 imageid。這樣,用戶就可以了解在何時何地形成其當前無法查看的圖像。稍後我們將看到這可用作營銷工具。

要實現它,有兩個選擇:使用兩個公共同義詞和使用視圖。但由於 Oracle 文檔中說明了列級策略(隱藏 ImageId 所必需的)不能應用於同義詞,所以只能選擇為 images 表創建兩個視圖。因為也可以在視圖定義中移除未授權圖像的 image_ids,這與特定的列級策略相反,所以我選擇它。

空間計算應當檢查 recording_location 是否位於特定區域(geo 列)內。Oracle Spatial 為此提供了函數 SDO_INSIDE(geometry1,geometry2)。第一個參數指定表中的幾何列,第二個參數指定來自表中的幾何信息或臨時幾何實例。這意味著該函數不能用在如下的查詢的:

SELECT *
FROM  images
WHERE sdo_inside(recording_location,
SELECT geo
FROM  condition_sets) = 'TRUE';

該查詢應當按如下所示重新編寫:

SELECT *
FROM  images,
condition_sets
WHERE sdo_inside(recording_location,geo) = 'TRUE';

根據此要求,用戶不可能定義向帶默認空間函數的空間數據表添加授權謂詞的策略函數。用戶可以構建一個替代函數,用來檢查所有空間區域上的各個圖像,但這需要額外的工作,且可能導致性能下降。因此,在由 Truman 模型添加的謂詞中執行復雜的空間計算似乎有些問題。所以我必須選擇另外一個選項:不是將 images_authorized 和 images_unauthorized 視圖定義為原始 images 表的副本,而是將二者都定義為 images 表和 conditions_sets 視圖的交叉聯接。這樣就可以使用基於默認空間函數的謂詞。images_authorized 的 SQL 語句應如下所示:

CREATE VIEW images_authorized As
SELECT *
FROM  images,
condition_sets

添加時間謂詞後,將在策略函數中定義的 images_authorized 視圖的完整謂詞如下:

(WHERE) recording_datetime >= start_date
AND recording_datetime<= end_date
AND SDO_INSIDE(recording_location,geo) = 'TRUE'

但是該解決方案有一個問題:如果集合的對象滿足多條件集的條件,則它會在 images_authorized 視圖中毫無必要地出現多次。要解決這個問題,用戶需要在每個查詢中使用不同的選擇器,這是非常不合適的方法。condition_sets 視圖的字段也存在類似的問題,這也是我們不需要的。一個可供用戶訪問的新視圖可以解決這一問題:

CREATE VIEW images_authorized_fixed As
SELECT DISTINCT imageid,
recording_datetime,
recording_location
FROM  images_authorized;

如您所見,添加到 images_authorized(和 images_unauthorized)視圖的謂詞不包括對會話上下文的引用,因為它已經存在於 condition_sets 視圖的謂詞中。因此,空間和時間謂詞也可包含在視圖的實際定義中。condition_sets 視圖的字段也可以排除在外。以下為所得的 SQL 語句:

CREATE VIEW images_authorized As
SELECT images.*
FROM  images,
authorized_sets
WHERE recording_datetime >= start_date
AND recording_datetime <= end_date
AND SDO_INSIDE(recording_location,geo) = 'TRUE';

使用該方法,不必在策略函數中定義空間和時間謂詞。對這兩種設計的分析表明性能上沒有差別。這說明查詢操作對於查詢優化器而言並不是一項繁重的工作。

以上解決方案可達到我們預定的目的:真正地在空間和時間維度上進行數據授權。Truman 模型用於將 condition_sets 視圖中的行限制到當前用戶的行范圍中,並基於一系列個性化條件通過聯接表來對實際數據進行授權。采用該方法創建的新視圖只包含符合 condition_sets 的個性化條件的數據。Truman 模型執行的單一查詢修改因而是全面授權機制的基礎。

最終的體系結構為每個用戶提供三個表。一個表包含授權范圍,一個表包含可訪問的數據,一個表說明不可訪問的數據。因此最後一個表是去除了第二個表的數據的所有數據的集合。最後一個表僅使用信息對象的空間和時間屬性來描述這些對象。

每個表實際上都是基於一系列物理表的公共視圖,這些物理表屬於單個數據庫管理員且普通用戶不能直接訪問。盡管每個視圖在數據庫中僅存在一次,但各用戶的內容不同。

計算

為使用這一體系結構,我們開發了一個專門的軟件組件。使用該工具,可以通過一種易於理解的方式來表示結果。它基於 3-D GIS 應用程序 Google Earth,該應用程序可以動態地以 KML(Keyhole 標記語言)格式從 Web 服務器檢索數據。對於身份驗證,使用基本 HTTP 身份驗證。正如所期望的那樣,激活以 Web 服務器為目標的網絡鏈接後,這將出現在 Google Earth 上:

圖 4 Google Earth 登錄屏幕上顯示的用戶證書用於連接到數據庫

Web 服務器使用提供的證書連接到數據庫。成功建立連接後,即可執行查詢。結果將轉換為 KML 格式,然後返回至 GIS 應用程序。服務器提供的查詢不包含任何數據授權機制,因為該任務完全由數據庫的 VPD 機制承擔。因此,用於選擇當前視口(窗口)中的所有授權圖像的 SQL 語句很簡單,如下所示:

SELECT imageid, recordingdate, recordinglocation
FROM  bart.images_authorized
WHERE  SDO_FILTER(recordinglocation, ?window ) = 'TRUE'

授權決定可視化

下面的圖 5 顯示了向通過身份驗證的用戶提供的 GIS 應用程序。用戶有權訪問左邊的綠色區域,加上一個大的時間范圍。作為上面指定的查詢的結果,每個綠色標記表示一個經過授權的對象(環形全景圖)。數據庫本身將從結果集中刪除授權區域之外的環形全景圖。正如所期望的那樣,所有綠色標記都位於授權五邊形中(和表示時間范圍的兩層之間)。添加未授權的對象以顯示授權機制的有效性。要檢索這些未授權的對象,使用 images_unauthorized 視圖執行一個類似於上面的查詢。

圖 5 在 Google Earth 中通過每個標記的顏色來表示由數據庫執行的授權決定。綠色標記表示可以訪問的環形全景圖,紅色標記表示不可訪問。

單擊屬於授權的環形全景圖的標簽後,它將呈現在 GIS 應用程序的窗口中。當用戶請求未經授權的項時,將彈出窗口提醒用戶他不能訪問該資源,並提供與銷售部門進行聯系的鏈接。

圖 6 可在 GIS 應用程序中查看的授權環形全景圖,其標記為藍色。未經授權的環形全景圖的標記僅提供一些元數據,以及用於和銷售部門聯系的鏈接。

最近鄰居查詢:信息洩露

除窗口查詢外,在 CycloMedia 這一案例中,找到離某個位置最近的圖像也很重要。Oracle Spatial 為此提供了 sdo_nn 函數:

SELECT|  imageid, recordingdate, recordinglocation
|FROM|   bart.images_authorized
|WHERE|  |SDO_NN|(recordinglocation, ?geometry, |'sdo_batch_size=10'|) = |'TRUE'| and ROWNUM <2;|

執行該查詢後,得到的結果看起來令人滿意。在大部分情況下找到了最近的圖像。然而,在某些位置卻沒有找到結果,這令我感到疑惑。因為沒有定義約束(如最大距離),這是無法預料的。使用一些測試數據進行調查後發現,最近鄰居查詢可能(如手冊中所描述的那樣)“需要多次計算以返回所要求數量的、同時還滿足 WHERE 子句中其他條件的結果。”然而,以上語句中的 WHERE 子句不包含任何其他條件。對一些測試數據執行一些查詢後,我發現了一些情況:如果在比最近的經授權的圖像更近的位置發現了未經授權的對象,將不返回結果。後果是會洩露未經授權的對象的位置信息。為解決這一問題,在使用篩選數據的聯接創建引用表的情況下,還需多次計算 sdo_nn,這與使用 image_authorized 表的情況一樣。由於用戶可能對此不了解,這一發現是令人吃驚的且意味著一個嚴重的問題,因為數據庫洩露了數據。

通過使用 within_distance 函數創建一個經授權的子集,然後對結果排序,再返回第一行,可為解決該問題提供一個變通方法。但它解決不了普通的最近鄰居函數存在的問題。

圖 7 在本圖中用戶選擇了他想用 crosshair 工具查看的位置。數據庫搜索一定范圍內最近的經授權的環形全景圖,在地圖上標記它並顯示在 GIS 應用程序中。視圖還自動以原始位置的方向打開。

復雜的時空任務

在 CycloMedia 案例中,用戶常常只對最新的環形全景圖感興趣。實現此目的的最新方法是基於記錄策略並使用數據集的:對區域進行完全拍攝並放入新數據集中,用其替換現有數據集。該方法的缺點是如果新數據集不完整,就會出現差異。這對於用於感知位置的解決方案來說,是不希望出現的事情。除此之外,數據集的管理也需要很大的工作量。

要在新體系結構中完成該任務,我們需要創建一個適當的查詢。這是一項相當復雜的任務,因為它涉及對象間的時空關系。對於每個對象,需要分析到其他老對象的空間距離,當找到這一對象後,需要將其排除在結果集外。然而,當時間距離很小時,則不應當排除它,因為兩個對象是相關的。要理解此過程,用戶應當認識到環形全景圖是以持續的序列進行記錄的。因此,空間距離小的兩個環形全景圖間的時間間距通常也比較小。所以一定的時間阈值是很重要的。在 SQL 中,該任務相對容易定義,結果也符合預期。

下圖在Google Earth中顯示了這一查詢的結果。縱向維度(通常是緯度)用於以可視化方式呈現集合中的時間維度。最高的對象是最新的。圍繞著每個最新對象的綠色圓柱表示它所涵蓋的時空范圍。圓柱中的對象(以黃色標記標示)可從結果集中移除,因為它們不再相關。

圖 8 復雜的時空查詢機制也可在 GIS 應用程序中實現可視化。

性能

除了正確的授權決定外,體系結構的性能也很重要。構建體系結構所基於的測試平台不是很理想:Enterprise DBMS、中間件軟件和 GIS 應用程序運行於同一台計算機上。然而,總體性能是足夠的,因為測試實施能滿足使用直接操作界面的要求。一些可伸縮性測試也證實了這一點。對 Truman 模型來說,性能不是問題,即使在復雜的空間和時間授權條件下。

結論

本文提出並證實了通過利用兩個新推出的數據庫管理系統(Truman 模型和 SFS)概念,可以由 DBMS 本身在時空維度上動態地對動態集合進行授權,同時提供檢索支持。

該體系結構的主要優勢是授權機制並不會以任何方式破壞數據的使用。該體系結構的另一個重要優點是它能夠處理動態數據集合。第三個優點是用於空間數據可視化和管理的普通工具無需修改仍可使用。

通過在 GIS 應用程序中實現幾個檢索任務的可視化,我們可以查看受監視的授權機制的正確性。這表明,總的來說正確實施了空間和時間授權。然後,使用默認函數查詢最近的鄰居時,我們在授權機制中發現了信息洩露。對於某些應用程序來說這可能是一個大問題,它會影響用戶對該體系結構的信心。有必要對該主題進行更多的研究。

Microsoft Research 最新發布的一篇文章討論了 Truman 模型(未在 Microsoft SQL Server 中實施)。通過對當前 SQL 授權機制的設計進行嚴謹的總結歸納,本文提出了一種分配謂詞授權的新方法。以下是一個授權查詢示例:

GRANT SELECT employees
WHERE    emp_id = user_id()
TO      PUBLIC

因此,謂詞將納入到普通的授權語句中。這與 Oracle VPD 實施相反,Oracle VPD 實施將策略定義與 SQL 授權模型相分離。在我看來,這一新方法是細度訪問控制所應采取的,且我希望看到這一提案成為完全參考實施的基礎。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved