1.审计的功能:监控特定用户在database的action(操作)

2.审计种类:

1)标准数据库审计(语句审计、权限审计、对象审计)

2)基于值的审计(Value-Based触发器审计

3)精细审计 (FGA

3.启用审计 (默认不启用)

16:26:41 SQL> show parameter audit

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest                      string      /u01/app/oracle/admin/single06
                                                 /adump
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

audit_trail参数三个选项

  • 1)none 不启用audit
  • 2)db   将审计结果放在数据字典基表sys.aud$中,(一般用于审计非sys用户,也可以移出system表空间,在DB中的好处是方便检索)
  • 3)os   将审计结果放到操作系统的文件里(由audit_file_dest指定的位置,一般用于审计sys)

审计sys

1)oracle强制审计sys用户的特权操作,如启动和关闭数据库,结果记录在参数audit_file_dest指向的.aud文件中

2)指定参数audit_sys_operations=true(此参数只能spfile修改) 和 audit_trail = os

4. 标准数据库审计的三个级别

查看标准审计结果可以通过试图dba_audit_trail, 该视图读取aud$内容。

4.1 语句审计

按语句来审计,比如audit table 会审计数据库中所有的create table,drop table,truncate table语句,执行成功或不成功都可审计。

16:38:46 SQL> audit table;

Audit succeeded.

注:sys用户下audit table没有作用,必须要在非sys用户下执行audit table,且将会对所有非sys用户均有审计效果

4.2 权限审计

按权限来审计,当用户使用了该权限则被审计,如执行grant select any table to a; 当用户a访问了用户b的表时(如select * from b.t;)会用到select any table 权限,故会被审计。用户访问自己的表则不会被审计。

16:38:51 SQL> audit select any table;

Audit succeeded.


//查看权限
select * from dba_sys_privs where PRIVILEGE like '%SELECT%';

4.3 对象审计

按对象审计,只审计on关键字指定对象的相关操作,如:audit alter ,delete, drop, insert on cmy.t by scott;  这里会对cmy用户的t表进行审计,但同时使用了by子句,所以只会对scott用户发起的操作进行审计。

16:45:05 SQL> audit update on scott.emp;

Audit succeeded.

5. 基于值的审计

触发器来实现的。所以可以选择哪些信息进入审计记录,比如:只记录提交的信息,或不记录已改变的数据等

例,记录下scott的登陆轨迹

linux下sys:

16:58:50 SQL> truncate table aud$;

Table truncated.

16:59:03 SQL> audit session by scott;

Audit succeeded.

16:59:13 SQL> select count(*) from aud$;

  COUNT(*)
----------
         0

换个窗口scott:

[oracle@single07 ~]$ sqlplus scott/scott

linux下sys:

17:00:19 SQL> select count(*) from aud$;

  COUNT(*)
----------
         1

17:00:29 SQL> col username for a10;
17:00:40 SQL> col userhost for a30;
17:00:50 SQL> select username,userhost,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time",action_name from dba_audit_trail;

USERNAME   USERHOST                       TIMESTAMP
---------- ------------------------------ ------------------
ACTION_NAME
----------------------------
SCOTT      single07                       08-DEC-21
LOGON


17:01:37 SQL> noaudit session by scott;

Noaudit succeeded.

6.  精细审计  fine grained auditing (FGA). 它拓展了标准数据库审计,捕捉准确的sql语句

6.1 举例:精细审计,审计访问特定行或特定行的特定列。操作可用dbms_fga包。

17:07:12 SQL> create table scott.emp1 as select * from scott.emp;

Table created.

17:07:57 SQL> grant all on scott.emp1 to tim;

Grant succeeded.

1) 添加一个精细度审计策略

begin
dbms_fga.add_policy(
object_schema=>'scott',
object_name=>'emp1',
policy_name=>'chk_emp1',
audit_condition=>'deptno=20',
audit_column=>'sal',
statement_types=>'update,select'
);
end;
/

2)测试一下步骤,再查看审计结果

scott:

  • select * from emp1 where deptno=20;

tim:

  • update scott.emp1 set sal=8000 where empno=7902;
  • select empno,ename from scott.emp1 where deptno=20;    //缺少sal列,不审计

sys:

  • select empno,ename,sal from scott.emp1 where deptno=20;   //虽然符合条件,但sys默认不审计

3)验证审计结果

17:17:47 SQL> show user
USER is "SYS"
17:17:52 SQL> select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text from dba_fga_audit_trail;
DB_USER    time                 SQL_TEXT
---------- -------------------- --------------------------------------------------
SCOTT      2021-12-08 17:16:27  select * from emp1 where deptno=20
TIM        2021-12-08 17:16:57  update scott.emp1 set sal=8000 where empno=7902

可以看出,必须同时满足了所有审计条件(前面定义的)才能入选。另外没有审计SYS

17:23:58 SQL> delete fga_log$;

2 rows deleted.

17:24:19 SQL> commit;

Commit complete.

17:24:24 SQL> select db_user,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') "time" ,sql_text
from dba_fga_audit_trail; 

no rows selected

4) 删除FGA的PL/SQL命令

exec dbms_fga.drop_policy(object_schema=>'scott',object_name=>'emp1',policy_name=>'chk_emp1');

视图 DBA_AUDIT_TRIAL 显示标准数据库审计,DBA_FGA_AUDIT_TRIAL 显示 FGA, DBA_COMMON_AUDIT_TRAIL 则两者都显示.要查看触发器审核结果,必须创建处理自己定义的 表的自定义视图。