1.Audit的概念
Audit是监视和记录用户对数据库进行的 *** 作,以供DBA进行问题分析。利用Audit功能,可以完成以下任务:
监视和收集特定数据库活动的数据。例如管理员能够审计哪些表被更新,在某个时间点上有多少个并行用户统计数据;保证用户对自己的活动负责。这些活动包括在特定模式、特定表、特定行等对象上进行的 *** 作;审计数据库中的可疑活动。如一个未经授权的用户正从表中删除数据,那么数据库管理员必须审计所有数据库连接,以及在数据库中所有成功和失败的删除 *** 作。根据审计类型不同,审计记录中的信息也有所不同。通常,一条审计记录中包含用户名、会话标识、终端标识、所 *** 作的模式对象名称、执行的 *** 作、执行的完整语句代码、日期和时间戳、所使用的系统权限。
2.Audit的分类
在oracle 11g中,一共有4种审计类型:
语句审计(Statement Auditing):对特定的SQL语句进行审计,不指定具体对象;权限审计(Privilege Auditing):对特定的系统权限使用情况进行审计;对象审计(Object Auditing):对特定的模式对象上执行的特定语句进行审计;网络审计(Network Auditing):对网络协议错误与网络层内部错误进行审计。此外,根据用户是否成功执行,可以分为对执行成功的语句进行审计、对不成功的语句进行审计、无论成功与否都进行审计。
根据对同一个语句审计次数不同,可以分为会话审计和存取审计。会话审计是指对某个用户或所有用户的同一语句只审计一次,形成一条审计记录;存取审计是指对某个用户或所有用户的同一语句每执行一次审计一次,形成多条审计记录。
3.审计环境设置
使用审计功能,需要对数据库初始化参数AUDIT_TRAIL进行设置,其参数值可以为:
none:不启用审计功能;db:启用审计功能,审计信息写入sys.aud$数据字典中,审计的结果只有连接信息(sys用户的记录以及强制性要求的记录都写入 *** 作系统文件中);db_extended:审计结果除了有连接信息,还有执行的具体语句。关于db与db_extended的区别,见例子1;os:启用审计功能,审计信息写入 *** 作系统文件;xml:启用审计功能,审计信息写入xml格式的 *** 作系统文件中;查看是否启用了审计功能:
sql> show parameter audit_trail name TYPE VALUE------------------------------------ ----------- ------------------------------audit_trail string DB
修改审计环境参数:
> alter system set audit_trail = 'DB_EXTENDED' scope = spfile; System altered sqlshutdown immediate; --需要重启数据库 sql> startup;
4.审计详解
4.1 语句审计(Statement auditing)
(1)语句审计是对特定的SQL语句进行审计,与具体的对象没有关系。创建语句审计的基本语法为:
AUDITsql_statement_shortcut | ALL |
ALL STATEMENTS[BY user_Lists] | IN SESSION CURRENT] SESSION | ACCESS] WHENEVER [NOT] SUCCESSFul]
解释:
- 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用户相关的语句审计:
select * from dba_stmt_audit_opts where user_name=SCott'; USER_name PROXY_name AUDIT_OPTION SUCCESS FAILURE------- ----------- --------------- ---------- ----------SCott table BY ACCESS BY ACCESSSCott INSERT table BY ACCESS
例子1.在scott模式下创建表test02,查看其审计信息。
查看audit_trace参数
---------------------------------- ----------- ------------------------------audit_trail string DBstep1.对scott用户创建语句审计
audit tableby scott accessaudit insert by access
step2.创建表test02,插入2行数据:
> show user;User is "SCott" sqlcreate table test02 ( ID number,name varchar(40),local 50) ); table createdsqlcommit; Commit complete sqlinto test02 values(1,lihua',1)">chengdu);sqlinto test02 2,1)">lldd); 1 row inserted sql;Commit completestep3.查看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) sqlbind,a.obj$creator,a.obj$name,a.ntimestamp#from sys.aud$ a,sys.audit_actions aawhere a.obj$name TEST02'and a.action# aa.action a.ntimestamp# > to_date(20170412yyyymmdd');
结果为:
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 2017415 13:58:54SCott WORKGROUP\DESKtop2 INSERT SCott TEST02 14:00:0015:27:26
结合sys.aud$和sys.audit.actions,我们可与看到对数据库进行了create table和2次insert *** 作,但是我们还是不知道具体信息。接下来,我们将audit_trail参数改为:audit_trail = db_extended。
step4.修改audit_trail参数
spfile;System altered sqlshutdown immediate ;sqlstartup;sql show parameter audit_trailname TYPE VALUE---------------------------------- ----------- ------------------------------audit_trail string DB_EXTENDED此时,再向test02表插入1行数据
3,1)">ccvv);;Commit completestep5.再次查看sys.aud$和sys.audit_actions视图
26INSERT ') SCott TEST02 16:31:53可以看到,在sqlTEXT栏位有了具体的执行SQL语句。
4.2 权限审计
(1)权限审计是对特定的系统权限进行审计,语法为:
AUDIT system_privilege |
ALL PRIVILEGESBY user_ListsIN SESSION CURRENT] BY SESSION | ACCESSWHENEVER [NOT] SUCCESSFul](2)如果要了解当前数据库中对哪些用户使用了什么权限审计,可以通过数据字典DBA_PRIV_AUDIT_OPTS来查看。
例子2.对scott用户的select any table权限进行审计
step1.查看scott的系统权限
from dba_sys_privs where grantee ; GRANTEE PRIVILEGE admin_OPTION---------------------------- ---------------------------------------- ------------SCott CREATE ANY table NOSCott UNliMITED tableSPACE NOSCott VIEW NOstep2.使用scott用户,在模式‘liJIAMAN’下创建表test03,查询其审计信息:
USERID USERHOST TERMINAL ACTION# name sqlTEXT sqlBIND OBJ$CREATOR OBJ$name A.NTIMESTAMP#---- ------------------------- --------------- ---------- ------------ ---------------------------- -------- ------------ --------- ------------------SCott WORKGROUP\DESKtop-TKAPD8E table table lijiaman.test03 liJIAMAN TEST03 19:08:20 ( ID ) )
step3.使用scott用户,在scott下创建表test05,查询其审计信息:
USERID USERHOST TERMINAL ACTION# name sqlTEXT sqlBIND OBJ$CREATOR OBJ$name A.NTIMESTAMP#----- -------------------------- ---------------- ---------- --------------- -------------------- --------- ------------ ---------- ------------------SCott WORKGROUP\DESKtop-TKAPD8E table SCott TEST05 38:24 test05 ( ID 30) )
通过这个这个例子,我们可以看到,只要scott用户使用select any table权限,我们就可以通过审计得到其 *** 作信息。
4.3 对象审计
(1)对象审计是指对特定模式对象的 *** 作进行审计,与用户无关,语法为:
AUDITsql_operation ALL ON [schema.]object]] SUCCESSFul]其中,sql_operation指定了特定对象上要审计的SQL语句。
(2)如果要查看当前数据库哪些模式对象进行了对象审计,可以通过查询DBA_OBJ_AUDIT_OPTS获得。
例子3.对模式scott下的表dept进行对象审计
> audit all on scott.dept session; Audit succeeded
查看其审计信息:
USERID USERHOST TERMINAL ACTION# name sqlTEXT sqlBIND OBJ$CREATOR OBJ$name A.NTIMESTAMP#-------------- -------------------------- ---------------- ---------- ----------- ---------------------------------- -------- ------------ ---------- ------------------liJIAMAN WORKGROUP\DESKtop-TKAPD8E 103 SESSION REC from scott.dept SCott DEPT 20:47liJIAMAN WORKGROUP\DESKtop103 SESSION REC audit by session SCott DEPT 19
4.4 网络审计
网络审计对协议错误与网络层内部错误进行审计,网络审计捕获客户端与服务器通信过程中发生的错误,这些错误由sql*NET网络服务抛出。网络审计的语法为:
AUDIT NETWORK ][] SUCCESSFul]
下一篇介绍如何去清理Audit数据。
================================================================
2019年1月2日补充:
(1)如何关闭默认的login、logoff审计
在11g默认审计中,Oracle会去审计用户的登入登出 *** 作。如果用户登入登出 *** 作很多,那么sys.aud$表会非常的大。我的1个生产数据库由于没有关闭对登入登出的审计,导致积累了16GB的审计数据。在一个平时不怎么使用的测试库里面,登入登出的审计信息也非常的多。
select a.action#,b.name,1)">count(*) counter sys.aud$ a,sys.audit_actions bwhere a.action# b.actiongroup a.action#,b.nameorder by counter desc
如何关闭呢,可以使用SQL语句来关闭
sql> noaudit session;总结
以上是内存溢出为你收集整理的[Oracle]Audit(一)--认识Audit全部内容,希望文章能够帮你解决[Oracle]Audit(一)--认识Audit所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)