FGA:细粒度访问控制:使用不同的用户名登录在查询相同表时返回不同的数据。
FGA的设置分为下面五个步骤:
一、 建立上下文:
二、设置上下文属性:
三、建立登录触发器:
四、建立策略函数
五、增加策略
二、 建立上下文:
SQL> conn / as sysdba
已连接。
SQL> create context empenv using scott.ctx;
上下文已创建。
二、设置上下文属性:
SQL> create package scott.ctx as procedure set_deptno;
2end;
3/
程序包已创建。
SQL> create package body scott.ctx as procedure set_deptno is
2id number;
3begin
4if sys_context('userenv','session_user')='JONES' then
5dbms_session.set_context('empenv','deptno',20);
6elsif sys_context('userenv','session_user')='BLAKE' then
7dbms_session.set_context('empenv','deptno',30);
8else
9dbms_session.set_context('empenv','deptno',10);
10end if;
11end;
12end;
13/
程序包体已创建。
三、建立登录触发器:
SQL> create trigger login_trig
2after logon on database call scott.ctx.set_deptno
3/
触发器已创建
四、建立策略函数
SQL> create package scott.emp_security as
2function emp_sec(p1 varchar2,p2 varchar2) return varchar2;
3end;
4/
程序包已创建。
1create or replace package body scott.emp_security as
2function emp_sec(p1 varchar2,p2 varchar2) return varchar2 is
3d_predicate varchar2(2000);
4begin
5if user not in('SYS','SYSTEM','SCOTT') then
6d_predicate:='deptno=SYS_CONTEXT(''empenv'',''deptno'')';
7return d_predicate;
8end if;
9return '1=1';
10end;
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;
2end;
3/
程序包已创建。
SQL> create package body scott.ctx as procedure set_deptno is
2id number;
3begin
4if sys_context('userenv','session_user')='JONES' then
5dbms_session.set_context('empenv','deptno',20);
6elsif sys_context('userenv','session_user')='BLAKE' then
7dbms_session.set_context('empenv','deptno',30);
8else
9dbms_session.set_context('empenv','deptno',10);
10end if;
11end;
12end;
13/
程序包体已创建。
三、建立登录触发器:
SQL> create trigger login_trig
2after logon on database call scott.ctx.set_deptno
3/
触发器已创建
四、建立策略函数
SQL> create package scott.emp_security as
2function emp_sec(p1 varchar2,p2 varchar2) return varchar2;
3end;
4/
程序包已创建。
1create or replace package body scott.emp_security as
2function emp_sec(p1 varchar2,p2 varchar2) return varchar2 is
3d_predicate varchar2(2000);
4begin
5if user not in('SYS','SYSTEM','SCOTT') then
6d_predicate:='deptno=SYS_CONTEXT(''empenv'',''deptno'')';
7return d_predicate;
8end if;
9return '1=1';
10end;
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
======================