授权访问动态时空数据.docx
《授权访问动态时空数据.docx》由会员分享,可在线阅读,更多相关《授权访问动态时空数据.docx(16页珍藏版)》请在冰豆网上搜索。
![授权访问动态时空数据.docx](https://file1.bdocx.com/fileroot1/2023-2/9/0054e69c-3e62-487c-931a-a368d917abdd/0054e69c-3e62-487c-931a-a368d917abdd1.gif)
授权访问动态时空数据
架构师:
安全性
授权访问动态时空数据
根据空间和时间参照进行个体数据对象访问授权是一项复杂的工作。
阅读本文了解一个可行的方法。
作者:
BartvanVelden
2008年4月发布
在集合和用户群规模都较大且是动态的情况下,对集合中的单个数据对象进行访问授权会比较困难。
如果授权策略是基于数据对象的时间和空间参照,这将变得更为复杂。
本文以我的公司CycloMediaTechnology的真实场景为例,给大家介绍了这一问题的解决方案,该方案结合使用了 Oracle数据库企业版的两个组件:
Spatial选件和虚拟专用数据库特性。
CycloMediaTechnology
CycloMedia专业从事基于360度的全景图像(即环形全景图)实现环境的系统性大规模可视化。
要创建环形全景图,需要对广阔区域进行拍照,并将其输入到联机数据库。
注册完每个记录、位置、方位后,就可以实现多样化的应用,如3-D测量和建模。
(请参见以下示例。
)
图像Id
记录位置
记录日期时间
43c5klf8h0cg
5.70698580234006,50.8474750817698
2005-03-1215:
22
6ju83ks7u6pg
4.59019800392403,52.4622636292842
2004-08-0208:
51
85s8hi4nl7u2
6.9008111752263,52.4115443666161
2006-06-2112:
17
....
....
....
图1 使用地理空间数据的环形全景图示例
DCR7是CycloMedia自行开发的一系列记录系统中最新的模型,可用于表现外观质量、量度精度和高速直观记录。
DCR7能够以5米间隔、80公里/小时的速度生成环形全景图,CycloMedia有意使用它将欧洲大部分公共空间转化为图像。
由于这些进步,环形全景图集合有望快速增长。
授权挑战
在CycloMedia案例中,我们面临着这样一种情况,即需要向许多用户授予对带有空间和时间参照的动态对象集合的访问权。
授权参数基于集合的时间和空间维度。
传统上,这一问题的解决方案是创建静态数据集或授权表来描述每个主体(客户端或用户)与集合中各对象之间的每一种单一关系。
构建这些数据集和表通常要使用专业工具来计算对象和授权区域之间的空间关系。
当用户群体和集合都较大且是动态的情况下,构建和维护这些即席数据集和授权表以支持访问控制并不合适。
而且,即席数据不支持访问控制策略中的灵活保护粒度和动态变化。
近来提出的几个解决方案有着不同缺点。
导致这些缺点的主要原因与所提出的解决方案的体系结构相关。
在数据库外实施授权,或在执行查询后实施授权,因此限制了数据的使用。
甚至OpenGeospatialConsortium当前建议的新标准GeoXACML体系结构也存在问题。
它基于用于空间数据(GML、WMS)和授权(XACML)的标准,为不受保护的Web地图服务提供了一种无需更改现有基础架构即可进行访问控制的解决方案。
为此,它拦截了传输至WMS的消息,对目标WMS执行检索任务,将检索结果发送至决策点,然后基于得到的授权决定创建结果集。
这一概念在很大程度上基于这一体系结构原型,该原型会导致一些效率低下的后果:
所有数据均选自原始数据库,然后转换为GML,再使用外部工具根据授权策略按特征逐一划分并计算。
因此无法使用原始数据库中的空间索引,而且必须在其他组件中实施空间比较函数。
另外,该体系结构不能执行复杂的分析任务,因为数据首先经过了选择然后依据授权策略进行了筛选。
即使是简单查询最近邻居也会出问题:
您最后可能会发现一开始所选择的最近对象是无法到达的。
数据库级授权评估
因为主流数据库已经实施了空间数据类型和空间函数(通常基于OpenGeospatialConsortium的SFS[空间类型和函数]标准),在数据库级别上执行授权策略似乎是可行的。
然而,当前的SQL授权机制却限制在表、视图和列级别上。
用户可以想像为每个用户创建视图,但如果有大量用户和不断变化的策略,该方法将再次失效。
由于上述问题,当前的信息系统通常绕过数据库访问控制工具,将访问控制嵌入到用于访问数据库的应用程序中。
这可以是最终用户应用程序或中间件应用程序。
将访问控制嵌入到最终用户应用程序中的情况下,如果用户无法控制应用程序的来源或者使用了多个应用程序,那么就会出问题。
授权策略的变化也必须应用于多个控制机制,但甚至在那种情形下用户也依赖于应用更新策略来使更改生效。
此外,还存在着用户或黑客提交随意性查询的风险。
第二个选择是在中间件应用程序中构建查询。
然后,该应用程序应编辑由最终用户应用程序执行的查询,以加入授权策略。
然而,当遇到复杂的检索任务和经常变化的授权策略时,这将变得非常困难。
另外一个选择是提供几个默认的检索任务作为最终用户应用程序的函数。
尽管这可能会简化过程,但它直接限制了用户的选择。
数据库级授权执行
出于上述原因,理想情况下应该在数据库级指定并实施细粒度的访问控制。
U.C.Berkeley的ShariqRizvi和其他人提出了Truman模型,该模型基于数据库级别修改查询,以包括授权策略。
尽管其他人曾讨论过这一概念,但Truman模型使用参数化的视图框架对这一在数据库级修改查询的方法进行了统一。
Truman模型背后的想法是为每个用户提供完整数据库的个人限制性视图。
为实现此目的,需要对用户的查询进行修改以确保用户不能查看允许之外的内容。
将授权策略加入提交的查询作为谓词,这些策略实际上就是逻辑表达式。
下面是该模型的示意图。
图2 Truman模型:
用户提供的query将重写至query´,由系统执行。
因为查询的修改过程对用户是透明的,用户几乎不会察觉到访问控制机制的存在。
因此,最终用户将认为该体系结构没有对数据应用限制,他可以访问表中的所有对象。
Truman模型视图示意图:
图3 Truman模型下的查询修改对用户是透明的。
由于这一原因,也可以这样认为,在该模型中,用户查询中的每个关系由用户有权查看的视图所代替。
Truman模型有时也称为细粒度访问控制 (FGAC)或行级安全 (RLS)。
(该模型名称的灵感源自于1998年的电影 TheTrumanShow 中TrumanBurbank角色所处的人工世界)。
该模型的优点包括:
单点授权实施、可以拥有动态的集合、最终用户查询功能以及高效的数据处理(这是空间数据一个主要方面)。
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类型。
该空间数据类型可以保存不同的空间几何信息。
接下来,向数据库中导入原始数据。
因为原始数据使用的是DutchNationalGrid格式,需要将它们转化为世界大地坐标系(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函数:
CREATEORREPLACEPACKAGEexp_securityAS
FUNCTIONclient_id_security(ownerVARCHAR2,objnameVARCHAR2)
RETURNVARCHAR2;
ENDexp_security;
该函数的主体如下所示:
CREATEORREPLACEPACKAGEBODYexp_securityIS
FUNCTIONclient_id_security(ownerVARCHAR2,objnameVARCHAR2)RETURNVARCHAR2ISpredicateVARCHAR2(2000);
BEGIN
predicate:
='CLIENT_ID=sys_context(''THE_CTX'',''THE_CLIENT_ID'')';
RETURNpredicate;
ENDclient_id_security;
END;
现在我们已经有了一个策略函数,可以执行特别函数dbms_rls.add_policy。
该函数会将策略函数添加到定义的表或视图。
当选择来自该表的数据时,将执行策略函数然后返回谓词。
这个谓词用于在执行查询前对其进行修改。
dbms_rls.add_policy函数的第一个参数定义拥有表(或视图)的用户,表(或视图)定义为第二个参数。
第三个参数赋予该新策略一个名称,稍后可能使用它来移除或更改策略。
第四和五个参数定义要添加哪个策略以及可以找到该策略的位置。
最后一个参数定义只有当选择数据时才使用该策略。
CALLdbms_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列)内。
OracleSpatial为此提供了函数SDO_INSIDE(geometry1,geometry2)。
第一个参数指定表中的几何列,第二个参数指定来自表中的几何信息或临时几何实例。
这意味着该函数不能用在如下的查询的:
SELECT*
FROMimages
WHEREsdo_inside(recording_location,
SELECTgeo
FROMcondition_sets)='TRUE';
该查询应当按如下所示重新编写:
SELECT*
FROMimages,
condition_sets
WHEREsdo_inside(recording_location,geo)='TRUE';
根据此要求,用户不可能定义向带默认空间函数的空间数据表添加授权谓词的策略函数。
用户可以构建一个替代函数,用来检查所有空间区域上的各个图像,但这需要额外的工作,且可能导致性能下降。
因此,在由Truman模型添加的谓词中执行复杂的空间计算似乎有些问题。
所以我必须选择另外一个选项:
不是将images_authorized和images_unauthorized视图定义为原始images表的副本,而是将二者都定义为images表和conditions_sets视图的交叉联接。
这样就可以使用基于默认空间函数的谓词。
images_authorized的SQL语句应如下所示:
CREATEVIEWimages_authorizedAS
SELECT*
FROMimages,
condition_sets
添加时间谓词后,将在策略函数中定义的images_authorized视图的完整谓词如下:
(WHERE)recording_datetime>=start_date
ANDrecording_datetime<=end_date
ANDSDO_INSIDE(recording_location,geo)='TRUE'
但是该解决方案有一个问题:
如果集合的对象满足多条件集的条件,则它会在images_authorized视图中毫无必要地出现多次。
要解决这个问题,用户需要在每个查询中使用不同的选择器,这是非常不合适的方法。
condition_sets视图的字段也存在类似的问题,这也是我们不需要的。
一个可供用户访问的新视图可以解决这一问题:
CREATEVIEWimages_authorized_fixedAS
SELECTDISTINCTimageid,
recording_datetime,
recording_location
FROMimages_authorized;
如您所见,添加到images_authorized(和images_unauthorized)视图的谓词不包括对会话上下文的引用,因为它已经存在于condition_sets视图的谓词中。
因此,空间和时间谓词也可包含在视图的实际定义中。
condition_sets视图的字段也可以排除在外。
以下为所得的SQL语句:
CREATEVIEWimages_authorizedAS
SELECTimages.*
FROMimages,
authorized_sets
WHERErecording_datetime>=start_date
ANDrecording_datetime<=end_date
ANDSDO_INSIDE(recording_location,geo)='TRUE';
使用该方法,不必在策略函数中定义空间和时间谓词。
对这两种设计的分析表明性能上没有差别。
这说明查询操作对于查询优化器而言并不是一项繁重的工作。
以上解决方案可达到我们预定的目的:
真正地在空间和时间维度上进行数据授权。
Truman模型用于将condition_sets视图中的行限制到当前用户的行范围中,并基于一系列个性化条件通过联接表来对实际数据进行授权。
采用该方法创建的新视图只包含符合condition_sets的个性化条件的数据。
Truman模型执行的单一查询修改因而是全面授权机制的基础。
最终的体系结构为每个用户提供三个表。
一个表包含授权范围,一个表包含可访问的数据,一个表说明不可访问的数据。
因此最后一个表是去除了第二个表的数据的所有数据的集合。
最后一个表仅使用信息对象的空间和时间属性来描述这些对象。
每个表实际上都是基于一系列物理表的公共视图,这些物理表属于单个数据库管理员且普通用户不能直接访问。
尽管每个视图在数据库中仅存在一次,但各用户的内容不同。
计算
为使用这一体系结构,我们开发了一个专门的软件组件。
使用该工具,可以通过一种易于理解的方式来表示结果。
它基于3-DGIS应用程序GoogleEarth,该应用程序可以动态地以KML(Keyhole标记语言)格式从Web服务器检索数据。
对于身份验证,使用基本HTTP身份验证。
正如所期望的那样,激活以Web服务器为目标的网络链接后,这将出现在GoogleEarth上:
图4 GoogleEarth登录屏幕上显示的用户证书用于连接到数据库
Web服务器使用提供的证书连接到数据库。
成功建立连接后,即可执行查询。
结果将转换为KML格式,然后返回至GIS应用程序。
服务器提供的查询不包含任何数据授权机制,因为该任务完全由数据库的VPD机制承担。
因此,用于选择当前视口(窗口)中的所有授权图像的SQL语句很简单,如下所示:
SELECTimageid,recordingdate,recordinglocation
FROMbart.images_authorized
WHERESDO_FILTER(recordinglocation,?
window)='TRUE'
授权决定可视化
下面的图5显示了向通过身份验证的用户提供的GIS应用程序。
用户有权访问左边的绿色区域,加上一个大的时间范围。
作为上面指定的查询的结果,每个绿色标记表示一个经过授权的对象(环形全景图)。
数据库本身将从结果集中删除授权区域之外的环形全景图。
正如所期望的那样,所有绿色标记都位于授权五边形中(和表示时间范围的两层之间)。
添加未授权的对象以显示授权机制的有效性。
要检索这些未授权的对象,使用images_unauthorized视图执行一个类似于上面的查询。
图5 在GoogleEarth中通过每个标记的颜色来表示由数据库执行的授权决定。
绿色标记表示可以访问的环形全景图,红色标记表示不可访问。
单击属于授权的环形全景图的标签后,它将呈现在GIS应用程序的窗口中。
当用户请求XX的项时,将弹出窗口提醒用户他不能访问该资源,并提供与销售部门进行联系的链接。
图6 可在GIS应用程序中查看的授权环形全景图,其标记为蓝色。
XX的环形全景图的标记仅提供一些元数据,以及用于和销售部门联系的链接。
最近邻居查询:
信息泄露
除窗口查询外,在CycloMedia这一案例中,找到离某个位置最近的图像也很重要。
OracleSpatial为此提供了sdo_nn函数:
SELECT|imageid,recordingdate,recordinglocation
|FROM|bart.images_authorized
|WHERE||SDO_NN|(recordinglocation,?
geometry,|'sdo_batch_size=10'|)=|'TRUE'|andROWNUM<2;|
执行该查询后,得到的结果看起来令人满意。
在大部分情况下找到了最近的图像。
然而,在某些位置却没有找到结果,这令我感到疑惑。
因为没有定义约束(如最大距离),这是无法预料的。
使用一些测试数据进行调查后发现,最近邻居查询可能(如手册中所描述的那样)“需要多次计算以返回所要求数量的、同时还满足WHERE子句中其他条件的结果。
”然而,以上语句中的WHERE子句不包含任何其他条件。
对一些测试数据执行一些查询后,我发现了一些情况:
如果在比最近的经授权的图像更近的位置发现了XX的对象,将不返回结果。
后果是会泄露XX的对象的位置信息。
为解决这一问题,在使用筛选数据的联接创建引用表的情况下,还需多次计算sdo_nn,这与使用image_authorized表的情况一样。
由于用户可能对此不了解,这一发现是令人吃惊的且意味着一个严重的问题,因为数据库泄露了数据。
通过使用within_distance函数创建一个经授权的子集,然后对结果排序,再返回第一行,可为解决该问题提供一个变通方法。
但它解决不了普通的最近邻居函数存在的问题。
图7 在本图中用户选择了他想用crosshair工具查看的位置。
数据库搜索一定范围内最近的经授权的环形全景图,在地图上标记它并显示在GIS应用程序中。
视图还自动以原始位置的方向打开。
复杂的时空任务
在CycloMedia案例中,用户常常只对最新的环形全景图感兴趣。
实现此目的的最新方法是基于记录策略并使用数据集的:
对区域进行完全拍摄并放入新数据集中,用其替换现有数据集。
该方法的缺点是如果新数据集不完整,就会出现差异。
这对于用于感知位置的解决方案来说,是不希望出现的事情。
除此之外,数据集的管理也需要很大的工作量。
要在新体系结构中完成该任务,我们需要创建一个适当的查询。
这是一项相当复杂的任务,因为它涉及对象间的时空关系。
对于每个对象,需要分析到其他老对象的空间距离,当找到这一对象后,需要将其排除在结果集外。
然而,当时间距离很小时,则不应当排除它,因为两个对象是相关的。
要理解此过程,用户应当认识到环形全景图是以持续的序列进行记录的。
因此,空间距离小的两个环形全景图间的时间间距通常也比较小。
所以一定的时间阈值是很重要的。
在SQL中,该任务相对容易定义,结果也符合预期。
下图在GoogleEarth中显示了这一查询的结果。
纵向维度(通常是纬度)用于以可视化方式呈现集合中的时间维度。
最高的对象是最新的。
围绕着每个最新对象的绿色圆柱表示它所涵盖的时空范围。
圆柱中的对象(以黄色标记标示)可从结果集中移除,因为它们不再相关。
图8 复杂的时空查询机制也可在GIS应用