`
chenhua_1984
  • 浏览: 1255405 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论
阅读更多

1什么是VPD?

虚拟专用数据库 (VPD) 提供了角色和视图无法提供的行级访问控制。对于互联网访问,虚拟专用数据库可以确保在线银行的客户只能看到他们自己的帐户。Web 托管公司可以在同一 Oracle 数据库中维护多个公司的数据,但只允许每个公司查看其自身数据。

在企业内部,虚拟数据库可在应用程序部署方面降低拥有成本。可以在数据库服务器一次实现安全性,而不用在访问数据的每个应用程序中分别实现安全性。因为是在数据库中实施安全性,所以不管用户访问数据的方式如何,安全性较以前更高。访问即席查询工具或新报表生成程序的用户不再能绕过安全环节

 

2VPD是如何工作的?

将一个或多个安全策略与表或视图关联后,就可以实现虚拟专用数据库。对带安全策略的表进行直接或间接访问时,数据库将调用一个实施该策略的函数。策略函数返回一个访问条件(WHERE 子句),即谓词。应用程序将它附加到用户的 SQL 语句,从而动态修改用户的数据访问权限。

你可以通过编写一个存储过程将 SQL 谓词附加到每个 SQL 语句(用于控制该语句的行级别访问权限)来实施 VPD。例如,如果 John Doe(他属于 Department 10)输入 SELECT * FROM emp 语句,则可以使用 VPD 添加 WHERE DEPT = 10 子句。这样,您便可以通过对查询进行修改来限制访问某些行的数据。

 

3简单案例

二、使用VPD的示例:

1)未进行权限控制时,执行的查询语句,可以看到所有商品在2002年的销售额:
SELECT year, prod_category, sum(sales)
FROM sales_mv
WHERE year = '2002';

2)如果加上了VPD策略,限制访问指定范围内的产品(例如仅能访问'VIDEOS','RADIOS'),
再执行上述的查询语句,会自动加上限制条件--AND prod_category in ('VIDEOS','RADIOS'),最后实际执行的语句为:

SELECT year, prod_category, sum(sales)
FROM sales_factWHERE year = '2002'
AND prod_category in ('VIDEOS','RADIOS'); --自动加上的限制条件

 

 

 

操作过程

1:确定数据库对象及互相之间的关系
1)相关表和视图
数据库中有两类表,代码表和数据表,数据表均有一个“机构代码”字段(DM_JG),
其“前七位”等于用户代码表的“机构代码”
建立脚本:
CREATE TABLE dm_users
( user_dm VARCHAR2(11) NOT NULL,
jg_dm VARCHAR2(11) NOT NULL
);

CREATE TABLE DIM_JBXX
(pk VARCHAR2(50) NOT NULL,
data VARCHAR2(11)
jg_dm VARCHAR2(11) NOT NULL); --www.chq.name

CREATE VIEW VIEW_JBXX as select * from DIM_JBXX
;

2)相关用户,并为其授权
相关用户有三个:
VPD:数据表和VPD对象的属主,允许访问全部数据;
1234502 :数据访问用户,其用户名为其单位代码的前7位,访问受限用户
建立脚本:
CONNECT sys/password@www.chq.name AS SYSDBA;
CREATE USER VPD IDENTIFIED BY VPD
DEFAULT TABLESPACE VPD TEMPORARY TABLESPACE temp;
GRANT connect, resource TO VPD;

CREATE USER 1234502 IDENTIFIED BY 1234502
DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
GRANT connect, resource TO 1234502;


GRANT EXECUTE ON DBMS_RLS TO PUBLIC;

CONN VPD/VPD@www.chq.name

GRANT SELECT, INSERT ON V_JBXX TO 1234502, 1234512;

2:定义安全策略(Security Policies)的目标

在数据库里,每个用户分配一个机构代码,在这里直接使用该代码的前7位作为用户名,相关的数据表均有一个“机构代码”字段
安全策略目标:每个用户仅能浏览和操作“机构代码”与自己的机构代码相同的数据记录。
例外情况:vpd用户可以不受限制访问数据

3:创建应用环境(Application Context)
应用环境是一个包含系列环境变量名称和值的值对的集合,是存储用户的环境变量的空间;
系统提供了默认的环境USERENV,含有当前会话相关的默认的变量,如用户名、主机和应用程序名等

1)为创建VPD的context和context package的用户授权,
CONNECT sys/password@www.chq.name AS SYSDBA;
GRANT create any context, create public synonym TO VPD;
CONNECT VPD/VPD@www.chq.name;

2)创建应用环境 CTX_VPD_SEC
CREATE CONTEXT CTX_VPD_SEC USING VPD.PKG_VPD_SEC;

4:创建VPD应用程序包,在包里增加设置环境变量的函数、存储过程
这个包的作用是提供设置环境变量的工具(函数或存储过程),供on login触发器或应用程序等调用。

1) 创建VPD应用程序包PKG_VPD_SEC的包头
CONNECT VPD/VPD@www.chq.name;
CREATE OR REPLACE PACKAGE VPD.PKG_VPD_SEC AS
PROCEDURE Set_Context;
END PKG_VPD_SEC;

2)创建VPD应用程序包的包体
CREATE OR REPLACE PACKAGE BODY VPD.PKG_VPD_SEC IS
PROCEDURE Set_Context IS
lv_user VARCHAR2(11);
lv_jg_dm VARCHAR2(11);
BEGIN
DBMS_Session.Set_Context('CTX_VPD_SEC','SETUP','TRUE');
v_ouser := SYS_CONTEXT('USERENV','SESSION_USER');
DBMS_Session.Set_Context('CTX_VPD_SEC','DM_USER', lv_user);
BEGIN
SELECT substr(JG_DM,1,7)
INTO lv_jg_dm
FROM dm_users
WHERE user_dm = lv_user;
DBMS_Session.Set_Context('CTX_VPD_SEC','JG_DM', lv_jg_dm);
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_Session.Set_Context('CTX_VPD_SEC','JG_DM', substr(lv_user,1,7));
END;
DBMS_Session.Set_Context('CTX_VPD_SEC','SETUP','FALSE');
END Set_Context;
END PKG_VPD_SEC;
/
SHOW ERRORS

3)授权其他用户可以访问并运行 PKG_VPD_SEC 包:
GRANT EXECUTE ON VPD.PKG_VPD_SEC TO PUBLIC;
CREATE PUBLIC SYNONYM PKG_VPD_SEC FOR VPD.PKG_VPD_SEC;

4)建立用户登陆触发器,每次登录后首先设置自己的应用环境变量
CONNECT sys/password@www.chq.name AS SYSDBA;
CREATE OR REPLACE TRIGGER VPD.Set_Security_Context
AFTER LOGON ON DATABASE
BEGIN
VPD.PKG_VPD_SEC.Set_Context;
END;
/
SHOW ERRORS

5:创建VPD应用程序-安全策略包,创建策略函数,为简便起见仍使用PKG_VPD_SEC
这是实现策略的函数,该函数从应用环境取得变量值,形成查询语句的一部分

1)建立安全策略( Security Policies)包的包头,简便起见修改PKG_VPD_SEC
--In order for the context package to have any effect on the users interaction with the database,
--we need to define a Security_Package for use with the security policy.
--This package will tell the database how to treat any interactions with the specified table:

CONNECT vpd/vpd@www.chq.name;

CREATE OR REPLACE PACKAGE VPD.PKG_VPD_SEC AS
PROCEDURE Set_Context;

FUNCTION User_Data_Insert_Security(Owner VARCHAR2, Objname VARCHAR2)
RETURN VARCHAR2;

FUNCTION User_Data_Select_Security(Owner VARCHAR2, Objname VARCHAR2)
RETURN VARCHAR2;
END Security_Package;
/
2)修改包体,增加安全策略函数:

CREATE OR REPLACE PACKAGE BODY Security_Package IS

PROCEDURE Set_Context IS
......
END Set_Context;

FUNCTION User_Data_Select_Security(Owner VARCHAR2, Objname VARCHAR2)RETURN VARCHAR2 IS
Predicate VARCHAR2(2000);
BEGIN
Predicate := '1=2';
IF (SYS_CONTEXT('USERENV','SESSION_USER') = 'VPD') THEN
Predicate := NULL;
ELSE
Predicate := 'JG_DM = SYS_CONTEXT(''CTX_VPD_SEC'',''JG_DM'')';
END IF;
RETURN Predicate;
END User_Data_Select_Security;

FUNCTION User_Data_Insert_Security(Owner VARCHAR2, Objname VARCHAR2) RETURN VARCHAR2 IS
Predicate VARCHAR2(2000);
BEGIN
Predicate := '1=2';
IF (SYS_CONTEXT('USERENV','SESSION_USER') = 'VPD') THEN
Predicate := NULL;
ELSE
Predicate := 'JG_DM = SYS_CONTEXT(''CTX_VPD_SEC'',''JG_DM'')';
END IF;
RETURN Predicate;
END User_Data_Insert_Security;
END Security_Package;
/
SHOW ERRORS
3)授权所有用户可以访问并运行安全策略包 PKG_VPD_SEC:

GRANT EXECUTE ON VPD.PKG_VPD_SEC TO PUBLIC;
--CREATE PUBLIC SYNONYM PKG_VPD_SEC FOR VPD.PKG_VPD_SEC;

6:将策略函数应用到一个表或视图上
使用oracle 提供的DBMS_RLS包来实现安全策略的应用管理。
例如:
CONNECT VPD/VPD@www.chq.name;

BEGIN
DBMS_Rls.Add_Policy('VPD', 'VIEW_JBXX', 'USER_DATA_INSERT_POLICY',
'VPD', 'PKG_VPD_SEC.USER_DATA_INSERT_SECURITY',
'INSERT', TRUE);
DBMS_Rls.Add_Policy('VPD', 'VIEW_JBXX', 'USER_DATA_INSERT_POLICY',
'VPD', 'PKG_VPD_SEC.USER_DATA_INSERT_SECURITY',
'SELECT');
END;
或者:
execute DBMS_RLS.ADD_POLICY(object_schema=>'VPD',object_name=>'V_FACT_data',policy_name=>'USER_DATA_INSERT_POLICY',
function_schema=>'VPD',policy_function=>'PKG_VPD_SEC.USER_DATA_INSERT_SECURITY',
statement_type=>'select',update_check=>FALSE,enable=>true)
)

注意事项:
1)DBMS_RLS包最初的运行权限须由sys用户授予VPD用户。
2)插入失败的报错信息:
ORA-28115: policy with check option violation

 

 

分享到:
评论

相关推荐

    基于Oracle VPD技术实现系统可配置数据屏蔽.pdf

    Oracle VPD(Virtual Private Database)技术是Oracle数据库提供的一种安全机制,它允许数据库根据用户的上下文信息动态地修改SQL查询,实现数据的行级访问控制。这种技术的主要目的是确保敏感数据的安全,同时简化...

    oracle-vpd:启用Oracle VPD的翻译器

    Oracle-vpd 这是用于Oracle的代理JDBC驱动程序,它提供了一种从JBoss EAP环境中注入V $ Session OSUSER的方法。 应该注意的是,必须在“ CallerIdentity”登录模块中使用它来设置OSUSER,并在JEE引擎中将基于$ ...

    Oracle_VPD:在Oracle VPD中下载

    Oracle VPD,全称为Virtual Private Database(虚拟私有数据库),是Oracle数据库的一种安全特性,它允许数据库管理员在数据库级别实施细粒度的访问控制。VPD技术通过在SQL语句中动态插入额外的条件,实现了数据级别...

    ORACLE中一个基于角色访问控制的VPD设计方案.pdf

    【Oracle中的基于角色访问控制(Role-Based Access Control, RBAC)与VPD技术】 Oracle数据库是一种广泛使用的大型关系型数据库管理系统,它提供了多种安全机制来保护数据,包括基于角色的访问控制(RBAC)和虚拟...

    vpd列级权限控制举例

    VPD(Virtual Private Database,虚拟私有数据库)是 Oracle 数据安全的一种策略,它提供列级权限控制,能够实现更细粒度的数据隔离。在本例中,我们将探讨如何使用 VPD 实现列级权限控制。 首先,我们需要理解 VPD...

    ORACLE11.2.0.3 下载地址种子

    5. **Security增强**:Oracle 11.2.0.3 引入了更多的安全特性,如 Fine-Grained Auditing (FGA) 和 Virtual Private Database (VPD),提供了更细粒度的访问控制,增强了数据保护。 6. **SQL Developer**:Oracle的...

    Oracle数据库安全策略分析(一)第1/2页

    正在看的ORACLE教程是:Oracle数据库安全策略分析(一)。 数据库安全性问题一直是围绕着数据库管理员的恶梦,数据库数据的丢失以及数据库被非法用户的侵入使得数据库管理员身心疲惫不堪。围绕数据库的安全性问题...

    Oracle11g从入门到精通2

    《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...

    oracle-security.rar_Oracle 11G_Oracle Security_oracle_oracle 11

    6. **安全标签和多层安全**:Oracle 11g引入了Secure Application Roles和Virtual Private Database (VPD)等特性,允许基于用户、时间、地点等条件进行访问控制,实现数据的多层隔离。 7. **实时应用监控**:Oracle...

    Oracle 19C OCP课堂笔记.zip

    - **Virtual Private Database (VPD)**: 在行级别应用安全策略,以实现数据的隔离和安全性。 - **Data Redaction**: 隐藏敏感数据,为审计和合规性提供支持。 5. **SQL和PL/SQL** - **Advanced SQL Features**: ...

    浙大oracle11g教程

    1. **Oracle 11g基础**:介绍Oracle数据库的基本概念,如数据模型、SQL语言、表的创建与管理等。 2. **安装与配置**:讲解Oracle 11g的系统需求、安装过程及基本配置。 3. **数据管理**:包括数据的插入、更新、删除...

    oracle心得oracle心得

    - **安全特性**:利用Oracle内置的安全特性,如Fine-Grained Access Control (FGAC)、Virtual Private Database (VPD)等增强数据库的安全性。 - **审计机制**:设置审计策略,监控数据库的操作行为,及时发现潜在的...

    Oracle技术手册。。。人人软件站

    Oracle技术手册是数据库管理员、开发人员以及对Oracle数据库系统感兴趣的 IT 专业人士的重要参考资料。这份手册可能涵盖了Oracle数据库的安装、配置、性能优化、备份恢复、安全性管理、SQL查询语法、PL/SQL编程等多...

    ORACLE DBA 认证题

    DBA需要知道如何创建和管理用户,设置访问权限,以及如何通过Fine-Grained Access Control (FGAC)和Virtual Private Database (VPD)提高安全性。 6. **高可用性与故障切换**:Oracle Real Application Clusters ...

Global site tag (gtag.js) - Google Analytics