在应用系统开发领域,功能权限和数据权限两层权限体系占到了安全功能性需求的大半。除了在应用程序层面进行处理之外,我们其实还可以从数据库层面实现数据权限访问的。
Oracle VPD(Virtual Private Database)就是从数据库层面实现数据访问控制的一种成熟技术。借助VPD,一些已经上线或者不容易进行二次开发的功能可以比较容易的解决。

1、VPD简述

从产品属性来看,Oracle Virtual Private Database(简称VPD)是归属在Oracle安全security框架下的成熟产品。要注意:VPD是企业版Enterprise版本功能,在其他如标准Standard版下是不能使用的。
简单的说,VPD就是介于用户SQL语句和实际执行对象之间的介质层。用户或者应用程序发出的SQL语句在传入到DBMS执行之前,会自动被拦截并且进行额外处理。处理的结果往往反映为在语句where条件中添加特殊的条件式。
例如:数据表T中包括了所有供应商的信息,设计者系统任何SQL语句发送之后,都只能查看到location=’北京’的记录。在没有VPD的情况下,我们必须修改应用程序代码,将location=’北京’加入到所有对应数据表操作SQL语句中。
借助VPD,应用程序不需要修改任何代码。我们只需要在数据库层面设定一个指定策略规则,如果针对某个数据对象表的所有SQL语句,都会调用一个设定的函数。函数自身会返回一个字符串条件,作为补充的where语句条件。
例如:如果我们设定对数据表t的每个Select语句都要添加一个条件object_id<100,那么即使应用层发出了select * from t,那么实际执行的也都是select * from t where object_id<100。
下面我们通过一系列的实验来进行验证演示。

2、环境介绍和配置

我们选择Oracle 11g企业版进行测试。

SQL> select * from v$version;

BANNER

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production

注意:只有在其中明确标注Enterprise Edition才认为是企业版Oracle。否则是标准版。
创建专门用户用于实验。

SQL> create user vpd identified by vpd;
User created

SQL> grant resource, connect to vpd;
Grant succeeded

SQL> grant execute on dbms_rls to vpd;
Grant succeeded

SQL> grant select any dictionary to vpd;
Grant succeeded

在vpd schema下创建数据表T。

SQL> conn vpd/vpd@ora11g;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as vpd

SQL> create table t as select * from dba_objects;
Table created

SQL> select count(*) from t;

COUNT(*)

 86032

目标是使用VPD实现数据隐藏:只有VPD用户查询数据表T才能获取全文,其他schema读取不到其中数据。

3、配置VPD

配置VPD第一步是定义处理函数,我们需要函数的意义是返回一个字符串条件列。在函数中,我们可以根据不同的情况插入自由的逻辑。

针对这个需求,首先需要获取到查询用户的schema名称才能判断。于是,函数为:

SQL> create or replace function f_limit_access
2 (
3 vc_schema varchar2,
4 vc_object varchar2
5 ) return varchar2
6 as
7 vc_userid varchar2(100);
8 begin
9 select SYS_CONTEXT(‘USERENV’,’SESSION_USER’)
10 into vc_userid
11 from dual;
12
13 if (trim(vc_userid)=’VPD’) then
14 return ‘1=1’;
15 else
16 return ‘1=0’;
17 end if;
18
19 end;
20 /

Function created

sys_context函数可以获取到当前用户名信息,做出判断。输入参数vc_schema和vc_object是作为调用点,可以逆向插入回去的。
第二步,使用dbms_rls函数包创建访问策略policy。

SQL> exec dbms_rls.add_policy(object_schema => ‘VPD’,object_name => ‘T’,policy_name => ‘VPD_TEST’,function_schema => ‘VPD’,policy_function => ‘F_LIMIT_ACCESS’);

PL/SQL procedure successfully completed

注意:这其中参数含义为:object_schema表示希望给schema对象添加policy,object_name为具体哪个对象。policy_name表示策略的名称。function_schema和policy_function表示处理函数所在的schema和函数名称。
视图user_policies可以查看到当前schema下策略信息。

SQL> select policy_name, SEL, INS, UPD, DEL, IDX, CHK_OPTION, ENABLE from user_policies;

POLICY_NAME SEL INS UPD DEL IDX CHK_OPTION ENABLE


VPD_TEST YES YES YES YES NO NO YES

此时用户为vpd,查看数据T结果如下:

SQL> select count(*) from t;

COUNT(*)

 86032

切换到另一个用户,虽然有访问数据表权限,但是结果变化。

–sys下运行
SQL> grant select any table to scott;
Grant succeeded

SQL> conn scott/tiger@ora11g
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as scott

SQL> select count(*) from vpd.t;

COUNT(*)

     0

即使是system这样的高权限用户,结果一样。

SQL> alter user system identified by oracle;
User altered

SQL> conn system/oracle@ora11g;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as system

SQL> select count(*) from vpd.t;

COUNT(*)

     0

但是,唯独对sys用户,所有的policy是失效的,这也就是VPD的一个特点和问题。

SQL> conn sys/oracle@ora11g as sysdba
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.4.0
Connected as SYS

SQL> select count(*) from vpd.t;

COUNT(*)

 86032

4、结论

作为早期Oracle提供的一种数据安全策略,VPD在应用和数据库之间建立了插入语句屏障。在没有办法修改代码的情况下,一些简单的数据权限需求是可以通过VPD解决的。
但是,也要看到VPD的局限性,比如sys访问,安全策略容易被攻破等。这些都可以使用更高级的Oracle策略外加应用程序、管理手段进行弥补,实现相对的安全。

oracle vdp 实现数据权限相关推荐

  1. 循序渐进学Oracle之索引、权限、角色

    一.索引简介: 索引是用于加速数据存取的数据对象,合理的使用索引可以大大降低I/O次数,从而提高数据访问性能.索引有很多种主要介绍常用的几种: 1-单列索引: 单列索引是基于单个列所建立的索引,语法: ...

  2. oracle tns 代理配置_OGG实现Oracle到MySQL数据平滑迁移

    技术分享 | 使用OGG实现Oracle到MySQL数据平滑迁移 - 爱可生开源社区​opensource.actionsky.com 一.OGG概述 OGG全称为Oracle GoldenGate, ...

  3. oracle导出对象和数据,浅析Oracle对象和数据的导入导出

    对于Oracle对象和数据的导入导出,我们会用到一些小工具.以前我们一般都是使用PL/SQL Developer来实现,但是PL/SQL Developer在导出.导入数据时有两个问题: 1.要把表数 ...

  4. oracle9I收缩表,Oracle 9i删除数据表(转)

    Oracle 9i删除数据表(转)[@more@] 数据表的删除比较简单,表删除后其占用的空间就被系统释放和回收,表的删除是无法回滚的操作.可删除的内容包括. 表的定义 表中的数据 表中的索引 表中的 ...

  5. Transform数据权限浅析2之利用Java完成权限设置

    Transform数据权限浅析2之利用Java完成权限设置 一:项目背景 1.1:cognos的两种建模工具 为了更好的满足客户的需求,提升报表展现的效率,一种建模工具已经不能满足报表开发和展现的需要 ...

  6. oracle用户获取datameta权限,Oracle数据库提权(低权限提升至dba)

    0x01 Oracle存储过程"缺陷" 在 Oracle 的存储过程中,有一个有趣的特点:运行权限.运行权限分为两种,definer 和 invoker. definer 为函数创 ...

  7. oracle导出数据视频教程,Oracle导入导出数据的几种方式

    oracle导入导出数据 1.导出dmp格式文件 --备份某几张表 !!!! exp smsc/smsc file=/data/oracle_bak/dmp/bakup0209_2.dmp table ...

  8. oracle 数据导入 mysql_oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)...

    这篇文章主要介绍了oracle导入导出数据的二种方法,利用PL/SQL Developer工具导出和利用cmd的操作命令导出的出方法,大家参考使用吧 方法一:利用PL/SQL Developer工具导 ...

  9. 使用 ADO.NET 和 Oracle 进行高级数据访问

    使用 ADO.NET 和 Oracle 进行高级数据访问 [转自MSDN] 发布日期: 11/4/2004 | 更新日期: 11/4/2004 Bill Hamilton 适用范围: Microsof ...

最新文章

  1. Spring @Scheduled
  2. HTML中嵌套的子frame如何访问父页面中的函数?
  3. Ajax Toolkit Control ——CollapsiblePanelExtender(隐藏显示效果)
  4. 数据产品必备技术知识:机器学习及常见算法,看这一篇就够了
  5. 3 tables in management a company
  6. Android studio .gitignore 文件的内容
  7. Azkaban-two_server模式-job任务运行
  8. C++Primer学习笔记:第6章 函数
  9. 噪声调频 matlab,如何用matlab编写噪声调频干扰信号
  10. 高通总裁安蒙在“GSMA Thrive”中分享了哪些关键信息?
  11. undefined reference to symbol' pthread_create@@GLIBC_2.2.5'
  12. Qt 周立功USBCAN总线上位机
  13. 用实际程序来测试udp sendto函数的最大发包大小------为什么是65507?
  14. 专用计算机数控编程软件有哪些,大家都用什么数控编程软件
  15. 华硕a豆安装ubuntu14.04系统开启wifi
  16. gird布局几种用法
  17. obs多推流地址_如何用OBS将腾讯会议推流到一直播上进行直播
  18. jxl导出excel标题乱码
  19. 100以内的质数及100以内质数的和
  20. Android 9的神经网络API

热门文章

  1. 软件程序流程图使用规范
  2. 高精度气压传感器BMP280代码与解析
  3. C++入门教程||C++ 动态内存||C++ 命名空间
  4. 哈希传递攻击/黄金白银票据
  5. 4GWiFi无线智能计量插座mqtt/http协议平台对接电压电流功率监测开放API接口
  6. valorant服务器显示AP,Valorant安装好了之后不断提示重启的解决方法
  7. 英文、符号间距突然变大:全角半角快捷键误触(Shift+空格)
  8. {字母=2}履踩厦婪河运{字母=3}徒辖兔渡吧啪颊鼻驹{字母=1}
  9. jetson-inference error code 10 internal error (could not find any implementation for node) #1499
  10. SpringBoot 整合163邮箱 阿里云25端口问题