代码改变世界

记录一则FGA审计“A用户对B用户某张表的更新操作”需求

  AlfredZhao  阅读(739)  评论(1编辑  收藏  举报

环境:Oracle 11.2.0.4
我这里测试A用户为JINGYU,要审计的表为B用户SCOTT下的EMP表。通过FGA来实现。

1.添加审计策略

官方文档语法:

DBMS_FGA.ADD_POLICY(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2,
audit_condition VARCHAR2,
audit_column VARCHAR2,
handler_schema VARCHAR2,
handler_module VARCHAR2,
enable BOOLEAN,
statement_types VARCHAR2,
audit_trail BINARY_INTEGER IN DEFAULT,
audit_column_opts BINARY_INTEGER IN DEFAULT);

添加审计策略,目标是审计JINGYU用户有更新SCOTT用户下EMP表的操作。

--审计JINGYU用户有更新SCOTT用户下EMP表的操作
BEGIN
dbms_fga.add_policy(
object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'FGA_TEST_01',
audit_condition => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''JINGYU'' ',
statement_types    =>  'UPDATE');
END;
/

这里主要是audit_condition的写法,有一个SYS_CONTEXT('USERENV','SESSION_USER')写法:

select * from dual where SYS_CONTEXT('USERENV','SESSION_USER') = 'JINGYU';

测试一下,证明这样写where条件是有效的:

SQL> show user
USER is "JINGYU"
SQL> select * from dual where SYS_CONTEXT('USERENV','SESSION_USER') = 'JINGYU';

D
-
X

SQL> conn ludan
Enter password: 
Connected.
SQL> show user
USER is "LUDAN"
SQL>  select * from dual where SYS_CONTEXT('USERENV','SESSION_USER') = 'JINGYU';

no rows selected

SQL> 

2.测试审计效果

查询FGA_LOG$,确认审计效果:
select * from FGA_LOG$ where OBJ$NAME = 'EMP';

测试审计效果:

  • 使用JINGYU用户更新SCOTT.EMP下的一条记录;预期结果是有审计信息生成。
  • 使用LUDAN用户更新SCOTT.EMP下的一条记录;预期结果是无审计信息生成。

3.控制审计策略

**3.1 禁用/启用审计策略** 官方文档语法:

--禁用审计策略
DBMS_FGA.DISABLE_POLICY(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2 );
--启用审计策略
DBMS_FGA.ENABLE_POLICY(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2,
enable BOOLEAN);

--禁用审计策略
BEGIN
DBMS_FGA.DISABLE_POLICY (
object_schema   =>  'scott',
object_name     =>  'emp',
policy_name     =>  'FGA_TEST_01');
END;
/

--启用审计策略
BEGIN
DBMS_FGA.ENABLE_POLICY (
object_schema    =>  'SCOTT',
object_name      =>  'EMP',
policy_name      =>  'FGA_TEST_01',
enable           =>   TRUE);
END;
/

3.2 删除审计策略
官方文档语法:

DBMS_FGA.DROP_POLICY(
object_schema VARCHAR2,
object_name VARCHAR2,
policy_name VARCHAR2 );

--删除policy
BEGIN
DBMS_FGA.DROP_POLICY(
   object_schema  => 'SCOTT',
   object_name => 'EMP',
   policy_name => 'FGA_TEST_01');
END;
/
编辑推荐:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示