在集合和用户群规模都较大且是动态的情况下,对集合中的单个数据对象进行访问授权会比较困难。如果授权策略是基于数据对象的时间和空间参照,这将变得更为复杂。本文以我的公司
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 授权模型相分离。在我看来,这一新方法是细度访问控制所应采取的,且我希望看到这一提案成为完全参考实施的基础。
|