虚拟私有数据库(VPD)
VPD还有其他几个名称,包括行级安全性(Row-level security,RLS)和高精度访问控制(Fine-grained
access control,FGAC)。不管采用什么名称,VPD都提供了访问Oracle数据的一种全新方式。
VPD要求创建一个安全策略。当用户访问一个含有安全策略的表(或视图)时:
-
Oracle调用策略函数,它返回一个谓词(predicate)。谓词是一个WHERE子句,它对表中的一个特定的行集合进行限定。
- Oracle动态重写查询,方法是将谓词追加到用户的SQL语句之后。
VPD需要一个用于控制表和行访问的策略,如图A所示。
图A

策略函数根据函数调用期间可用的任何会话环境变量来生成谓词。这些变量通常基于应用程序上下文来显示。
针对目标表执行一个查询时,Oracle会调用策略,并使用追加到查询末尾的一个WHERE子句谓词来生成一个瞬态视图,比如:
SELECT * FROM scott.emp WHERE P1
VPD具有多方面的好处:
- 动态安全性——不需要维护复杂的角色和授予
- 多种安全性——为每个对象设置多个策略,并将它们堆叠在其他基本策略之上
- Web应用程序——由于是单个用户访问数据库,所以行级安全性很容易在不同的用户之间加以区分
- 没有后门——用户不能绕过嵌入应用程序的安全策略,因为安全策略已经附加到数据上
|