

1. 始化参数AUDIT_TRAIL的默认值为'DB',也就是将所有的审计数据都存放到AUD$表,而这个表又默认是在SYSTEM的表空间里,建议将AUD$表迁移到其它的专门存放审计数据的表空间维护。
2. 监控可疑行为,数据库出现安全隐患以后利于排查分析。
3. 审计消耗性能,不是所有都审计,只审计可疑行为。
4. 审计记录可存在数据字典表(称为审计记录)或操作系统审计记录中。
审计的结果保存位置
操作系统OS:参数audit_file_dest指定
数据库DB:sys.aud$ 、 sys.FGA_LOG$
SQL> show parameter audit_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/orcl/adu
mp
强制审计
无论是否开启审计,强制审计默认开启的,审计哪些行为一定记录?
使用 as sysdba 或者 as sysoper 登录的用户
启动数据库
关闭数据库
强制审计的结果一定在OS上面
$ show parameter audit_file_dest
例:
sqlplus as sysdba
exit
$ cd u01/app/oracle/admin/orcl/adump
$ ls
orcl_ora_29370_1.aud
$ vim orcl_ora_29370_1.aud
Audit file u01/app/oracle/admin/orcl/adump/orcl_ora_29370_1.aud
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
ORACLE_HOME = u01/app/oracle/product/11.2.0/dbhome_1
System name: Linux
Node name: oracleEDU
Release: 2.6.18-308.el5
Version: #1 SMP Fri Jan 27 17:17:51 EST 2017
Machine: x86_64
Instance name: orcl
Redo thread mounted by this instance: 1
Oracle process number: 25
Unix process pid: 29370, image: oracle@oracleEDU (TNS V1-V3)
Sat Aug 16 07:24:00 2014 +08:00
LENGTH : '160'
ACTION :[7] 'CONNECT'
DATABASE USER:[1] '/'
PRIVILEGE :[6] 'SYSDBA'
CLIENT USER:[6] 'oracle'
CLIENT TERMINAL:[5] 'pts/1'
STATUS:[1] '0'
DBID:[10] '1380804050'
对DBA的审计
目的:监控管理所有操作行为
设置审计: AUDIT_SYS_OPERATIONS用来指定是超级管理员的审计
设置:true 审计 false 关闭(默认)
开启审计:
SQL> show parameter audit
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/orcl/adu
mp
audit_sys_operations boolean FALSE --> 未开审计
SQL> alter system set audit_sys_operations=true scope=spfile ;
SQL> shutdown immediate
SQL> startup
SQL> show parameter audit ;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_file_dest string /u01/app/oracle/admin/orcl/adu
mp
audit_sys_operations boolean TRUE --> 管理员审计开启
测试:
操作命令
dql: select
dml: insert update delete
dcl: grant reovke
ddl: create drop alter
事务语句:commit rollback;
conn as sysdba
select * from scott.dept;
create table a (a number);
insert into a values(1);
commit;
grant select on a to scott;
查审计
cd $ORACLE_BASE/admin/orcl/adump
先找出服务进程号 然后找到文件
SQL> SELECT spid
FROM v$session s, v$process p, v$mystat m
WHERE s.paddr = p.addr AND s.sid = m.sid AND m.statistic# = 0 ;
SPID
------------------------
30609
查看orcl_ora_30609.aud 文件
标准数据库审计(只针对普通用户)
1. 开启审计 设置参数audit_trail
对自己的对象开启审计,不需要授权,如果开启对其他用户的审计,需要audit any。为了安全性:O7_DICTIONARY_ACCESSIBILITY 一定设置为false 这样审计记录只有管理员可以看 ,而且非管理员是不可以审计sys的对象。
SQL> alter system set audit_trail=DB;
一般建议放入数据库中.保存在DB里由Oracle进行维护会减少和OS通信的IO操作.
开启数据审计,审计结果放入数据字典:
SQL> ALTER SYSTEM SET audit_trail=db SCOPE=SPFILE;
SQL> startup force ; 重启生效
开启审计后, 确认审计相关的表是否已经安装
SQL> connect AS SYSDBA
SQL> select * from sys.aud$;
SQL> select * from dba_audit_trail;
如果做上述查询的时候发现表不存在,说明审计相关的表还没有安装,需要安装。
SQL> connect as sysdba
SQL> @$ORACLE_HOME/rdbms/admin/cataudit.sql
2. 设置审计选项 auit /noauit
EM中的操作步骤:Server --> Security --> Audit Settings
审计:
i.对象:对一特殊模式对象上的指定语句的审计
ii.权限:对执行相应动作的系统特权的使用审计
iii.语句:对某种类型的SQL语句审计,不指定结构或对象。
BY SESSION:该选项表示在同一个会话中对完全相同的SQL语句只生成一条审计跟踪记录,该选项是默认选择.(相同语句只记录一次)
BY ACCESS:该选项标识每执行一次语句生成一条审计跟踪记录.当审计DDL语句或DDL系统权限时,无论指定BY ACCESS 还是 BY SESSION选项.oracle总是使用BY ACCESS选项.
BY 用户名:该选项用于指定审计特定的数据库用户.如果不指定该选项.oracle会自动审计除特权用户外的所有其他用户.(默认审计所有普通用户)
WHENEVER [NOT] SUCCESSFUL: WHENEVER SUCCESSFUL选项用于指定审计执行成功的操作,WHENEVER NOT SUCCESSFUL选项用于指定审计失败的操作.如果忽略这两个选项,则操作无论成功与否都会被审计.(默认无任成功还是失败都要记录)
SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
audit_trail string DB
SQL> truncate table sys.aud$;
Table truncated.
SQL> select count(*) from sys.aud$;
COUNT(*)
----------
0
1.使用审计
audit table (审计的是有关表的操作的DDL语句)
作用:审计普通用户对表的操作(create alter drop)
2. 执行一个对表修改的语句,让审计生效
conn scott/oracle
create table a (a number);
3. 查看审计记录
知道:所有标准数据库审计的结果:sys.aud$表里,查看视图dba_audit_trail
ACTION_NAME 查出对象操作语句是什么
查看审计
SELECT username,action_name,obj_name,
To_char(timestamp,'YYYY-MM_DD HH24:MI')
FROM dba_audit_trail;
4. 如何查看开启了那些语句审计DBA_STMT_AUDIT_OPTS
select USER_NAME, AUDIT_OPTION from DBA_STMT_AUDIT_OPTS
结果:对所有人都对表的操作语句审计
noaudit table ; 关闭多所有用户对表操作的审计
audit table by hr; 审计某一个用户 (测试一下)
5. 关闭审计
noaudit table by hr;
默认设置为by access
查看系统权限
select distinct PRIVILEGE from dba_sys_privs order by 1;
1. 使用系统权限审计
audit create table
2. 执行一个对表修改的语句,让审计生效
conn scott/oracle
create table a ( id number);
3.查看审计记录
知道:所有标准数据库审计的结果:sys.aud$
需要用视图去访问? DBA_AUDIT_TRAIL
SELECT username,action_name,obj_name,
To_char(timestamp,'YYYY-MM_DD HH24:MI')
FROM dba_audit_trail;
4.查看有已经设置了多少个权限审计
DBA_PRIV_AUDIT_OPTS
select * from DBA_PRIV_AUDIT_OPTS;
5. 删除权限审计
noaudit create table ;
可用来审计对表、视图、过程、序列、目录和用户定义的数据类型执行操作。
1. 使用对象审计
audit insert on scott.e by access;
2. 执行一个对表插入的语句,让审计生效
conn scott/oracle
insert into e(empno,ename) values(1,'tst');
commit;
3. 查看审计记录
知道:所有标准数据库审计的结果:sys.aud$
需要用视图去访问? DBA_AUDIT_TRAIL
SELECT username,action_name,obj_name,
To_char(timestamp,'YYYY-MM_DD HH24:MI')
FROM dba_audit_trail;
4. 查看有已经设置了多少个对象审计
DBA_OBJ_AUDIT_OPTS
select * from DBA_OBJ_AUDIT_OPTS;
5. 关闭对象审计
noaudit insert on scott.e ;
当SYS.AUD$表的审计记录越来越多的时候,以至达到存储极限时,会因为审计记录无法写入而产生错误。
或许我还也需要对该表的数据进行一些转储或者碎片的整理,或是删除一些我们认为不再需要的审计记录。这些都是要考虑的事情。下面给出一个对该表进行存储碎片的整理的一个方法:
a.将该表的数据selectinto到另一个表中,或利用export导出到外部文件
b.truncate这张表(要以超级管理员登录才行)
c.再将原先转储的数据再加载进来。
例:
SQL> create table audit_user_1215 tablespace users as select * from sys.aud$;
或者导出:exp system/oracle file=aud1215.dmp tables=sys.aud$;
清空记录: truncate table sys.aud$;
以下是一个审计的实例,用于记录尝试通过野蛮尝试法破译ORACLE帐号口令的例子。
1. 修改审计相关参数
2. 重启数据库
3. 设置审计信息
SQL>AUDIT ALL BY ACCESS WHENEVER NOT SUCCESSFUL
4. 查询AUD$
select returncode, action#, userid, userhost, terminal,To_char(timestamp#,'YYYY-MM_DD HH24:MI') from sys.aud$;
RETURNCODE ACTION# USERID USERHOST TERMINAL TO_CHAR(TIMESTAM)
---------- ---------- ---------- --------------- --------------- ----------------
1017 100 SCOTT yutianedu pts/1
1017 100 SCOTT yutianedu pts/1
1017 100 SCOTT yutianedu pts/1
ORA-1017的含义为错误的用户名口令。通过查看AUD$表可以清楚地看到尝试破译SCOTT的口令
解决方法:触发器
CONNECT SCOTT/oracle
DROP TABLE T1;
CREATE TABLE T1 AS SELECT SAL OLD_VALUE,SAL NEW_VALUE FROM EMP WHERE 0=9;
CREATE OR REPLACE TRIGGER TRG1
BEFORE INSERT OR UPDATE OF sal ON emp
FOR EACH ROW
BEGIN
INSERT INTO T1 VALUES(:OLD.SAL,:NEW.SAL);
END;
/
SELECT * FROM T1;
update emp set sal=sal+1;
commit;
select * from t1;
参考文档:Security Guide -- 9 Verifying Security Access with Auditing
Verifying Security Access with Auditing -- Auditing Specific Activities with Fine-Grained Auditing