DBA学习之路

敬畏数据,谨慎对待每一个问题

导航

Oracle审计介绍

Posted on 2024-05-21 15:53  dclogs  阅读(319)  评论(0编辑  收藏  举报

转自:https://www.cnblogs.com/fchdb/articles/14296602.html

1、什么是审计

审计(Audit)用于监视用户所执行的数据库操作,审计记录可存在数据字典表(称为审计记录:存储在system表空间中的SYS.AUD$中,可通过视图dba_audit_trail查看)或操作系统审计记录中(默认位置为$ORACLE_BASE/admin/$ORACLE_SID/adump/)。

标准审计的审计线索存储在 AUD$表中。

FGA 的审计线索存储在 FGA_LOG$表中。

默认情况下,这两个表 都是在 SYSTEM 表空间中创建的。通过使用数据泵导出和导入实用程序可将这两个表移到另一表空间中。

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

oracle安装后建议不审计session:no audit create session

ORACLE审计功能

•强制性审计:不管其它审计选项或参数如何设置,所有OracleDB都会审计特定的操作。由于数据库需要记录诸如授权用户连接等数据库活动,所以存在强制性审计日志。
• 标准数据库审计:通过使用AUDIT_TRAIL 初始化参数在系统级别启用。启用审计之后,选择要审计的对象和权限,并使用AUDIT 命令设置审计属性。
•基于值审计:扩展了标准数据库审计的功能,不仅会捕获发生的审计事件,还会捕获插入、更新或删除的实际值。基于值审计是通过数据库触发器实施的。
• 细粒度审计(FGA):扩展了标准数据库审计的功能,从而可捕获发出的实际SQL 语句,而不仅仅是发生事件的情况。
•SYSDBA(和SYSOPER)审计:将DBA与审计者或安全管理员的审计责任分离开,审计者或安全管理员在操作系统审计线索中负责监视DBA 的活动。

复制代码
Oracle DB 进行标准审计和细粒度审计时跟踪相同的字段,这使您可以轻松分析数据库活动。为实现这一点,标准审计线索和细粒度审计线索包含了彼此互补的属性。

通过标准审计收集的额外信息包括: • 系统更改号(SCN),记录对系统的每一项更改。 • 用户执行的确切 SQL 文本及与 SQL 文本一起使用的绑定变量。
只有已指定AUDIT_TRAIL=DB,EXTENDED 的情况下,这些列才会出现。
通过细粒度审计收集的额外信息包括: • 每个审计记录的序列号。 • 将源自一条语句的多个审计条目联系起来的语句编号。 公共属性包括:
• 用全球标准时间(UTC)表示的全球时间戳。这个字段在监视不同地理位置和不同时区中的 数据库时特别有用。
• 每个 Real Application Cluster(RAC)实例的唯一实例编号。
• 用于将一个事务处理的审计记录组成一组的事务处理标识符。
DBA_COMMON_AUDIT_TRAIL 视图中组合了标准审计日志记录和细粒度审计日志记录。
复制代码

如果数据库是使用Database Configuration Assistant (DBCA)创建的,默认情况下,audit_trail参数设置为DB。当AUDIT_TRAIL 设置为DB时,默认的行为是将审计线索记录到数据库的AUD$表中。对于大多数站点而言,这类审计不会对数据库性能造成太大影响。Oracle 建议使用操作系统审计线索文件。如果数据库是手动创建的(使用CREATE DATABASE命令),默认将AUDIT_TRAIL设置为NONE。

 

2、审计的安装

复制代码
SQLPLUS> connect / AS SYSDBA

SQLPLUS> select * from sys.aud$; --没有记录返回

SQLPLUS> select * from dba_audit_trail; - 没有记录返回

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

SQLPLUS> connect / as sysdba

SQLPLUS> @$ORACLE_HOME/rdbms/admin/cataudit.sql

审计表安装在SYSTEM表空间。所以要确保SYSTEM表空间又足够的空间存放审计信息。

安装后要重启数据库
复制代码

3、审计参数

audit_sys_operations 

默认为false,当设置为true时,所有sys用户(包括以sysdba, sysoper身份登录的用户)的操作都会被记录,audit trail不会写在aud$表中,这个很好理解,如果数据库还未启动aud$不可用,那么像conn /as sysdba这样的连接信息,只能记录在其它地方。如果是Windows平台,audti trail会记录在windows的事件管理中,如果是linux/unix平台则会记录在audit_file_dest参数指定的文件中。

audit_sys_operations参数为false时,系统只以os文件记录sysdba身份的登录、开关数据库的操作。
audit_sys_operations参数为true时,系统以os文件记录sysdba身份的登录、开关数据库的操作,以及其它辅助的操作。

audit_trail

None:是默认值,不做审计;

DB:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息,审计除了SYSDBA、SYSOPER权限用户以外的其他用户特定操作。

DB,Extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句,填充SYS.AUD$表的SQLBIND 列和SQLTEXT CLOB 列。

OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;

XML:审计记录会写入 AUDIT_FILE_DEST 参数指向的目 录中的 XML 文件。使用 V$XML_AUDIT_TRAIL 视图可查看此目录中的所有 XML 文件。

xml,extended 启用数据库审计,输出审计记录的所有列,包括SqlText和SqlBind的值。

Oracle公司还推荐使用基于OS文件的审计日志记录方式(OS audit trail files)。

注:这两个参数是static参数,需要重新启动数据库才能生效。

复制代码
SQL> conn /as sysdba

SQL> show parameter audit

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/ORCL/adump
audit_sys_operations boolean FALSE
audit_syslog_level string
audit_trail string NONE

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

SQL> alter system set audit_trail=db,extended scope=spfile;

SQL> alter system set audit_trail=none; --关闭审计
SQL>startup force
复制代码

 4、粗粒度审计功能

审计级别:
语句级审计(stmt):表示只审计某种类型的SQL语句,不指定结构或对象。
权限级审计(privs):表示只审计执行相应动作的系统权限的使用情况。
实体级审计(obj):表示只对指定模式上的实体指定语句的审计。

在 Oracle Database 11g 中启用审计时,将默认审计那些对安全性非常重要的特定权限和语句。 系统将针对所有用户,按成功、失败以及访问来审计幻灯片中列出的这些权限和语句。

(1)语句级审计

语句级审计表示只审计某种类型的SQL语句。可以审计某个用户,也可以审计所有用户的SQL语句。语句级审计的语法如下:

复制代码
AUDIT SQL语句选项 [by 用户名] [by session|access] [whenever [NOT] successful;

在使用时,不需要写出全部的SQL语句,只要写出语句的选项即可。

“by 用户名”表示只审计指定用户的SQL语句,不审计其他用户。没有指出用户名时,则审计全体用户。
audit table by scott; 表示scott用户在执行Create Table、Drop Table、Truncate Table操作时将被审计。


audit table; 表示所有用户执行该类型的语句都被审计。
“by session”表示按会话方式审计,在每个会话中,相同的语句只审计一次。这是系统默认的方式。
“by access”表示按存取方式审计,每一次语句都将审计。
“whenever successful”表示只审计成功语句。
“whenever not successful”表示只审计不成功语句。

eg:

audit table by scott by access;(审计scott用户每一次对表的CREATE、DROP、Truncate操作)。
audit table by scott by session;(审计scott用户对表的CREATE、DROP、Truncate操作,相同的操作只记录一次)。
audit session by tax02 by session whenever not successful;(审计tax02用户尝试连接数据库,但不成功的信息,相同的操作只记录一次)。
audit session by tax01,tax02;(审计tax01,tax02用户尝试连接数据库,成功的信息,相同的操作只记录一次)。
audit session whenever not successful;(审计尝试连接数据库,但不成功的信息)。

--当不再对用户进行审计时,可以使用noaudit命令,把用户进行的审计取消。
noaudit SQL语句或选项 [by 用户名] [by session|access] [Whenever [NOT] Successful]; 

复制代码

    

权限级审计 

    权限级审计表示只审计某一个系统权限的使用情况。可以审计某个用户所使用的系统权限,也可以审计所有用户使用的系统权限。权限级审计的语法如下:

复制代码
Audit 权限名称 [by 用户名] [by session|Access] [Whenever [NOT] Successful];

例如:
audit delete any table whenever not successful;(审计所有用户不成功的DELETE ANY TABLE权限使用情况)。
audit create table whenever not successful;(审计所有用户不成功的CREATE TABLE权限使用情况)。
audit alter any table,alter any procedure by scott by access whenever not successful;
audit create user by tax02 whenever not successful;

--当不再对用户的系统权限进行审计时,可以使用noaudit命令取消对用户所进行的审计。取消用户权限审计的命令如下:
noaudit 权限名称 [by 用户名] [by session|access] [whenever [NOT] Successful];
例如:
noaudit alter any table,alter any procedure by scott by access whenever not successful;
noaudit create user by tax02 whenever not successful;
noaudit create table whenever not successful;

审计停止后,用户所进行的操作将不再记录。
复制代码

实体级审计

    实体审计用于监视所有用户对某一指定用户的表的存取状况。实体级审计是不分审计对象的,数据库管理员关心的重点是哪些用户操作某一个指定用户的表。实体级审计的语法如下:

复制代码
audit 实体选项 on schema.实体名称 [by session | access] [Whenever [NOT] Successful];

例如:
audit delete on scott.emp by access whenever successful;(审计所有用户对scott.emp表所有成功的DELETE操作,每次操作都会记录)
audit delete on scott.dept by access whenever not successful;(审计所有用户对scott.emp表所有不成功的DELETE操作,每次操作都会记录)
audit select on sys.tab;(审计所有用户对sys.tab表的SELECT操作,相同的操作只会记录一次)
audit update on scott.dept;
audit update,delete on hr.employees by access whenever successful;
audit update,delete on hr.employees by user;(对user用户对hr.employees的update,delete进行审计)

--使用noaudit命令取消对用户实体所进行的审计。
例如:
noaudit delete on scott.emp by access whenever successful;
noaudit delete on scott.dept by access whenever not successful;
复制代码

     

查看创建了哪些审计:

dba_obj_audit_opts;(实体级审计)

select object_name,object_type,alt,aud,com,del,gra,ind,ins,loc,ren,sel,upd,ref,exe,cre,rea,wri from dba_obj_audit_opts where owner='SCOTT';

“-”表示没有设置该选项的审计。
“S”表示使用by session选项进行审计。
“A”表示使用by access选项进行审计。
“/”表示使用过whenever successful、whenever not successful选项值。

dba_priv_audit_opts;(权限级审计)

select user_name,privilege,success,failure from dba_priv_audit_opts;

dba_stmt_audit_opts;(语句级审计)

select user_name,audit_option,success,failure from dba_stmt_audit_opts;

取消所有审计

noaudit all;
noaudit all privileges;
noaudit update,delete on table_name [by username];

总结一:

复制代码
1. 对表的审计:可以单独对表的create,alter进行审计,如果要对drop操作进行审计需要对表加audit table(该命令包含有create table、drop table、truncate table);
audit alter table (该命令包含了 alter table ).
2. 对视图的审计:可以单独对视图的create进行审计,如果要对drop操作进行审计需要对视图加audit view(该命令包含有create view,drop view).
3. 对程序包的审计:可以对包(函数,存储过程等)的create进行审计,如果需要对drop操作进行审计需要加audit procedure(该命令对CREATE FUNCTION, CREATE LIBRARY , CREATE PACKAGE, CREATE PACKAGE BODY, CREATE PROCEDURE, DROP FUNCTION, DROP LIBRARY, DROP PACKAGE, DROP PROCEDURE进行审计)
4. 对用户的审计:可以通过audit user(该命令包含 create user,alter user,drop user)进行审计.
5、使用如下语句:
audit insert table; 
audit update table; 
audit delete table;
audit select table;
可以对所有用户(不包含sys用户)下的表进行insert、update、delete、select 审计。

eg:
1、select * from dba_audit_trail;
其中有“returncode”列:0,代表语句执行正常;非0,代表语句执行异常;有待验证
2、对于 drop table 语句的审核只能是 audit table; 
如果仅仅是对 alter any table 系统权限进行审核,当用户使用 alter table 语句修改用户所拥有的表时,是不会差生任何审核记录,因为没有用到 alter any table 系统权限。
3、AUDIT table BY ACCESS 对 drop table、alter table 和 create table 语句进行审核。
复制代码

查看审计结果视图:

dba_audit_trail;
    DBA_AUDIT_TRAIL displays all standard audit trail entries.
dba_audit_session;
   DBA_AUDIT_SESSION displays all audit trail records concerning CONNECT and DISCONNECT.
dba_audit_object;
   DBA_AUDIT_OBJECT displays audit trail records for all objects in the database.

5、基于值的审计

    进行数据库审计时会记录审计对象中发生的插入、更新和删除操作,但是不会捕获更改的实际值。要扩展 数据库审计,可使用基于值的审计,利用数据库触发(事件驱动的 PL/SQL 构造)来捕获更改的值。

  用户在连接了相应触发器的表中插入、更新或删除数据时,触发器在后台将审计信息复制到包含审计信息 的表中。因为审计触发器代码在每次插入、更新或删除操作发生时都必须执行,所以与标准数据库审计相比, 使用基于值的审计时,性能下降幅度比较大。性能下降幅度取决于触发器代码的效率。只在标准数据库审计捕 获的信息不足的情况下,才使用基于值的审计。

  基于值的审计由用户或第三方代码实施。Oracle DB 提供了可用来构建基于值的审计系统的 PL/SQL 构 造。基于值的审计的关键部分是审计触发器,这是一个单纯为了捕获审计信息而构造的 PL/SQL 触发器。

复制代码

--以下是一个审计触发器的典型示例:

CREATE OR REPLACE TRIGGER system.hrsalary_audit
AFTER UPDATE OF salary
ON hr.employees
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
IF :old.salary != :new.salary THEN
INSERT INTO system.audit_employees
VALUES (sys_context('userenv','os_user'), sysdate, sys_context('userenv','ip_address'),
:new.employee_id ||' salary changed from '||:old.salary|| ' to '||:new.salary);
END IF;
END;
/

复制代码

  这个触发器将审计的重点设置为捕获 hr.employees 表薪水列的更改。更新某行后,触发器就会检查薪 水列。如果新旧薪水不相等,则触发器会在 audit_employees 表(通过在 SYSTEM 方案中单独执行一项操 作而创建)中插入一条审计记录。审计记录中包括了用户名、执行更改的 IP 地址、标识所更改记录的主键及 更改的实际薪水值。

   如果标准数据库审计收集的数据不足,还可使用数据库触发器来捕获关于用户连接的信息。通过使用登录 触发器,管理员可以捕获用来标识连接到数据库的用户的数据。示例中包括下列各项: • 登录人员的 IP 地址 • 用于连接到实例的程序名的前 48 个字符 • 用于连接到实例的终端名

  在许多情况下,会使用细粒度审计(FGA)功能,而不会使用基于值的触发器。

6、细粒度审计(FGA)功能。

  数据库审计会记录已发生某个操作这一事实,但是不会捕获关于导致操作的语句的信息。细粒度审计(FGA) 扩展了审计功能,可捕获查询或处理数据的实际 SQL 语句。审计记录会被记录在FGA_LOG$表中。

  与标准数据库审计或基于值的数据库审计相比,FGA 将重点审计的范围设置得更窄。可将 FGA 选项设置为 按表或视图中的各个列进行审计,还可将其设置为条件选项,以便只在符合管理员定义的特定规范时才捕获审 计。FGA 策略支持多个相关列。默认情况下,如果其中任何一列出现在 SQL 语句中,就会审计该语句。通过使 用 DBMS_FGA.ALL_COLUMNS 和 DBMS_FGA.ANY_COLUMNS,可对语句中是否使用了任何或全部相关列来进 行审计。

  可使用 DBMS_FGA PL/SQL 程序包来创建对目标表或视图的审计策略。如果查询块中返回的任何行与审计 列和指定的审计条件相匹配,则审计事件会导致在审计线索中创建并存储审计记录。此外,审计事件还可执行 某个过程。FGA 自动将审计重点放在语句级别。一个 SELECT 语句会返回数千行,但只生成一条审计记录。细粒度审计除了审计功能外,还可用于绑定变量值的捕获,下面简单讨论一下DBMS_FGA包的使用:

  DBMS_FGA包主要包括ADD_POLICY,ENABLE_POLICY,DISABLE_POLICY,和DROP_POLICY这4个存储过程。

复制代码
范例:---模拟生成数据
CREATE TABLE BANK.ACCOUNTS ( ACCT_NO NUMBER PRIMARY KEY, CUST_ID NUMBER NOT NULL , BALANCE NUMBER(15,2) NULL ); insert into bank.accounts values(1,1,10000); insert into bank.accounts values(2,2,20000); commit; ---创建审计策略 dbms_fga.add_policy ( object_schema=>'BANK', object_name=>'ACCOUNTS', audit_column => 'BALANCE', audit_condition => 'BALANCE >= 11000', policy_name=>'ACCOUNTS_ACCESS'); end; / ---删除审计策略 Begin dbms_fga.drop_policy ( object_schema=>'BANK', object_name=>'ACCOUNTS', policy_name=>'ACCOUNTS_ACCESS'); ---查看是否生成审计
select BALANCE from bank.accounts;

COL TIMESTAMP FOR A20
COL DB_USER FOR A8
COL OS_USER FOR A8
COL OBJECT_SCHEMA FOR A5
COL OBJECT_NAME FOR A15
COL SQL_TEXT FOR A30
SELECT TIMESTAMP,DB_USER,OS_USER,OBJECT_SCHEMA,OBJECT_NAME,SQL_TEXT FROM DBA_FGA_AUDIT_TRAIL;
TIMESTAMP DB_USER OS_USER OBJEC OBJECT_NAME SQL_TEXT
-------------------- -------- -------- ----- --------------- -------------------------
2016-08-25 14:38:45 LHR oracle LHR ACCOUNT_LHR select * from lhr.account_lhr



---启用审计 begin dbms_fga.enable_policy ( object_schema => 'BANK', object_name => 'ACCOUNTS', policy_name => 'ACCOUNTS_ACCESS', enable => FALSE ); end; /
---禁用审计 begin dbms_fga.disable_policy ( object_schema => 'BANK', object_name => 'ACCOUNTS', policy_name => 'ACCOUNTS_ACCESS', enable => FALSE ); end; /
复制代码

 FGA 数据字典视图

复制代码
-- FGA 策略的定义位于数据字典视图 DBA_AUDIT_POLICIES 中。

-- 审计线索收集在 SYS 拥有的表 FGA_LOG$ 中。对于 SYS 拥有的任何原始表,此表上的某些视图以对用户友好的方式显示信息。DBA_FGA_AUDIT_TRAIL 是该表上的一个视图。
-- 一个重要的列是 SQL_BIND,它指定查询中使用的绑定变量的值 — 这是显著增强该工具功能的一项信息。
-- 另一个重要的列是 SCN,当发生特定的查询时,它记录系统更改号。
-- 此信息用于识别用户在特定时间看到了什么,而不是现在的值,它使用了闪回查询,这种查询能够显示在指定的 SCN 值时的数据。

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

数据字典视图 DBA_AUDIT_POLICIES 中重要的列
-----------------------------------------------------------------------
OBJECT_SCHEMA 对其定义了 FGA 策略的表或视图的所有者
OBJECT_NAME 表或视图的名称
POLICY_NAME 策略的名称 — 例如,ACCOUNTS_ACCESS
POLICY_TEXT 在添加策略时指定的审计条件 — 例如,BALANCE >;= 11000
POLICY_COLUMN 审计列 — 例如,BALANCE
ENABLED 如果启用则为 YES,否则为 NO 
PF_SCHEMA 拥有策略处理器模块的模式(如果存在)
PF_PACKAGE 处理器模块的程序包名称(如果存在)
PF_FUNCTION 处理器模块的过程名称(如果存在)

数据字典视图 DBA_FGA_AUDIT_TRAIL 中重要的列
-----------------------------------------------------------------------
SESSION_ID 审计会话标识符;与 V$SESSION 视图中的会话标识符不同
TIMESTAMP 审计记录生成时的时间标记
DB_USER 发出查询的数据库用户
OS_USER 操作系统用户
USERHOST 用户连接的机器的主机名
CLIENT_ID 客户标识符(如果由对打包过程 dbms_session.set_identifier 的调用所设置)
EXT_NAME 外部认证的客户名称,如 LDAP 用户
OBJECT_SCHEMA 对该表的访问触发了审计的表所有者
OBJECT_NAME 对该表的 SELECT 操作触发了审计的表名称
POLICY_NAME 触发审计的策略名称(如果对表定义了多个策略,则每个策略将插入一条记录。在此情况下,该列显示哪些行是由哪个策略插入的。)
SCN 记录了审计的 Oracle 系统更改号
SQL_TEXT 由用户提交的 SQL 语句 
SQL_BIND 由 SQL 语句使用的绑定变量(如果存在)
复制代码

注意事项:

  为 DML 语句定义了 FGA 策略时,如果要处理的数据行(包括新行和旧行)符合策略谓词标准,就会审计 DML 语句。但是,如果同时在策略定义中指定了相关列,则当数据符合 FGA 策略谓词并且语句引用了定义的相 关列时,才会审计语句。

   对于 DELETE 语句,在定义策略期间指定相关列是没有用的,这是因为 DELETE 语句会访问表中的所有 列。因此,不管相关列是什么,总是要审计 DELETE 语句。

  FGA 支持 MERGE 语句。如果基础 INSERT、UPDATE 和 DELETE 语句满足所定义的 INSERT、UPDATE 或 DELETE FGA 策略,则对会对这些语句进行审计

复制代码
--如果 FGA 策略定义错误,那么可以使用 DBMS_FGA.DROP_POLICY 存储过程来删除。
DBA_FGA_AUDIT_TRAIL 中的数据可以通过删除基表的方式来删除(基表为 SYS.FGA_LOG$),也可以直接
在视图上做删除操作:
DELETE FROM DBA_FGA_AUDIT_TRAIL; --直接在视图上做删除操作
DELETE FROM SYS.FGA_LOG$; --删除基表
其基表的获取方式可以有以下 2 种方式:
SELECT TEXT FROM DBA_VIEWS D WHERE D.VIEW_NAME='DBA_FGA_AUDIT_TRAIL'; --查询 TEXT 列
SELECT D.REFERENCED_OWNER, D.REFERENCED_NAME, D.REFERENCED_TYPE
FROM DBA_DEPENDENCIES D
WHERE D.NAME = 'DBA_SQL_PLAN_BASELINES'; --查询引用列
复制代码
复制代码
--如何禁用或删除某个用户下的所有细粒度审计?
BEGIN
FOR CUR IN (SELECT * FROM DBA_AUDIT_POLICIES) LOOP
DBMS_FGA.DISABLE_POLICY(CUR.OBJECT_SCHEMA,CUR.OBJECT_NAME,CUR.POLICY_NAME);--禁用
--DBMS_FGA.DROP_POLICY(CUR.OBJECT_SCHEMA,CUR.OBJECT_NAME,CUR.POLICY_NAME);--删除
END LOOP;
END;
复制代码

FGA 审计和标准审计的区别参考下表:

7、ASM默认的审计策略。

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

复制代码
SQL> show parameter audit
 
NAME                                 TYPE
------------------------------------ ----------------------
VALUE
------------------------------
audit_file_dest                      string
/u01/app/11.2.0/grid/rdbms/aud
it
audit_sys_operations                 boolean
FALSE
audit_syslog_level                   string
复制代码
    可以注意到ASM实例参数中没有包含audit_trail参数,ASM实例的所有审计记录只能被写到audit_file_dest参数指定的目的地。

    与Oracle数据库实例相同,以sysasm、sysdba登录到ASM实例都会在audit_file_dest目录下生成相应的审计文件,过于频繁的登录ASM实例将产生大量的审计文件。