Oracle的审计是一个事后的工作,即数据库出现安全问题后,为了定位、发现问题的根源,可以通过审计追根溯源。Oracle审计主要包含以下3个部分:
Trigger-based Auditing(触发器)
Auditing the sys User-(SYS用户审计)
Standard Auditing (标准审计)
触发器审计
下面是一个触发器审计的例子,一旦emp表的sal字段的值增大超过1.1倍,就在审计表emp_sal_audit里记录该次操作。
CREATE TRIGGER trg_a_idu_r_emp_sal
AFTER INSERT OR DELETE OR UPDATE OF sal ON emp
FOR EACH ROW
BEGIN
IF (:NEW.sal > :OLD.sal * 1.10)
THEN INSERT INTO emp_sal_audit VALUES (:OLD.empno
,:OLD.sal
,:NEW.sal
,user
,sysdate);
END IF;
END;
/
SYS用户的审计
对SYS用户的审计比较特殊,因为SYS用户的权限太大,它的审计信息不能存储在数据库里,否则SYS可以随意修改审计信息,因此sys用户审计日志写到操作系统日志中。
下面是一个例子:
1)首先启动对SYS用户的审计
SQL> alter system set audit_sys_operations = true scope = spfile;
系统已更改。
2)由SYS用户向测试表插入一条数据
SQL> show user
USER 为 "SYS"
SQL> insert into test.t (object_id) values(1);
已创建 1 行。
SQL> commit;
提交完成。
3)在操作系统日志中可以看到如下信息:
Audit trail: LENGTH : '176' ACTION :[7] 'CONNECT' DATABASE USER:[1] '/' PRIVILEGE :[6] 'SYSDBA' CLIENT USER:[12] 'CORP\xianzhu' CLIENT TERMINAL:[14] 'L-SHC-00436132' STATUS:[1] '0' DBID:[10] '1327298419' .
标准审计
标准审计根据对象不同,可以分为以下4个部分:
审计会话
审计对象
审计操作
审计授权
下面以审计对象为例:
1)首先,开启标准审计
SQL> ALTER SYSTEM SET AUDIT_TRAIL = DB,EXTENDED SCOPE = SPFILE;
系统已更改。
SQL> audit select, insert, update, delete on test.t;
审计已成功。
2)在表上做DML操作
SQL> delete from test.t;
已删除72768行。
SQL> insert into t (object_id) values(1);
已创建 1 行。
SQL> commit;
提交完成。
3)在审计表里查看相应审计信息
SQL> col userid for a10
SQL> col obj$name for a10
SQL> col sqltext for a40
SQL> select userid,obj$name,sqltext from sys.aud$ where userid='TEST' and obj$name='T';
USERID OBJ$NAME SQLTEXT
---------- ---------- ----------------------------------------
TEST T delete from test.t
TEST T insert into t (object_id) values(1)
步骤
第1步:查看审计功能是否开启?
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
audit_trail 的value值为NONE表示不开启;
audit_trail 的value值为FALSE表示不开启;
audit_trail 的value值为DB表示开启;
audit_trail 的value值为TURE表示开启;
audit_trail 的value值为OS表示审计记录写入一个操作系统文件(不是特别理解);
第2步:开启审计功能
SQL> alter system set audit_sys_operations=TRUE scope=spfile;--审计管理用户(以sysdba/sysoper角色登陆)
SQL> alter system set audit_trail=db,extended scope=spfile;
重启实例
第3步:关闭审计功能
SQL> conn /as sysdba
SQL> show parameter audit
SQL> alter system set audit_trail = none scope=spfile;
重启实例
Oracle使用大量不同的审计方法来监控使用何种权限,以及访问哪些对象。审计不会防止使用这些权限,但可以提供有用的信息,用于揭示权限的滥用和误用。
审计类型说明
语句审计 按照语句类型审计SQL语句,而不论访问何种特定的模式对象。也可以在数据库中指定一个或多个用户,针对特定的语句审计这些用户
权限审计 审计系统权限,例如CREATE TABLE或ALTER INDEX。和语句审计一样,权限审计可以指定一个或多个特定的用户作为审计的目标
模式对象审计 审计特定模式对象上运行的特定语句(例如,DEPARTMENTS表上的UPDATE语句)。模式对象审计总是应用于数据库中的所有用户
细粒度的审计 根据访问对象的内容来审计表访问和权限。使用程序包DBMS_FGA来建立特定表上的策略
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_trail:
None:是默认值,不做审计;
DB:将audit trail 记录在数据库的审计相关表中,如aud$,审计的结果只有连接信息;
DB,Extended:这样审计结果里面除了连接信息还包含了当时执行的具体语句;
OS:将audit trail 记录在操作系统文件中,文件名由audit_file_dest参数指定;
XML:10g里新增的。
10g Values:
none
Disables database auditing.
os
Enables database auditing and directs all audit records to the operating system's audit trail.
db
Enables database auditing and directs all audit records to the database audit trail (theSYS.AUD$table).
db,extended
Enables database auditing and directs all audit records to the database audit trail (theSYS.AUD$table). In addition, populates theSQLBINDandSQLTEXTCLOB columns of theSYS.AUD$table.
xml
Enables database auditing and writes all audit records to XML format OS files.
xml,extended
Enables database auditing and prints all columns of the audit trail, including SqlText and SqlBind values.
注: 参数AUDIT_TRAIL不是动态的,为了使AUDIT_TRAIL参数中的改动生效,必须关闭数据库并重新启动。在对SYS.AUD$表进行审计时, 应该注意监控该表的大小,以避免影响SYS表空间中其他对象的空间需求。推荐周期性归档SYS.AUD$中的行,并且截取该表。Oracle提供了角色 DELETE_CATALOG_ROLE,和批处理作业中的特殊账户一起使用,用于归档和截取审计表。
audit_file_dest:Audit_trail=OS时 文件位置
审计的触发条件
根据语句执行是否成功进行审计
不管是语句,权限和对象都可以根据语句执行是否成功在审计语句后面加判断词,语法如下:
在审计语句后面加WHENEVER SUCCESSFUL or WHENEVER NOT SUCCESSFUL
如:
AUDIT CREATE TABLE WHENEVER NOT SUCCESSFUL;
AUDIT TRUNCATE TABLE WHENEVER NOT SUCCESSFUL;
根据指定用户进行审计
在做语句和权限进行审计的时候可以在审计语句后面加by再加指定用户名,多个用户用逗号隔开,例如下面语句为开启对scott,blake两个用户的所有select table和update table权限
AUDIT SELECT TABLE, UPDATE TABLE BY scott, blake;
AUDIT SELECT TABLE, UPDATE TABLE BY scott, blake;
审计相关的视图
可以通过dba_views查看所有相关的视图
select * from dba_views where view_name like '%AUDIT%'
最常用的视图如下:
---审计系统视图
select * from STMT_AUDIT_OPTION_MAP -- 审计选项类型代码
select * from AUDIT_ACTIONS -- action代码
select * from ALL_DEF_AUDIT_OPTS -- 对象创建时默认的对象审计选项
---三种审计已启用审计选项
select * from DBA_STMT_AUDIT_OPTS -- 当前数据库系统审计选项
select * from DBA_PRIV_AUDIT_OPTS -- 当前权限审计选项
select * from DBA_OBJ_AUDIT_OPTS ---查看当前审计了哪些对象
---审计结果,也可以直接查询sys.aud$表
select * from DBA_AUDIT_TRAIL ---查看审计记录,调用的sys.aud$表
select * from DBA_AUDIT_OBJECT ---查看对象审计记录
select * from DBA_AUDIT_SESSION -- session审计记录
select * from DBA_AUDIT_STATEMENT -- 查看语句审计记录
select * from DBA_AUDIT_EXISTS -- 使用BY AUDIT NOT EXISTS选项的审计
select * from DBA_AUDIT_POLICIES -- 审计POLICIES
select * from DBA_COMMON_AUDIT_TRAIL -- 标准审计+精细审计记录