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 则两者都显示.要查看触发器审核结果,必须创建处理自己定义的 表的自定义视图。