设为首页 收藏本站
查看: 659|回复: 0

[经验分享] 利用Oracle VPD实现行级安全保护(一)

[复制链接]

尚未签到

发表于 2018-9-14 08:59:56 | 显示全部楼层 |阅读模式
  http://boylook.itpub.net/post/43144/520544
  大家都知道,Oracle的锁机制是行级别的,下面来看看Oracle的安全访问机制:
  安全的数据过滤,必须在基础数据表的一层就完成,这样用户无论是通过视图还是基础表都无法绕过安全控制。而VPD(virtual private database)最根本的能力就是“会透明的过滤数据”,提供行级安全保护。
  Oracle8i以后的版本都提供了VPD这样一个强大的功能来实现呼声日益增高的系统安全性要求。通过设置基于VPD的细粒度访问策略,我们可以只通过DBA的工作(不需要修改应用,也就是应用透明化)就可以实现用户只能访问自己有权限访问的数据,当然如果需要更加复杂的权限控制开发人员的参与还是必不可少的。
  下面用一个简单的例子来实现这样的功能,在EMP表中的用户登录数据库以后只能查询和更新自己所属部门的其它员工资料,不是本部门的不会显示也不允许更新。
  ————————————————————————————————————————————————————
  1.我们需要两个用户,一个是用于设置VPD策略的hr用户,另外一个是在hr.employees表中有记录的David用户

  SQL> create user David>  User created.
  SQL> grant create session to david;
  Grant succeeded.
  SQL> conn hr
  Enter password:
  Connected.
  2.首先用hr用户创建策略权限表。为方便起见我们直接通过employees表创建,本策略表中包含了员工姓名和所属部门编号。其中David用户同时属于60和80这两个部门。
  SQL> create table rls_test as select * from employees;
  Table created.
  SQL> select department_id from employees where first_name = 'David';
  DEPARTMENT_ID
  -------------
  60
  80
  80
  3.hr用户创建VPD策略需要的函数。
  SQL> @create_vpd_func(见文章结尾)
  Function created.
  该函数实现以下功能:
  如果使用hr用户登录,因为表是属于该用户的,所以不加任何限制。
  如果使用其它用户登录(SYS用户不受此限制),那么根据employees表中该用户的所属部门决定哪些记录允许该用户操作,本例中60和80这两个部门的员工David用户将都能看见。
  如果登录的用户不在employees表中,那么该用户查看不到任何数据。
  注意:
  VPD策略函数必须包含两个参数,本例中是p_schema和p_table,即使这两个参数在函数中没有用到,也必须包含。否则在后面检索EMP表数据的时候将会报:
  PLS-00306: 调用 'GET_USER_DEPT_ID' 时参数个数或类型错误。
  4.用hr用户创建VPD策略。
  SQL> conn / as sysdba
  Connected.
  SQL> grant execute on dbms_rls to hr
  2 ;
  Grant succeeded.
  SQL> conn hr
  Enter password:
  Connected.
  SQL> @test_add_policy;
  10 /
  PL/SQL procedure successfully completed.
  5.至此为止我们的VPD方案就已经设置完毕了。下面我们测试一下--hr用户可以选择出全部的107条记录
  SQL> select count(*) from employees;
  COUNT(*)
  ----------
  107
  SQL> conn david
  Enter password:
  Connected.
  --David用户只能选出属于部门60,80的39条记录SQL> select count(*) from hr.employees;
  COUNT(*)
  ----------
  39
  附:
  cat create_vpd_func.sql
  create or replace function test_vpd(p_schema in varchar2,p_object in varchar2)
  return varchar2
  as
  l_retstr    varchar2(2000);
  type dept_id_type is table of employees.department_id%type;
  dept_id_tab   dept_id_type;
  temp_v varchar2(2000);
  begin
  if sys_context('userenv','current_user') = user then
  return '';
  end if;
  select department_id
  bulk collect into dept_id_tab
  from rls_test
  where upper(first_name) = sys_context('userenv','session_user');
  if dept_id_tab.count = 0 then
  l_retstr := '1=2';
  else
  for i in dept_id_tab.first..dept_id_tab.last
  loop
  temp_v := temp_v||','||dept_id_tab(i);
  end loop;
  l_retstr := 'department_id in('||ltrim(temp_v,',')||')';
  end if;
  return l_retstr;
  end;
  /
  cat test_add_policy.sql
  declare
  begin
  dbms_rls.add_policy(
  object_schema =>'HR',
  object_name =>'EMPLOYEES',
  policy_name =>'HIDE_EMP',
  function_schema =>'HR',
  policy_function =>'TEST_VPD');
  end;


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-581850-1-1.html 上篇帖子: Oracle在线重定义 下篇帖子: Oracle 彻底 kill session-Oracle之路
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表