FGA:细粒度访问控制:使用不同的用户名登录在查询相同表时返回不同的数据。
FGA的设置分为下面五个步骤:
一、 建立上下文:
二、设置上下文属性:
三、建立登录触发器:
四、建立策略函数
五、增加策略
二、 建立上下文:
SQL> conn / as sysdba
已连接。
SQL> create context empenv using scott.ctx;
上下文已创建。
二、设置上下文属性:
SQL> create package scott.ctx as procedure set_deptno;
2 end;
3 /
程序包已创建。
SQL> create package body scott.ctx as procedure set_deptno is
2 id number;
3 begin
4 if sys_context('userenv','session_user')='JONES' then
5 dbms_session.set_context('empenv','deptno',20);
6 elsif sys_context('userenv','session_user')='BLAKE' then
7 dbms_session.set_context('empenv','deptno',30);
8 else
9 dbms_session.set_context('empenv','deptno',10);
10 end if;
11 end;
12 end;
13 /
程序包体已创建。
三、建立登录触发器:
SQL> create trigger login_trig
2 after logon on database call scott.ctx.set_deptno
3 /
触发器已创建
四、建立策略函数
SQL> create package scott.emp_security as
2 function emp_sec(p1 varchar2,p2 varchar2) return varchar2;
3 end;
4 /
程序包已创建。
1 create or replace package body scott.emp_security as
2 function emp_sec(p1 varchar2,p2 varchar2) return varchar2 is
3 d_predicate varchar2(2000);
4 begin
5 if user not in('SYS','SYSTEM','SCOTT') then
6 d_predicate:='deptno=SYS_CONTEXT(''empenv'',''deptno'')';
7 return d_predicate;
8 end if;
9 return '1=1';
10 end;
11* end;
SQL> /
程序包体已创建。
五、增加策略
SQL> exec dbms_rls.add_policy('scott','emp','emp_policy','scott','emp_security.emp_sec','select');
PL/SQL 过程已成功完成。
到些FGA的设置已经完成了。
现在来体验一下FGA吧:
SQL> conn scott/tiger
已连接。
SQL> select ename,deptno from emp;
ENAME DEPTNO
---------- ----------
SMITH 20
ALLEN 30
WARD 30
JONES 20
MARTIN 30
BLAKE 30
CLARK 10
SCOTT 20
KING 10
TURNER 30
ADAMS 20
ENAME DEPTNO
---------- ----------
JAMES 30
FORD 20
MILLER 10
已选择14行。
SQL> conn jones/jones
已连接。
SQL> select ename,deptno from emp;
select ename,deptno from emp
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> select ename,deptno from scott.emp;
ENAME DEPTNO
---------- ----------
SMITH 20
JONES 20
SCOTT 20
ADAMS 20
FORD 20
SQL> conn blake/blake
已连接。
SQL> select ename,deptno from scott.emp;
ENAME DEPTNO
---------- ----------
ALLEN 30
WARD 30
MARTIN 30
BLAKE 30
TURNER 30
JAMES 30
已选择6行。
========================
FGA:细粒度审计
建立策略函数:
SQL> exec dbms_fga.add_policy(object_schema=>'scott',-
> object_name=>'emp',policy_name=>'chk_emp',-
> audit_condition=>'deptno=20',audit_column=>'sal',-
> statement_types=>'update,select')
PL/SQL 过程已成功完成。
策略函数已经建立完毕。、
可以通过这个查询来查看策略函数是否建立完成。
select t.object_schema,t.object_name,t.policy_name,t.enabled from dba_audit_policies t;
开始体验FGA了:
执行下列语句:
SQL> conn scott/tiger
已连接。
SQL> update emp set sal=sal+.1 ;
已更新14行。
SQL> commit;
提交完成。
查看审计结果:
select * from dba_fga_audit_trail;
1 120 2006-10-13 15:13:13 SCOTT 0914-32/Administrator EPORT0/0914-32 0914-32/Administrator SCOTT EMP CHK_EMP 363592 update emp set sal=sal+.1 UPDATE 13-10月-06 03.13.13.147000 下午 +08:00 0 308:1016 0400040047000000 8 1
======================
FGA的设置分为下面五个步骤:
一、 建立上下文:
二、设置上下文属性:
三、建立登录触发器:
四、建立策略函数
五、增加策略
二、 建立上下文:
SQL> conn / as sysdba
已连接。
SQL> create context empenv using scott.ctx;
上下文已创建。
二、设置上下文属性:
SQL> create package scott.ctx as procedure set_deptno;
2 end;
3 /
程序包已创建。
SQL> create package body scott.ctx as procedure set_deptno is
2 id number;
3 begin
4 if sys_context('userenv','session_user')='JONES' then
5 dbms_session.set_context('empenv','deptno',20);
6 elsif sys_context('userenv','session_user')='BLAKE' then
7 dbms_session.set_context('empenv','deptno',30);
8 else
9 dbms_session.set_context('empenv','deptno',10);
10 end if;
11 end;
12 end;
13 /
程序包体已创建。
三、建立登录触发器:
SQL> create trigger login_trig
2 after logon on database call scott.ctx.set_deptno
3 /
触发器已创建
四、建立策略函数
SQL> create package scott.emp_security as
2 function emp_sec(p1 varchar2,p2 varchar2) return varchar2;
3 end;
4 /
程序包已创建。
1 create or replace package body scott.emp_security as
2 function emp_sec(p1 varchar2,p2 varchar2) return varchar2 is
3 d_predicate varchar2(2000);
4 begin
5 if user not in('SYS','SYSTEM','SCOTT') then
6 d_predicate:='deptno=SYS_CONTEXT(''empenv'',''deptno'')';
7 return d_predicate;
8 end if;
9 return '1=1';
10 end;
11* end;
SQL> /
程序包体已创建。
五、增加策略
SQL> exec dbms_rls.add_policy('scott','emp','emp_policy','scott','emp_security.emp_sec','select');
PL/SQL 过程已成功完成。
到些FGA的设置已经完成了。
现在来体验一下FGA吧:
SQL> conn scott/tiger
已连接。
SQL> select ename,deptno from emp;
ENAME DEPTNO
---------- ----------
SMITH 20
ALLEN 30
WARD 30
JONES 20
MARTIN 30
BLAKE 30
CLARK 10
SCOTT 20
KING 10
TURNER 30
ADAMS 20
ENAME DEPTNO
---------- ----------
JAMES 30
FORD 20
MILLER 10
已选择14行。
SQL> conn jones/jones
已连接。
SQL> select ename,deptno from emp;
select ename,deptno from emp
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> select ename,deptno from scott.emp;
ENAME DEPTNO
---------- ----------
SMITH 20
JONES 20
SCOTT 20
ADAMS 20
FORD 20
SQL> conn blake/blake
已连接。
SQL> select ename,deptno from scott.emp;
ENAME DEPTNO
---------- ----------
ALLEN 30
WARD 30
MARTIN 30
BLAKE 30
TURNER 30
JAMES 30
已选择6行。
========================
FGA:细粒度审计
建立策略函数:
SQL> exec dbms_fga.add_policy(object_schema=>'scott',-
> object_name=>'emp',policy_name=>'chk_emp',-
> audit_condition=>'deptno=20',audit_column=>'sal',-
> statement_types=>'update,select')
PL/SQL 过程已成功完成。
策略函数已经建立完毕。、
可以通过这个查询来查看策略函数是否建立完成。
select t.object_schema,t.object_name,t.policy_name,t.enabled from dba_audit_policies t;
开始体验FGA了:
执行下列语句:
SQL> conn scott/tiger
已连接。
SQL> update emp set sal=sal+.1 ;
已更新14行。
SQL> commit;
提交完成。
查看审计结果:
select * from dba_fga_audit_trail;
1 120 2006-10-13 15:13:13 SCOTT 0914-32/Administrator EPORT0/0914-32 0914-32/Administrator SCOTT EMP CHK_EMP 363592 update emp set sal=sal+.1 UPDATE 13-10月-06 03.13.13.147000 下午 +08:00 0 308:1016 0400040047000000 8 1
======================
本文详细介绍了如何通过五个步骤实现细粒度访问控制(FGA),包括建立上下文、设置上下文属性、建立登录触发器、建立策略函数及增加策略。并通过具体示例展示了不同用户登录时对同一表的不同访问权限。
1398

被折叠的 条评论
为什么被折叠?



