[日期:2017-10-08] | [字体:大 中 小] |
1.Audit的概念
Audit是监视和记录用户对数据库进行的操作,以供DBA进行问题分析。利用Audit功能,可以完成以下任务:
根据审计类型不同,审计记录中的信息也有所不同。通常,一条审计记录中包含用户名、会话标识、终端标识、所操作的模式对象名称、执行的操作、执行的完整语句代码、日期和时间戳、所使用的系统权限。
2.Audit的分类
在Oracle 11g中,一共有4种审计类型:
此外,根据用户是否成功执行,可以分为对执行成功的语句进行审计、对不成功的语句进行审计、无论成功与否都进行审计。
根据对同一个语句审计次数不同,可以分为会话审计和存取审计。会话审计是指对某个用户或所有用户的同一语句只审计一次,形成一条审计记录;存取审计是指对某个用户或所有用户的同一语句每执行一次审计一次,形成多条审计记录。
3.审计环境设置
使用审计功能,需要对数据库初始化参数AUDIT_TRAIL进行设置,其参数值可以为:
查看是否启用了审计功能:
- SQL> show parameter audit_trail
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- audit_trail string DB
修改审计环境参数:
--
- SQL > alter system set audit_trail = 'DB_EXTENDED'scope = spfile;
- System altered
- SQL > shutdown immediate;
- 需要重启数据库
- SQL > startup;
4.审计详解
4.1 语句审计(Statement auditing)
(1)语句审计是对特定的SQL语句进行审计,与具体的对象没有关系。创建语句审计的基本语法为:
shortcut| ALL |
- sql_statement_
[BY user_lists] | [IN SESSION CURRENT] [BY SESSION | ACCESS] [WHENEVER [NOT]SUCCESSFUL]
- ALL STATEMENTS
解释:
- sql_statement_shortcut:被审计的SQL语句的快捷方式;
- ALL:审计大部分SQL语句,这里不在列出;
- ALL STATEMENT:对最高级别的SQL语句进行审计,即对直接执行的SQL语句进行审计,而不对包含在PL/SQL程序中的SQL语句进行审计;
- BY user_lists:指定审计的用户,如果不指定,则审计全部用户;
- IN SESSION CURRENT:只对当前会话进行审计;
- BY SESSION:会话审计,同一个SQL语句只审计一次;
- BY ACCESS:存取审计,同一个SQL语句执行几次就审计几次;
- WHENEVER SUCCESSFUL:只审计执行成功的SQL语句;
- WHENEVER NOT SUCCESS:只审计执行不成功的SQL语句;
(2)如果要取消对某个语句的审计,只需将AUDIT命令改为NOAUDIT命令即可,其语法与创建AUDIT相同。
(3)通过数据字典DBA_STMT_AUDIT_OPTS可以了解当前数据库哪些用户进行了语句审计及审计设置信息。例如,查看与scott用户相关的语句审计:
- SQL> select * from dba_stmt_audit_opts where user_name='SCOTT';
- USER_NAME PROXY_NAME AUDIT_OPTION SUCCESS FAILURE
- --------- ----------- --------------- ---------- ----------
- SCOTT TABLE BY ACCESS BY ACCESS
- SCOTT INSERT TABLE BY ACCESS BY ACCESS
例子1.在scott模式下创建表test02,查看其审计信息。
查看audit_trace参数
- SQL> show parameter audit_trail
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- audit_trail string DB
step1.对scott用户创建语句审计
- audit table
- by scott
- by access
- audit insert table
- by scott
- by access
step2.创建表test02,插入2行数据:
- SQL> show user;
- User is "SCOTT"
- SQL> create table test02
- (
- id number,
- name varchar(40),
- local varchar(50)
- );
- Table created
- SQL> commit;
- Commit complete
- SQL> insert into test02
- values(1,'lihua','chengdu');
- SQL> insert into test02 values(2,'ll','dd');
- 1 row inserted
- SQL> commit;
- Commit complete
step3.查看sys.aud$和sys.audit_actions视图
- select
- a.userid,
- a.userhost,
- a.terminal,
- a.action#,
- aa.name,
- dbms_lob.substr(a.sqltext) as sqltext,
- dbms_lob.substr(a.sqlbind) as sqlbind,
- a.obj$creator,
- a.obj$name,
- a.ntimestamp#+8/24
- from
- sys.aud$ a,
- sys.audit_actions aa
- where
- a.obj$name = 'TEST02'
- and
- a.action# = aa.action
- and
- a.ntimestamp# > to_date('20170412','yyyymmdd');
结果为:
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ------- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST02 2017/4/15 13:58:54
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 14:00:00
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 15:27:26
结合sys.aud$和sys.audit.actions,我们可与看到对数据库进行了create table和2次insert操作,但是我们还是不知道具体信息。接下来,我们将audit_trail参数改为:audit_trail = db_extended。
step4.修改audit_trail参数
- SQL> alter system set audit_trail = 'DB_EXTENDED' scope = spfile;
- System altered
- SQL> shutdown immediate ;
- SQL>startup;
- SQL> show parameter audit_trail
- NAME TYPE VALUE
- ------------------------------------ ----------- ------------------------------
- audit_trail string DB_EXTENDED
此时,再向test02表插入1行数据
- SQL > insert into test02 values(3, 'cc', 'vv');
- 1 row inserted
- SQL > commit;
- Commit complete
step5.再次查看sys.aud$和sys.audit_actions视图
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ------- -------------------------- ---------------- ------- ------------- -------------------------------------- -------- ----------- -------- ------------------
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST02 2017/4/15 13:58:54
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 14:00:00
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT SCOTT TEST02 2017/4/15 15:27:26
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 2 INSERT insert into test02 values(3,'cc','vv') SCOTT TEST02 2017/4/15 16:31:53
可以看到,在SQLTEXT栏位有了具体的执行SQL语句。
4.2 权限审计
(1)权限审计是对特定的系统权限进行审计,语法为:
[ALL PRIVILEGES] [BYuser_lists] | [IN SESSION CURRENT] [BYSESSION | ACCESS] [WHENEVER [NOT]SUCCESSFUL]
- system_privilege |
(2)如果要了解当前数据库中对哪些用户使用了什么权限审计,可以通过数据字典DBA_PRIV_AUDIT_OPTS来查看。
例子2.对scott用户的select any table权限进行审计
step1.查看scott的系统权限
- SQL> select * from dba_sys_privs where grantee = 'SCOTT';
- GRANTEE PRIVILEGE ADMIN_OPTION
- ------------------------------ ---------------------------------------- ------------
- SCOTT CREATE ANY TABLE NO
- SCOTT UNLIMITED TABLESPACE NO
- SCOTT CREATE ANY VIEW NO
step2.使用scott用户,在模式‘LIJIAMAN’下创建表test03,查询其审计信息:
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ------ ------------------------- --------------- ---------- ------------ ---------------------------- -------- ------------ --------- ------------------
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE create table lijiaman.test03 LIJIAMAN TEST03 2017/4/15 19:08:20
- (
- id number,
- name varchar(20)
- )
step3.使用scott用户,在scott下创建表test05,查询其审计信息:
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ------- -------------------------- ---------------- ---------- --------------- -------------------- --------- ------------ ---------- ------------------
- SCOTT WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 1 CREATE TABLE SCOTT TEST05 2017/4/15 19:38:24
- create table test05
- (
- id number,
- name varchar(30)
- )
通过这个这个例子,我们可以看到,只要scott用户使用select any table权限,我们就可以通过审计得到其操作信息。
4.3 对象审计
(1)对象审计是指对特定模式对象的操作进行审计,与用户无关,语法为:
ALLON[schema.]object] [BYuser_lists] | [IN SESSION CURRENT][BYSESSION | ACCESS] [WHENEVER [NOT]SUCCESSFUL]
- sql_operation |
其中,sql_operation指定了特定对象上要审计的SQL语句。
(2)如果要查看当前数据库哪些模式对象进行了对象审计,可以通过查询DBA_OBJ_AUDIT_OPTS获得。
例子3.对模式scott下的表dept进行对象审计
- SQL > audit all on scott.dept by session;
- Audit succeeded
查看其审计信息:
- USERID USERHOST TERMINAL ACTION# NAME SQLTEXT SQLBIND OBJ$CREATOR OBJ$NAME A.NTIMESTAMP#+8/24
- ---------------- -------------------------- ---------------- ---------- ----------- ---------------------------------- -------- ------------ ---------- ------------------
- LIJIAMAN WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 103 SESSION REC select * from scott.dept SCOTT DEPT 2017/4/15 20:13:47
- LIJIAMAN WORKGROUP\DESKTOP-TKAPD8E DESKTOP-TKAPD8E 103 SESSION REC audit all on scott.dept by session SCOTT DEPT 2017/4/15 20:13:19
4.4 网络审计
网络审计对协议错误与网络层内部错误进行审计,网络审计捕获客户端与服务器通信过程中发生的错误,这些错误由SQL*NET网络服务抛出。网络审计的语法为:
- AUDIT NETWORK
- [BY SESSION | ACCESS]
- [WHENEVER [NOT] SUCCESSFUL]
下一篇介绍如何去清理Audit数据。
更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2017-10/147360p2.htm
来源: http://www.linuxidc.com/Linux/2017-10/147360.htm