暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

你想详细记录用户的行为?使用 Oracle 细粒度的审计功能

原创 ByteHouse 2024-08-15
1169

1.审计(Audit)


审计(Audit)用于监视用户所执行的数据库操作,审计信息可存储于数据字典表,称为审计记录。

审计的内容主要包括对数据库连接、SQL语句执行以及数据库对象访问等操作的跟踪记录

Oracle从大规模商用化到今天,一直在不断的推进审计功能模块,以适应灵活多变的用户需求。目前的Oracle审计功能,主要分为Traditional Audit和Fine Grained Audit(FGA)两种技术主线。这两条主线主要提供的是对于用户行为和数据两个主要层面的审计内容。

Oracle系统对任何用户所做的登录、操作数据库对象进行自动记录,以便使DBA在事后可以进行监督和检查。

审计可以提供有用的信息,用于揭示权限的滥用和误用。当需要一定的粒度时,DBA 可以使用细粒度的审计来监控对表中某些行或列的访问,而不仅仅是是否访问表。

当数据库的审计是使能的,在语句执行阶段产生审计记录。
审计记录包含:
(1)有审计的操作、
(2)用户执行的操作、
(3)操作的日期和时间等信息。

不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instance;启动数据库;关闭数据库。

在oracle 11g 中,审计功能(AUDIT_TRAIL)是默认开启的,AUDIT_TRAIL参数的缺省值为DB。审计数据默认存放SYSTEM 表空间下的SYS.AUD$ 审计字典基表上,可通过视图 DBA_AUDIT_TRAIL 查看。开启审计数据库会增加消耗,降低业务性能,因此,如果不是很必要,在安装好数据库后,可适当选择关闭数据库审计功能。

SQL> show parameter audit

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest 		     string	 /u01/app/oracle/admin/zwpt/adu
						 mp
audit_sys_operations		     boolean	 TRUE
audit_syslog_level		     string
audit_trail			     string	 DB
unified_audit_common_systemlog	     string
unified_audit_sga_queue_size	     integer	 1048576
unified_audit_systemlog 	     string
SQL>

Oracle 公司还推荐使用基于OS 文件的审计日志记录方式(OSaudit trail files),当AUDIT_TRAIL 设置为OS 时,审计记录文件将在AUDIT_FILE_DEST 参数所指定的目录中生成(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)。

若审计表不存在,则可以通过脚本$ORACLE_HOME/rdbms/admin/cataudit.sql来创建。

1.1.与审计相关的参数

  1. 初始化参数AUDIT_TRAIL用于控制数据库审计,取值说明如下所示:
  • NONE:禁用数据库审计。
  • OS:启用数据库审计,并将数据库审计记录写入操作系统文件中,文件名由audit_file_dest参数制定。
  • DB:启用数据库审计,并将数据库所有审计记录写入数据库的SYS.AUD$表。
  • DB,EXTENDED:启用数据库审计,并将数据库所有审计记录写入数据库的SYS.AUD$表。另外,填充SYS.AUD$表的SQLBIND列和SQLTEXT列。
  • XML:启用数据库审计,并将所有记录写到XML格式的操作系统文件中。
  • XML,EXTENDED:启用数据库审计,填充审计记录的所有列,包括SQLTEXT和SQLBIND的值。
  1. Audit_sys_operations
    是否对sysdba用户做审计 ,默认为false,当设置为true时,所有sys用户(包括以sysdba, sysoper身份登录的用户)的操作都会被记录,只是不记录之后sysdba操作的信息,而如果设置true,还会记录之后sysdba或者sysoper操作记录到audit trail中。
    audit trail不会写在aud$表中,当数据库还未启动aud$不可用,那么像 “conn /as sysdba”这样的连接信息,只能记录在其它地方。如果是Windows平台,audti trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。
    可以关闭审计,但是sysdba或者sysoper登录记录audit trail却无法禁掉。

3.AUDIT_SYSLOG_LEVEL
允许使用该实用程序将SYS标准OS审核记录写入系统审核日志SYSLOG。
audit_syslog_level的作用是将审计日志记录到操作系统的系统日志中,如linux下的/var/log/message里,默认情况下,该参数为none。
当该参数设置为user.notice 时,即使audit_sys_operations 被设置为false,audit_trail设置为none,此时仍然会在操作系统日志里记录sysdba的登录以及关闭启动数据库的操作;当audit_sys_operations 被设置为true时,sys用户的所有动作将被记录到系统日志里。

AUDIT_SYSLOG_LEVEL = 'facility_clause.priority_clause'

# facility_clause :: =
{ USER | LOCAL[0 | 1 | 2 | 3 | 4 | 5 | 6 | 7] | SYSLOG | DAEMON | KERN | MAIL | AUTH | LPR | NEWS | UUCP | CRON }

# priority_clause :: =
{ NOTICE | INFO | DEBUG | WARNING | ERR | CRIT | ALERT | EMERG }
  1. audit_file_dest:
    指定审计文件存放的位置。
    每次sysdba或者sysoper权限登录都会写入一个audit trail文件或者在现有的trail文件后面添加登录信息,而这个并不受audit_trail参数限制,audit_trail是显示是否启用审计和审计内容存储的具体位置 有关audit_sys_operations参数: AUDIT_SYS_OPERATIONS enables or disables the auditing of
    每次sysdba或者sysoper权限登录都会写入一个audit trail文件或者在现有的trail文件后面添加登录信息,而这个并不受audit_trail参数限制,audit_trail是显示是否启用审计和审计内容存储的具体位置

AUDIT_TRAIL 和 Audit_sys_operations 这两个参数是静态参数需要重启数据库才能生效。

1.2.启用审计

step 1.安装审计组件

SQL> select * from sys.aud$;

no rows selected

SQL> select * from dba_audit_trail;

no rows selected

SQL>

如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。

SQLPLUS> connect / as sysdba
SQLPLUS> @$ORACLE_HOME/rdbms/admin/cataudit.sql

审计表安装在SYSTEM表空间。所以要确保SYSTEM表空间又足够的空间存放审计信息。
安装后要重启数据库

step 2.查看是否审计功能是否启动

SQL> show parameter audit

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest 		     string	 /u01/app/oracle/admin/zwpt/adu
						 mp
audit_sys_operations		     boolean	 TRUE
audit_syslog_level		     string
audit_trail			     string	 DB
unified_audit_common_systemlog	     string
unified_audit_sga_queue_size	     integer	 1048576
unified_audit_systemlog 	     string
SQL>

audit_sys_operations值为FALSE就是没开审计

step 3.开启审计

# 审计管理用户(以sysdba/sysoper角色登陆)
SQL> alter system set audit_sys_operations=TRUE scope=spfile;
SQL> alter system set audit_trail=db,extended scope=spfile;

# 查看审计配置
SQL> show parameter audit

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean TRUE
audit_syslog_level string
audit_trail string DB, EXTENDED

step 3.重启数据库
开启审计要重启实例

step 4.关闭审计

SQL> conn /as sysdba
SQL> show parameter audit
SQL> alter system set audit_trail=none;

关闭审计也需要重启实例

1.3.ASM默认的审计策略

下面是在ASM实例下的操作:

SQL> show parameter audit

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string  /u01/app/11.2.0/grid/rdbms/audit
audit_sys_operations                 boolean  FALSE
audit_syslog_level                   string

可以注意到ASM实例参数中没有包含audit_trail参数,ASM实例的所有审计记录只能被写到audit_file_dest参数指定的目的地。
与Oracle数据库实例相同,以sysasm、sysdba登录到ASM实例都会在audit_file_dest目录下生成相应的审计文件,过于频繁的登录ASM实例将产生大量的审计文件。

1.4.审计分类和用法

  1. 强制审计
    不管你是否打开数据库的审计功能,以下这些操作系统会强制记录:用管理员权限连接Instance;启动数据库;关闭数据库。

  2. 标准审计
    根据用户语句的执行结果,审计语句分为成功语句的审计(Whenever Successful)、不成功语句的审计(Whenever NOT Successful)以及无论成功与否都进行审计(默认情况)。
    根据用户语句的执行次数,审计又分为对某一用户或全体用户的会话(By Session)审计、对某一用户或全体用户存取方式(By Access)的审计。
    某一用户或全体用户的会话审计表示用户语句每执行一次就审计一次;某一用户或全体用户存取方式审计表示相同语句执行多次时,每执行一次就审计一次。
    当数据库的审计功能被启动后,在用户语句执行阶段,系统会自动产生审计信息。审计信息中包括审计的操作、用户执行的操作、操作日期、操作时间等信息。

  3. DDL操作审计

  4. 强制审计

  5. FGA 细粒度审计

2.标准审计

标准审计审计SQL语句、权限、对象和网络活动。 可以使用AUDIT语句配置标准审计,使用NOAUDIT语句删除此配置。可以将审计记录写入数据库审计跟踪或操作系统审计文件。

以下权限将对所有用户审计
select privilege,success,failure from dba_priv_audit_o

以下语句也将对所有用户审计:
select audit_option,success,failure from dba_stmt_audit_opts;

2.1.审计内容分类

  1. 语句审计(Statement Auditing):对特定的SQL语句进行审计,不指定具体对象
AUDIT sql_statement_shortcut | ALL | ALL STATEMENTS
[BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]
  • sql_statement_shortcut:被审计的SQL语句shortcut;
  • ALL:审计大部分SQL语句,这里不在列出;
  • ALL STATEMENT:对最高级别的SQL语句进行审计,即对直接执行的SQL语句进行审计,而不对包含在PL/SQL程序中的SQL语句进行审计(ALL STATEMENT级别才能审计commit和rollback操作);
  • BY user_lists:指定审计的用户,如果不指定,则审计全部用户;
  • IN SESSION CURRENT:只对当前会话进行审计;
  • BY SESSION:会话审计,同一个SQL语句只审计一次;
  • BY ACCESS:存取审计,同一个SQL语句执行几次就审计几次;
  • WHENEVER SUCCESSFUL:只审计执行成功的SQL语句;
  • WHENEVER NOT SUCCESS:只审计执行不成功的SQL语句;

例如

-- all statement 级别
audit all statements by aud_user by access;
 
-- DML
audit update table, insert table, delete table by aud_user by access; 

-- Select
audit Select table by aud_user by access; 
 
-- 执行权限
AUDIT EXECUTE PROCEDURE by aud_user BY ACCESS WHENEVER NOT SUCCESSFUL;
 
-- 审计对表所有操作
audit table by aud_user by access;
 
-- 审计指定用户连接/断开操作
audit connect by aud_user;
-- 审计所有用户连接/断开操作
audit connect;
 
-- 审计用户授权操作
audit grant any role by access;
audit grant any object privilege by access;
audit grant any privilege by access;

要取消对某个语句的审计,只需将AUDIT命令改为NOAUDIT命令即可,其语法与AUDIT相同。NOAUDIT 取消审计的操作对已经连接的session无用,但新开的session将不再审计。

通过数据字典DBA_STMT_AUDIT_OPTS可以了解当前数据库哪些用户进行了语句审计及审计设置信息。例如,查看与scott用户相关的语句审计:

SQL> select * from dba_stmt_audit_opts where user_name='SCOTT';
 
USER_NAME PROXY_NAME  AUDIT_OPTION    SUCCESS    FAILURE
--------- ----------- --------------- ---------- ----------
SCOTT                 TABLE           BY ACCESS  BY ACCESS
SCOTT                 INSERT TABLE    BY ACCESS  BY ACCESS
  1. 权限审计(Privilege Auditing):对特定的系统权限使用情况进行审计
AUDIT system_privilege | [ALL PRIVILEGES] [BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]

例子

-- 每次成功使用ALTER TABLESPACE权限时,都会将一行内容添加到SYS.AUD$
audit alter tablespace by access whenever successful;
 
-- 审计 select any table权限
audit select any table by aud_user by access; 

通过数据字典DBA_PRIV_AUDIT_OPTS查看当前数据库中对哪些用户使用了什么权限审计。
  1. 对象审计(Object Auditing):对特定的对象上执行的特定语句进行审计
-- sql_operation指定特定对象上要审计的SQL语句
AUDIT sql_operation | ALL ON [schema.]object] [BY user_lists] | [IN SESSION CURRENT][BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]

例子

-- 审计对scott.dept表所有操作
audit all on scott.dept by access;
 
-- 审计对hr.employees表DML操作
audit update,insert,delete on hr.employees by access;

查询DBA_OBJ_AUDIT_OPTS查看当前数据库对哪些对象进行了对象审计

  1. 网络审计(Network Auditing):对网络协议错误与网络层内部错误进行审计

对协议错误与网络层内部错误进行审计,捕获客户端与服务器通信过程中发生的错误,这些错误由SQL*NET网络服务抛出。

AUDIT NETWORK [BY SESSION | ACCESS] [WHENEVER [NOT] SUCCESSFUL]

例子

-- Configuring Network Auditing
AUDIT NETWORK BY ACCESS;
 
--Removing Network Auditing
NOAUDIT NETWORK;

2.2.根据用户是否执行成功分类

  • 对执行成功的语句进行审计
  • 对失败的语句进行审计
  • 无论成功与否都进行审计

whenever [not] successful:

  1. whenever successful 操作成功(dba_audit_trail中returncode字段为0) 才审计,
  2. whenever not successful 反之。省略该子句的话,不管操作成功与否都会审计。

2.3.根据对同一语句审计次数分类

  • 会话审计(by session,默认):用户在同一会话执行的相同语句只审计一次,记一条审计记录
  • 访问审计(by access):用户执行多少次语句就审计多少次,形成多少条审计记录
SQL> audit select table by test by access;

如果在命令后面添加by user则只对user的操作进行审计,如果省去by用户,则对系统中所有的用户进行审计(不包含sys用户).

AUDIT DELETE ANY TABLE; --审计删除表的操作

AUDIT DELETE ANY TABLE WHENEVER NOT SUCCESSFUL; --只审计删除失败的情况

AUDIT DELETE ANY TABLE WHENEVER SUCCESSFUL; --只审计删除成功的情况

AUDIT DELETE,UPDATE,INSERT ON user.table by SYSTEM; --审计SYSTEM用户对表user.table的delete,update,insert操作

撤销审计

SQL> noaudit all on t_test;

2.4.示例

审计表的增,删,改;经过启用,HR会对其所有表的增,删,改进行行为记录,包括那些没有修改成功的操作.如:更新一条记录,但没有更新成功,也会被记录.

SQL> audit insert table,update table,delete table by HR;

审计存储过程的执行情况

SQL> audit execute procedure by HR;

验证

SQL> select os_username,username,to_char(extended_timestamp,'dd-mon-yyyy hh24:mi:ss') timestamp,owner,obj_name,action_name from dba_audit_trail where owner = 'HR' order by timestamp;
OS_USERNAME     USERNAME                       TIMESTAMP            OWNER               OBJ_NAME        ACTION_NAME
--------------- ------------------------------ -------------------- ------------------------------ ---------------
oracle          HR                             10-mar-2012 14:48:18 HR                   EMPLOYEES       UPDATE
oracle          HR                             10-mar-2012 14:50:24 HR                   EMPLOYEES       UPDATE
oracle          HR                             10-mar-2012 15:03:51 HR                   EMPLOYEES       UPDATE
oracle          HR                             10-mar-2012 15:04:07 HR                   EMPLOYEES       UPDATE
oracle          HR                             10-mar-2012 15:04:18 HR                   EMPLOYEES       UPDATE
oracle          HR                             10-mar-2012 16:39:57 HR                   EMPLOYEES       UPDATE
jeron           HR                             10-mar-2012 16:55:20 HR                   EMPLOYEES       UPDATE
oracle          HR                             10-mar-2012 19:16:53 HR                   ACCOUNTS        DELETE
6 rows selected.

只要是HR对表有任何增,删,改;视图dba_audit_trail中都可以查询出来;底层表为AUD$.

3.DDL操作审计

生产环境经常遇到DROP、TRUNCATE、DELETE等误操作,其中大部分影响较大的是DDL

  1. 启|禁用
alter system set enable_ddl_logging = TRUE|FALSE; -- 不需重启
  1. 审计记录位置
    审计内容只有时间、语句,不记录执行者
  • 12c之前版本,记录在 alert日志
  • 12c开始,记录在 “$ORACLE_BASE/diag/rdbms/dbname/dbname/log ddl”
    http://www.orasql.com/blog/archives/2014/09/05/tracking_drop_op.htm

4.强制审计

Oracle始终进行审计某些与数据库相关的操作,并将它们写入操作系统审计文件。即使已启用数据库审计(AUDIT_TRAIL参数设置为DB),Oracle仍会将强制审计内容写入操作系统文件。

默认情况下,操作系统文件位于$ORACLE_BASE/admin/$ORACLE_SID/adump目录中。在Windows系统上,Oracle数据库还会将此信息写入Windows事件查看器。可以通过设置AUDIT_FILE_DEST初始化参数来更改此目录的位置(重启生效)

强制审计包括以下操作:

  • 数据库启动:审计记录内容包括启动实例的操作系统用户,用户终端标识符以及日期和时间戳。此数据存储在操作系统审计跟踪中,因为数据库审计跟踪在成功完成启动之后才可用。
  • SYSDBA和SYSOPER登录:Oracle数据库记录所有SYSDBA和SYSOPER连接。
  • 数据库关闭:审计记录内容包括关闭实例的操作系统用户,用户终端标识符以及日期和时间戳。

5.细粒度审计(FGA)

细粒度审计(FGA) 是由DBMS_FGA的PL/SQL程序实现的。

从Oracle9i开始,就可以使用DBMS_FGA可以对指定的表的select语句进行审计;但是在9i中只能对select语句进行审计,在10g中可以实现对DML的审计功能

使用标准的审计,可以审计谁访问了哪些对象,但无法知道访问了哪些行或列。细粒度的审计可解决这个问题,它不仅为需要访问的行指定谓词(或where子句),还指定了表中访问的列

细粒度审计除了审计功能外,还可用于绑定变量值的捕获。

启用细粒度的审计功能不需要设置数据库的AUDIT_TRAIL初始化参数,只需要设置DBMS_FGA.ADD_POLICY存储过程中的AUDIT_TRAIL参数或使用默认值即可

5.1.处理器模块

FGA 的功能不只是记录审计线索中的事件;FGA 还可以任意执行过程。
过程可以执行一项操作,比如当用户从表中选择特定行时向审计者发送电子邮件警告,或者可以写到不同的审计线索中。这种存储代码段可以是独立的过程或者是程序包中的过程,称为策略的处理器模块。

实际上由于安全性原因,它不必与基表本身处于同一模式中,您可能希望特意将它放置在不同的模式中。
由于只要 SELECT 出现时过程就会执行,非常类似于 DML 语句启动的触发器,您还可以将其看作 SELECT 语句触发器。

以下参数指定将一个处理器模块指定给策略:

  • handler_schema 拥有数据过程的模式
  • handler_module 过程名称
  • 处理器模块还可以采用程序包的名称来代替过程名称。在这种情况下,参数 handler_module 在 package.procedure 的格式中指定。

5.2.如何在视图上使用 FGA ?

如何在视图上使用 FGA。假定在 ACCOUNTS 表上定义视图 VW_ACCOUNTS 如下:

create view bank.vw_accounts as select * from bank.accounts;

select * from bank.vw_accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;

如果您只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。
通过将视图名称而不是表的名称传递给打包的过程 dbms_fga.add_policy 中的参数 object_name,可以完成这项工作。
随后 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列将显示视图的名称,并且不会出现有关表访问的附加记录。

5.3.其它用途

除了记录对表的选择访问,FGA 还可用于某些其它情况:

  1. 您可以对数据仓库使用 FGA,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。您不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。
  2. 由于 FGA 捕获绑定变量,它可以帮助您了解绑定变量值的模式,这有助于设计直方图集合等。
  3. 处理器模块可以向审计者或 DBA 发送警告,这有助于跟踪恶意应用程序。
  4. 由于 FGA 可以作为 SELECT 语句的触发器,您可以在需要这种功能的任何时候使用它。

FGA 在 Oracle 数据库中支持隐私和职能策略。因为审计发生在数据库内部而不是应用程序中,所以无论用户使用的访问方法是什么(通过诸如 SQL*Plus 等工具或者应用程序),都对操作进行审计,允许进行非常简单的设置。

5.4.FGA 视图

在 Oracle9i Database 中,FGA 只能捕获SELECT 语句。利用Oracle Database 10g,FGA 还可以处理 DML 语句 —INSERT、UPDATE 和DELETE — 使其成为完整的审计特性。

FGA 策略的定义位于数据字典视图 DBA_AUDIT_POLICIES 中。

审计线索收集在 SYS 拥有的表 FGA_LOG$ 中。对于 SYS 拥有的任何原始表,此表上的某些视图以对用户友好的方式显示信息。DBA_FGA_AUDIT_TRAIL 是该表上的一个视图。
DBA_FGA_AUDIT_TRAIL 的新视图,它记录细粒度的访问信息。其中显示了审计事件的时间标记、查询者的数据库用户 ID、操作系统用户 ID、查询中所使用表的名称和所有者,最后还有确切的查询语句。在 Oracle9i Database 之前不可能得到这种信息,但随着 FGA 的推出,获得此信息变得轻而易举。

一个重要的列是 SQL_BIND,它指定查询中使用的绑定变量的值 — 这是显著增强该工具功能的一项信息。SQL_TEXT 列记录了用户提交的实际语句,而这正是您希望了解的。

另一个重要的列是 SCN,当发生特定的查询时,它记录系统更改号。此信息用于识别用户在特定时间看到了什么,而不是现在的值,它使用了闪回查询,这种查询能够显示在指定的 SCN 值时的数据。

如果您只希望审计对视图的查询而不是对表的查询,可以对视图本身建立策略。通过将视图名称而不是表的名称传递给打包的过程dbms_fga.add_policy 中的参数object_name,可以完成这项工作。随后 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列将显示视图的名称,并且不会出现有关表访问的附加记录。

除了记录对表的选择访问,FGA 还可用于某些其它情况:

  • 您可以对数据仓库使用 FGA,以捕获特定的表、视图或物化视图上发生的所有语句,这有助于计划索引。您不需要到 V$SQL 视图去获取这些信息。即使 SQL 语句已经超出了 V$SQL 的期限,在 FGA 审计线索中将会始终提供它。
  • 由于 FGA 捕获绑定变量,它可以帮助您了解绑定变量值的模式,这有助于设计直方图集合等。
  • 前文已经提到,处理器模块可以向审计者或 DBA 发送警告,这有助于跟踪恶意应用程序。
  • 由于 FGA 可以作为 SELECT 语句的触发器,您可以在需要这种功能的任何时候使用它。

FGA 使您在 Oracle 数据库中支持隐私和职能策略。因为审计发生在数据库内部而不是应用程序中,所以无论用户使用的访问方法是什么(通过诸如 SQL*Plus 等工具或者应用程序),都对操作进行审计,允许进行非常简单的设置。

5.5.FGA 审计和标准审计的差异 :

  1. 标准审计必须用参数 AUDIT_TRAIL 在数据库级启用。这个参数不是动态的;您必须重启数据库来使其生效。相比而言,FGA 不需要任何参数修改。
  2. 一旦被设置在一个对象上,标准审计将保持在那里。要解除它,必须用 NOAUDIT 命令删除审计选项。这可能很不方便,因为在一个表上丢弃审计选项也将丢弃元数据信息。然而,FGA 可以临时禁用和启用,不丢失任何元数据信息。
  3. FGA 只能够处理四种类型的语句:SELECT、INSERT、UPDATE 和 DELETE。相比而言,常规审计可以处理其它许多语句和权限,甚至会话连接和断开。
  4. 标准审计每次会话只创建一条记录(按会话)或每次访问对象创建一条记录(按访问)这种占用资源很少的方式对于控制审计线索表中的空间非常重要。FGA 并不是同样节省资源;它每次访问运行一次 — 使得线索更大。
  5. 通过记录线索,标准审计可以用来检测任何中断企图,如果企图没有成功,则将产生错误代码。而 FGA 不能。
  6. 标准审计可以写数据库表或 OS 文件。后者在审计员(不是数据库管理员)能够访问线索时非常有用。在 Windows 下,非数据库审计线索记录在事件日志中,并且可以用不同的方式对其进行访问。这个选项保护了审计线索的完整性。然而,FGA 日志仅写到数据库表 FGA_LOG$ 中。可以在 FGA 中创建用户自定义的审计处理程序来写 OS 文件,但它们的完整性不能保证。
  7. 标准审计可以设置用于默认对象。当表是在运行期创建时,这个功能变得极为有用:默认的审计选项允许没有数据库管理员干预的审计。这在 FGA 中是不可能的,用户必须在一个现有的表上创建策略,上述的情况只能在表已创建之后才可能发生。
  8. 在 FGA 中,审计更加灵活 — 仅当访问某些列,当某个特定的条件为真时等等。这种多功能性在您需要控制线索的增长时非常方便。
  9. 在 FGA 中,SQL 赋值变量默认被捕获。在标准审计中,必须把初始化参数 audit_trail设为 db_extended,以启用这一功能。
  10. 权限差异:标准审计需要审计系统或语句权限;FGA 只需要 dbms_fga 程序包上的运行权限。

5.6.创建 FGA 策略

step 1.创建表和数据

GRANT RESOURCE,CONNECT TO admin IDENTIFIED BY admin123;

CREATE TABLE admin.ACCOUNTS
(
ACCT_NO NUMBER PRIMARY KEY,
CUST_ID NUMBER NOT NULL ,
BALANCE NUMBER(15,2) NULL
);
insert into admin.accounts values(1,1,10000);
insert into admin.accounts values(2,2,20000);
commit;

step 2.添加审计策略
–audit_condition:限定审计记录表达式,null表示审计所有记录,例子中排除ogg用户
–statement_type:审计语句类型
–audit_column_opts:在某条语句涉及AUDIT_COLUMN实参中列出的任何列或所有列的情况下,确定是否进行审计。
–选项包括DBMS_FGA_ANY_COLUMNS (默认)以及DBMS_FGA_ALL_COLUMNS

begin
    dbms_fga.add_policy(
        object_schema=>'admin',
        object_name=>'ACCOUNTS',
        policy_name=>'ACCOUNTS_ACCESS'
    );
end;
/

step 3.查看审计策略

SQL> SELECT OBJECT_SCHEMA, OBJECT_NAME, POLICY_NAME FROM DBA_AUDIT_POLICIES;

 OBJECT_SCHEMA    OBJECT_NAME   POLICY_NAME
--------------------------------------------------------------------------------
 ADMIN            ACCOUNTS      ACCOUNTS_ACCESS

SQL>

step 4.执行sql

SQL> select * from admin.accounts;

   ACCT_NO    CUST_ID	 BALANCE
---------- ---------- ----------
	 1	    1	   10000
	 2	    2	   20000

step 5.查看审计信息

SQL> select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;

TIMESTAMP   DB_USER   OS_USER   OBJECT_SCHEMA   OBJECT_NAME   SQL_TEXT
-------------------------------------------------------------------------------------------
13-JUL-22   ADMIN     oracle     ADMIN          ACCOUNTS      select * from admin.accounts

SQL>

绑定变量bind variables

SQL> var i number;
SQL> select * from admin.accounts where CUST_ID=:i;

no rows selected

SQL> var i number;
SQL> exec :i:=1 

PL/SQL procedure successfully completed.

SQL> select * from admin.accounts where CUST_ID=:i;

   ACCT_NO    CUST_ID	 BALANCE
---------- ---------- ----------
	 1	    1	   10000

SQL>

查看审计

SQL> select timestamp, db_user,os_user,object_schema,object_name,sql_text from dba_fga_audit_trail;

TIMESTAMP DB_USER  OS_USER  OBJECT_SCHEMA  OBJECT_NAME  SQL_TEXT
-------------------------------------------------------------------------------------------
13-JUL-22 ADMIN  oracle  ADMIN  ACCOUNTS select * from admin.accounts
13-JUL-22 ADMIN  oracle  ADMIN  ACCOUNTS select * from admin.accounts where CUST_ID=:i

SQL>
SQL> audit update table, insert table, delete table by admin by access; 

Audit succeeded.

SQL>

审计列和审计条件, 在add_policy中加入

  1. audit_column => ‘BALANCE’
  2. audit_condition => ‘BALANCE >= 11000’
begin   
DBMS_FGA.ADD_POLICY (
   object_schema      =>  'admin', 
   object_name        =>  'ACCOUNTS', 
   policy_name        =>  'ANY_DML', 
   handler_schema     =>   NULL, 
   handler_module     =>   NULL, 
   enable             =>   TRUE, 
   statement_types    =>  'INSERT, UPDATE,SELECT', 
   audit_trail        =>   DBMS_FGA.DB + DBMS_FGA.EXTENDED, 
   audit_column_opts  =>   DBMS_FGA.ALL_COLUMNS);
end;
/

5.7.对绑定变量审计测试

SQL> var i number;
SQL>  exec :i:=2     

PL/SQL procedure successfully completed.

SQL> update admin.accounts set CUST_ID=:i;

2 rows updated.

SQL>
SQL> select timestamp, db_user,os_user,object_schema,object_name,sql_text,SQL_BIND from dba_fga_audit_trail;

TIMESTAMP  DB_USER OS_USER OBJECT_SCHEMA OBJECT_NAME SQL_TEXT SQL_BIND
------------------------------------------------------------------------------------------
13-JUL-22  ADMIN  oracle  ADMIN  ACCOUNTS  select * from admin.accounts
13-JUL-22  ADMIN  oracle  ADMIN  ACCOUNTS  select	* from	admin.accounts
13-JUL-22  ADMIN  oracle  ADMIN  ACCOUNTS  select * from admin.accounts where CUST_ID=:i #1(0):
13-JUL-22  ADMIN  oracle  ADMIN  ACCOUNTS  select * from admin.accounts where CUST_ID=:i #1(1):1
14-JUL-22  ADMIN  oracle  ADMIN  ACCOUNTS  select * from admin.accounts
14-JUL-22  ADMIN  oracle  ADMIN  ACCOUNTS  select * from admin.accounts
14-JUL-22  ADMIN  oracle  ADMIN  ACCOUNTS  update admin.accounts set CUST_ID=:i #1(1):2

7 rows selected.
SQL> 

关闭审计策略

begin
  dbms_fga.disable_policy(object_schema => 'admin',
                          object_name   => 'ACCOUNTS',
                          policy_name   => 'ACCOUNTS_ACCESS');
end;
/

开启审计策略

begin
  dbms_fga.enable_policy(object_schema => 'admin',
                         object_name   => 'ACCOUNTS',
                         policy_name   => 'ACCOUNTS_ACCESS',
                         enable        => TRUE);
end;
/

要删除策略,您可以使用以下语句:

Begin
  dbms_fga.drop_policy(object_schema => 'admin',
                       object_name   => 'ACCOUNTS',
                       policy_name   => 'ACCOUNTS_ACCESS');
end;
/

对于更改策略而言,没有随取随用的解决方案。要更改策略中的任何参数,必须删除策略,再使用更改后的参数添加策略。

6.统一审计功能

Oracle Database 12c 推出一套全新的审计架构,称为统一审计功能。统一审计主要利用策略和条件在 Oracle 数据库内部有选择地执行有效的审计。新架构将现有审计跟踪统一为单一审计跟踪,从而简化了管理,提高了数据库生成的审计数据的安全性。统一审计跟踪(unified audit trail)存放在SYSAUX表空间AUDSYS schema下的只读表中,审计信息通过UNIFIED_AUDIT_TRAIL视图以统一格式提供访问,在单实例和RAC中均可用。

12c的传统审计(即11g里的标准审计和精细审计):
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/AUDIT-Traditional-Auditing.html#GUID-ADF45B07-547A-4096-8144-50241FA2D8DD

12c的unified审计:
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/AUDIT-Unified-Auditing.html#GUID-B24D6874-4053-4E66-8238-6CD0C87E9DCA

6.1.启用统一审计

  1. 启用统一审计后,不再依赖于先前版本中使用的初始化参数
AUDIT_TRAIL
AUDIT_FILE_DEST
AUDIT_SYS_OPERATIONS
AUDIT_SYSLOG_LEVEL
UNIFIED_AUDIT_SGA_QUEUE_SIZE
  1. 审计记录格式和存放位置统一
    所有审计记录(包括对SYS的审计记录)都采用同一格式存放在同一位置,无须查看不同位置和查找不同格式的审计记录。
  2. 提升了审计记录的管理和安全性
  3. 整体审计性能大大提高。
    默认情况下,审计记录会自动写入AUDSYS架构中的内部关系表。
  4. 简单的审计策略管理方式
    可以创建命名审计策略,以审计第一节列出的受支持组件及SYS用户。此外,可以在策略中构建条件和排除项。
    如果使用 Oracle Audit Vault 和 Database Firewall,统一审计跟踪可以极大地方便收集审计数据,因为所有数据都来自同一位置。

6.2.传统审计与统一审计切换

step 1.查看数据库审计模式
TRUE为纯统一审计,FALSE为使用混合模式审计

SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

step 2.混合模式切换为纯统一审计

# 关闭数据库
conn /as sysdba
SHUTDOWN IMMEDIATE

# 切换 
$ lsnrctl stop listener_name
$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk uniaud_on ioracle ORACLE_HOME=$ORACLE_HOME
$ lsnrctl start listener_name

# 开启数据库
conn /as sysdba
STARTUP

step 3.关闭统一审计

# 关闭数据库
conn /as sysdba
SHUTDOWN IMMEDIATE

# 关闭统一审计
$ lsnrctl stop listener_name
$ cd $ORACLE_HOME/rdbms/lib
$ make -f ins_rdbms.mk uniaud_off ioracle
$ lsnrctl start listener_name

# 开启数据库
conn /as sysdba
STARTUP

6.3.统一审计策略管理

  1. 谁可以进行审计
    Oracle为执行审计的用户提供了两个角色:AUDIT_ADMIN和AUDIT_VIEWER。
  • AUDIT_ADMIN:创建统一和细粒度的审计策略、查看审计数据及管理审计跟踪管理(读写权限)
  • AUDIT_VIEWER:查看和分析审计数据(只读权限),需要此角色的用户通常是外部审计员。
  1. 12c默认开启的统一审计策略
    12c数据库中预先定义了一些审计策略,根据版本不同,默认开启的审计策略也略有不同。可以通过
    audit_unified_enabled_policies视图进行查看默认开启的统一审计策略

12.1.0.1中,默认开启了ORA_SECURECONFIG审计策略,数据库会根据这个审计策略
12.1.0.2中,默认开启了ORA_SECURECONFIG和ORA_LOGON_FAILURES审计策略

需要说明的是,ORA_SECURECONFIG审计策略在12.1.0.1和12.1.0.2的版本上的定义是不同的。

12.1.0.1中,ORA_SECURECONFIG审计策略包含了对所有LOGON和LOGOFF的审计。
12.1.0.2中,ORA_SECURECONFIG审计策略移除了对所有LOGON和LOGOFF的审计,而增加了一个新的审计策略ORA_LOGON_FAILURES,用于仅审计登陆失败的操作。这样更加方管理,也能改善因为大量LOGON和LOGOFF的审计对表空间的浪费。

6.4.配置统一审计策略

使用 CREATE AUDIT POLICY 语句

CREATE AUDIT POLICY policy_name
    { {privilege_audit_clause [action_audit_clause ] [role_audit_clause ]}
        | { action_audit_clause [role_audit_clause ] } 
        | { role_audit_clause }
     }        
    [WHEN audit_condition EVALUATE PER {STATEMENT|SESSION|INSTANCE}] 
    [CONTAINER = {CURRENT | ALL}];

step 1.创建审计策略,审计对表SRM.HRM_EMPLOYEES的select操作

create audit policy up1 actions select on SRM.HRM_EMPLOYEES;

step 2.启用审计策略

audit policy up1;

step 3.查看审计策略

select POLICY_NAME,AUDIT_OPTION_TYPE,OBJECT_NAME,COMMON from AUDIT_UNIFIED_POLICIES where POLICY_NAME=upper('up1');

step 4.查看已启用的审计策略

select USER_NAME,POLICY_NAME,ENABLED_OPT,SUCCESS,FAILURE from AUDIT_UNIFIED_ENABLED_POLICIES;

step 5.禁用审计策略

NOAUDIT POLICY UP1;

step 6.删除审计策略
在删除审计策略之前,必须禁用掉该审计策略,否则会报ORA-46361错误

DROP AUDIT POLICY UP1;
select POLICY_NAME,AUDIT_OPTION_TYPE,OBJECT_NAME,COMMON from AUDIT_UNIFIED_POLICIES where POLICY_NAME = upper('up1');

step 7.从oracle审计日志中提取登录信息

/*
从oracle审计日志中提取登录的ipv4,ipv6信息
ipv4 or ipv6
*/
select os_username, username, userhost, host, count(1) as sl
  from (select os_username,
               username,
               userhost,
               terminal,
               regexp_substr(comment_text,
              '([[:digit:]]+\.?){4}|([[:alnum:]]+\:\:?){4}([[:alnum:]]+\%?){1}([[:digit:]])+') as host
          from DBA_AUDIT_TRAIL
         where timestamp >= trunc(sysdate)
              and action = 100
           and action_name = 'LOGON') a
 group by os_username, username, userhost, a.host

7.迁移审计数据到独立表空间

由于AUD$表等审计相关的表存放在SYSTEM表空间,因此为了不影响系统的性能,保护SYSTEM表空间,最好把AUD$移动到其他的表空间上。可以使用下面的语句来进行移动:

sql> connect / as sysdba;

sql> alter table aud$ move tablespace ;
sql> alter index I_aud1 rebuild online tablespace ;

SQL> alter table audit$ move tablespace ;
SQL> alter index i_audit rebuild online tablespace ;

SQL> alter table audit_actions move tablespace ;
SQL> alter index i_audit_actions rebuild online tablespace ;

8.审计相关的试图

  • SYS.AUD$
    唯一保留审计结果的表,其它均为视图。
  • SYS.FGA_LOG$
    如果audit_trail参数包含DB,那么审计记录会被记录在FGA_LOG$表中。
  • STMT_AUDIT_OPTION_MAP
    包含有关审计选项类型代码的信息,由SQL.BSQ脚本在CREATE DATABASE时创建。
  • AUDIT_ACTIONS
    包含审计跟踪动作类型代码的描述,例如INSERT、DROP VIEW、DELETE、LOGON和LOCK。
  • ALL_DEF_AUDIT_OPTS
    包含默认对象审计选项。
  • USER_OBJ_AUDIT_OPTS
    描述当前用户拥有的所有对象上的审计选项。
  • DBA_AUDIT_TRAIL
    包含标准审计跟踪条目,USER_AUDIT_TRAIL只包含已连接用户的审计行。
  • USER_AUDIT_TRAIL
    显示与当前用户有关的审计跟踪条目。
  • DBA_AUDIT_OBJECT
    包含系统中所有对象的审计跟踪记录。
  • DBA_AUDIT_SESSION
    列出涉及CONNECT和DISCONNECT的所有审计记录。
  • USER_AUDIT_SESSION
    列出涉及当前用户的CONNECT和DISCONNECT的所有审计跟踪记录。
  • DBA_AUDIT_STATEMENT
    列出涉及数据库全部的GRANT、REVOKE、AUDIT、NOAUDIT和ALTER SYSTEM语句的审计跟踪记录。
  • DBA_AUDIT_EXISTS
    列出BY AUDIT NOT EXISTS产生的审计跟踪条目。
  • DBA_AUDIT_POLICIES
    记录了数据库中的细粒度审计策略定义。
  • DBA_FGA_AUDIT_TRAIL
    列出基于值的审计跟踪记录。
  • DBA_STMT_AUDIT_OPTS
    对语句生效的审计选项。
  • DBA_PRIV_AUDIT_OPTS
    对系统权限生效的审计选项。
  • DBA_OBJ_AUDIT_OPTS
    对数据库生效的审计选项。
  • V$XML_AUDIT_TRAIL
    如果audit_trail参数包含XML,那么审计记录会记录在AUDIT_FILE_DEST初始化参数指定的目的地下的XML文件中,Oracle会读取这些XML文件,生成V$XML_AUDIT_TRAIL动态性能视图,方便DBA查看审计详细信息。
  • AUDIT_FILE_DEST
    初始化参数:设置审计操作系统文件的存放位置。
  • DBA_AUDIT_POLICIES
    详细记录了审计配置的策略信息。
  • DBA_FGA_AUDIT_TRAIL
    查看到审计的SQL语句和绑定变量。
  • DBA_COMMON_AUDIT_TRAIL
    包含V$XML_AUDIT_TRAIL动态性能视图的内容,是标准和细粒度审计记录。
  • AUDIT_UNIFIED_POLICIES
    记录DB内所有统一审计策略
  • AUDIT_UNIFIED_ENABLED_POLICIES
    记录DB内所有已启用的统一审计策略
  • UNIFIED_AUDIT_TRAIL
    记录所有统一审计结果
col OS_USERNAME format a15
col SQL_TEXT format a30
COL AUDIT_TYPE format a10
col ACTION_NAME format a10
col UNIFIED_AUDIT_POLICIES format a10
select AUDIT_TYPE,OS_USERNAME,TERMINAL,ACTION_NAME, SQL_TEXT,UNIFIED_AUDIT_POLICIES from UNIFIED_AUDIT_TRAIL where OBJECT_NAME='SRM';
最后修改时间:2024-08-16 11:11:10
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论