使用细粒度审计

目的

本教程旨在 演示如何使用细粒度审计检测对表中“honey token”的访问。

所需时间

大约 30 分钟

主题

本教程包括下列主题:

 概述

设置

 创建并应用 VPD 策略
 测试策略实施
 检查审计违规
 清理
 总结

查看屏幕截图

 将光标置于此图标上以加载和查看本教程的所有屏幕截图。(警告:此操作会同时加载所有屏幕截图,网速较慢时,响应时间可能会比较长。)

注意:此外,还可以在下列步骤中将光标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。

概述

细粒度审计使用的策略可以基于内容监视数据访问。 可以使用策略指定审计要记录的列和条件。 条件可以包括将审计限制为与指定列结合使用的特定类型的 DML 语句。 还可以提供在发生审计事件时要调用的例程名。 该例程可以通知或警告管理员或处理错误和异常。

情景

本教程演示了如何使用细粒度审计检测对表中“honey token”的访问。 本教程创建了一个根据信用卡供应商来限制对行的访问的 VPD 策略。 honey token 是一个始终不可选中的信用卡号码。 它无法通过常规的验证,并且信用卡号码无法与任何供应商关联,因此无权对该行进行访问。

VPD 策略不针对该表的所有者 OE。 OE 有完全访问权限,因此当 OE(或获得了此身份的黑客)执行以下命令时

select * from oe.cust_payment_info

honey token 将被选中,并且 FGA 策略将记录该事件。 此外,您还可以调用事件处理程序(未包含在本教程中)向 audit_admin 发送一封有关此特殊行的访问权限的电子邮件。

本教程在以下将职责划分至以下角色:

HR_sec 创建数据库用户(使用 hr.employees 表的员工列表)和数据库角色。
sec_admin

根据公司的访问控制和审计策略创建并应用 VPD 和 FGA 策略。

audit_admin 在数据库中查询审计记录 (dba_fga_audit_trail)。

返回主题列表

设置

在本教程中,您将创建一组用户和角色来演示 FGA 如何工作。要创建用户和角色,请执行以下步骤:

1.

您将创建一个客户付款信息表并使用信用卡号码填充该表。 由于信用卡号码不可能与“Honey Token”关联,因此授权用户将无法选择该行。 只有不受访问策略约束的管理用户或成为“内部”管理员的入侵者才能选择它。 这可以对该表进行高度集中的审计。打开一个终端窗口,执行以下命令:

                               
                                 
cd /home/oracle/wkdir
sqlplus /nolog
@01_fga_poptabl
                              
                            
conn oe/oe
                              
create table cust_payment_info
(first_name varchar2(11),
last_name varchar2(10),
order_number number(5),
credit_card_number varchar2(16) ENCRYPT);
insert into cust_payment_info values
('Jon', 'Oldfield', 10001, '5446959708812985');
insert into cust_payment_info values
('Chris', 'White', 10002, '5122358046082560');
insert into cust_payment_info values
('Alan', 'Squire', 10003, '5595968943757920');
insert into cust_payment_info values
('Mike', 'Anderson', 10004, '4929889576357400');
insert into cust_payment_info values
('Annie', 'Schmidt', 10005, '4556988708236902');
insert into cust_payment_info values
('Elliott', 'Meyer', 10006, '374366599711820');
insert into cust_payment_info values
('Celine', 'Smith', 10007, '4716898533036');
insert into cust_payment_info values
('Steve', 'Haslam', 10008, '340975900376858');
insert into cust_payment_info values
('Albert', 'Einstein', 10009, '310654305412389');

 

2 .

SYSTEM 将创建 3 个管理用户: HR_sec、sec_admin 和 audit_admin。 HR_sec 创建角色“emp_role”,然后将系统权限和对象权限授予 emp_role。 在终端窗口中运行以下脚本:

                               
                                 
@02_fga_cradminusers
                              
                            
connect system/oracle;
                              
create user sec_admin identified by welcome1;
create user audit_admin identified by welcome1;
create user HR_sec identified by welcome1;
grant connect, create user, drop user, create role, drop any role to HR_sec;
connect HR_sec/welcome1;
create role emp_role;
connect / as sysdba;
grant execute on dbms_rls to sec_admin;
grant execute on dbms_fga to sec_admin;
grant select on dba_fga_audit_trail to audit_admin;
connect system/welcome1;
grant connect to emp_role;
grant create procedure to sec_admin;
connect OE/oe;
grant select on oe.cust_payment_info to emp_role;

 

3 .

HR_sec 创建数据库用户并将 emp_role 授予他们。 在终端窗口中运行以下脚本:

                               
                                 
@03_fga_crdbusers
                              
                            
connect HR_sec/welcome1;
                              
Prompt create user Janette King (JKING) (access to Card_A)
grant emp_role to JKING identified by welcome1;
Prompt create user Lindsay Smith (LSMITH) (access to Card_V)
grant emp_role to LSMITH identified by welcome1;
Prompt create user Louise Doran (LDORAN) (access to Card_M)
grant emp_role to LDORAN identified by welcome1;
Prompt grant emp_role to sec_admin:
grant emp_role to sec_admin;
Prompt grant emp_role to audit_admin:
grant emp_role to audit_admin;
connect hr/hr;
grant select on hr.employees to sec_admin;

 

返回主题列表

创建并应用 VPD 策略

在本部分中,您将使用 VPD 策略定义并限制行的访问权限。 您将检查登录到数据库的用户是否是员工,然后根据信用卡号码来限制对 cust_payment_info 表的访问。

Card_A 从“34”或“37”开始:
Card_V 从“4”开始
Card_M 从“5”开始

执行以下操作:

1.

您首先需要创建一个策略函数来创建 where 子句。执行以下脚本:

                               
                                 
@04_fga_crpolicy_function

conn sec_admin/welcome1;
                                
create or replace function f_policy_oe_cust_payment_info
-- Function must have the following parameters
(schema in varchar2, tab in varchar2)
-- Function will return a string that is used as a WHERE clause
return varchar2
as
v_manager_id number:=0;
is_employee number:=0;
v_user varchar2(20);
out_string varchar2(70) default '1=2 ';
begin
-- get session user
v_user := lower(sys_context('userenv','session_user'));
-- Is the user an employee?
begin
select manager_id into v_manager_id
from hr.employees
where lower(email) = v_user;
is_employee:=1;
exception
when no_data_found then
is_employee:=2;
end;
-- create where clause when user is authorized to see parts of the table
if is_employee=1 and lower(v_user)='jking' and v_manager_id=146 then
out_string := out_string ||'or CREDIT_CARD_NUMBER like ''34%'' or CREDIT_CARD_NUMBER like ''37%''';
elsif is_employee=1 and lower(v_user)='lsmith' and v_manager_id=146 then
out_string := out_string ||'or CREDIT_CARD_NUMBER like ''4%''';
elsif is_employee=1 and lower(v_user)='ldoran' and v_manager_id=146 then
out_string := out_string ||'or CREDIT_CARD_NUMBER like ''5%''';
elsif is_employee=2 and lower(v_user)='oe' then
out_string := '1=1';
end if;
return out_string;
end;
/

 

2.

您现在将把该策略添加到“oe.cust_payment_info”表。在 SQL*Plus 会话中,执行以下脚本:

                               
                                 
@05_fga_applypolicy

begin
                                
dbms_rls.add_policy('oe','cust_payment_info','ac_cust_payment_info','sec_admin', 'f_policy_oe_cust_payment_info',policy_type => dbms_rls.context_sensitive);
end;
/

 

3.

sec_admin 用户将把 FGA 策略添加到捕获“Albert Einstein”的访问权限的机密表。从 SQL*Plus 中,执行以下脚本:

                               
                                 
@05_fga_applypolicy_waudit
                              
                            
begin
                              
DBMS_FGA.ADD_POLICY (
object_schema => 'OE',
object_name => 'cust_payment_info',
policy_name => 'fga_cust_payment_info',
audit_condition => 'credit_card_number = 310654305412389',
audit_column => NULL,
handler_schema => NULL,
handler_module => NULL,
enable => TRUE,
statement_types => 'UPDATE, DELETE, SELECT',
audit_trail => DBMS_FGA.DB + DBMS_FGA.EXTENDED);
end;
/

 

返回主题列表

测试策略实施

建立表策略后,现在可以通过执行以下步骤对其进行测试:

1.

执行以下脚本,测试 JKING 用户的访问权限。

                               
                                 
@06_fga_test_policy_king
                              
                            
conn JKING/welcome1;
                              
col CREDIT_CARD_NUMBER heading Card_A format a17;
select * from oe.CUST_PAYMENT_INFO order by CREDIT_CARD_NUMBER;

 

2.

现在,可以通过执行以下脚本针对 LDORAN 用户测试该策略:

                               
                                 
@06_fga_test_policy_doran

                              conn LDORAN/welcome1;
                              
col CREDIT_CARD_NUMBER heading Card_M format a17;
select * from oe.CUST_PAYMENT_INFO order by CREDIT_CARD_NUMBER;

 

3.

现在,可以通过执行以下脚本测试 LSMITH 访问权限:

                               
                                 
@06_fga_test_policy_smith

conn LSMITH/welcome1;
                                
col CREDIT_CARD_NUMBER heading Card_V format a17;
select * from oe.CUST_PAYMENT_INFO order by CREDIT_CARD_NUMBER;

 

4.

现在,可以通过执行以下脚本测试 SYS 访问权限:

                               
                                 
@06_fga_test_policy_sys

conn / as sysdba;
                                
col CREDIT_CARD_NUMBER heading 'All Cards' format a17;
select * from oe.CUST_PAYMENT_INFO order by CREDIT_CARD_NUMBER;

 

5.

最后,可以通过执行以下脚本测试 OE 用户访问权限:

                               
                                 
@06_fga_test_policy_oe

conn OE/oe;
                                
col CREDIT_CARD_NUMBER heading 'All Cards' format a17;
select * from oe.CUST_PAYMENT_INFO order by CREDIT_CARD_NUMBER;

 

返回主题列表

检查审计违规

Audit_Admin 用户可以通过执行以下步骤检查任何访问违规:

1.

执行以下脚本,检查 CUST_PAYMENT_INFO 表的 dba_fga_audit_trail。

                               
                                 
@07_fga_chk_audit_violations
                              
                            
conn audit_admin/welcome1;
                              
col DB_USER format a10;
col extended_timestamp heading 'ext. Time' format a35;
select DB_USER, extended_timestamp, SQL_TEXT from dba_fga_audit_trail where object_name='CUST_PAYMENT_INFO' order by extended_timestamp;

 

返回主题列表

清理

现在,您已经测试了策略,接下来您可以通过执行以下步骤删除用户和策略:

1.

执行以下脚本:

                               
                                 
@08_fga_cleanup
                              
                            
conn sec_admin/welcome1;
                              
begin
DBMS_FGA.DROP_POLICY (
object_schema => 'OE',
object_name => 'cust_payment_info',
policy_name => 'fga_cust_payment_info');
end;
/
drop function f_policy_oe_cust_payment_info;
conn oe/oe
drop table cust_payment_info;
conn HR_sec/welcome1;
drop role emp_role;
drop user JKING cascade;
drop user LSMITH cascade;
drop user LDORAN cascade;
conn system/welcome1
drop user sec_admin cascade;
drop user audit_admin cascade;
drop user HR_sec cascade;

 

返回主题列表

总结

在本教程中,您学习了如何执行下列任务:

创建并应用 VPD 策略

测试策略

检查审计违规

返回主题列表

 将光标置于该图标上可以隐藏所有屏幕截图。

Left Curve
热门下载
Right Curve
Left Curve
更多融合中间件下载
Right Curve