本篇內(nèi)容主要講解“什么是Oracle審計”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“什么是Oracle審計”吧!
創(chuàng)新互聯(lián)建站專注于烏海網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供烏海營銷型網(wǎng)站建設(shè),烏海網(wǎng)站制作、烏海網(wǎng)頁設(shè)計、烏海網(wǎng)站官網(wǎng)定制、小程序開發(fā)服務(wù),打造烏海網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供烏海網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
Oracle 11G以后,數(shù)據(jù)庫默認(rèn)是開啟審計功能的,因此有時候我們忘記了關(guān)閉該功能導(dǎo)致SYSTEM表空間暴滿,但由于關(guān)閉審計功能需要重啟數(shù)據(jù)庫,此類操作生產(chǎn)環(huán)境下是不允許的,因此我們需要找出哪類審計產(chǎn)生的較多,然后單獨(dú)的進(jìn)行關(guān)閉;我們可以通過如下方法查找:
如果你發(fā)現(xiàn)AUD$這個表比較大了,檢查下是哪種審計占的空間:
SQL> select
action_name,count(*) from dba_audit_trail group by
action_name;一般是LOGON和LOGOFF類型的審計最多。取消此類審計:
SQL> noaudit
session whenever
successful;一般來說,如果空間不是占的特別多,此類審計還是保留為好??梢匀∠麑σ恍┑卿浱貏e頻繁的用戶的審計,比如DBSNMP用戶:
SQL> noaudit
session by dbsnmp;
關(guān)閉審計后,對表sys.aud$進(jìn)行清理
truncate table sys.aud$;
1、什么是審計
審計(Audit)用于監(jiān)視用戶所執(zhí)行的數(shù)據(jù)庫操作,并且Oracle會將審計跟蹤結(jié)果存放到OS文件(默認(rèn)位置為$ORACLE_BASE/admin/$ORACLE_SID/adump/)或數(shù)據(jù)庫(存儲在system表空間中的SYS.AUD$表中,可通過視圖dba_audit_trail查看)中。默認(rèn)情況下11g之前審計是沒有開啟的。
不管你是否打開數(shù)據(jù)庫的審計功能,以下這些操作系統(tǒng)會強(qiáng)制記錄:用管理員權(quán)限連接Instance;啟動數(shù)據(jù)庫;關(guān)閉數(shù)據(jù)庫。
2、和審計相關(guān)的兩個主要參數(shù)
Audit_sys_Operations:
默認(rèn)為false,當(dāng)設(shè)置為true時,所有sys用戶(包括以sysdba,sysoper身份登錄的用戶)的操作都會被記錄,audit
trail不會寫在aud$表中,這個很好理解,如果數(shù)據(jù)庫還未啟動aud$不可用,那么像conn /as
sysdba這樣的連接信息,只能記錄在其它地方。如果是windows平臺,audti trail會記錄在windows的事件管理中,如果是linux/unix平臺則會記錄在audit_file_dest參數(shù)指定的文件中。
Audit_trail:
None:11G之前是默認(rèn)值,不做審計;
DB:將audit trail
記錄在數(shù)據(jù)庫的審計相關(guān)表中,如aud$,審計的結(jié)果只有連接信息;
DB,Extended:這樣審計結(jié)果里面除了連接信息還包含了當(dāng)時執(zhí)行的具體語句;
OS:將audit
trail 記錄在操作系統(tǒng)文件中,文件名由audit_file_dest參數(shù)指定;
xml:10g里新增的。
注:這兩個參數(shù)是static參數(shù),需要重新啟動數(shù)據(jù)庫才能生效。
3、審計級別
當(dāng)開啟審計功能后,可在三個級別對數(shù)據(jù)庫進(jìn)行審計:Statement(語句)、PRivilege(權(quán)限)、object(對象)。
Statement:
按語句來審計,比如audit table 會審計數(shù)據(jù)庫中所有的create table,drop table,truncate
table語句,alter session by
cmy會審計cmy用戶所有的數(shù)據(jù)庫連接。
Privilege:
按權(quán)限來審計,當(dāng)用戶使用了該權(quán)限則被審計,如執(zhí)行g(shù)rant select any table to a,當(dāng)執(zhí)行了audit
select any table語句后,當(dāng)用戶a 訪問了用戶b的表時(如select * from b.t)會用到select any
table權(quán)限,故會被審計。注意用戶是自己表的所有者,所以用戶訪問自己的表不會被審計。
Object:
按對象審計,只審計on關(guān)鍵字指定對象的相關(guān)操作,如aduit alter,delete,drop,insert on cmy.t
by scott;
這里會對cmy用戶的t表進(jìn)行審計,但同時使用了by子句,所以只會對scott用戶發(fā)起的操作進(jìn)行審計。注意Oracle沒有提供對schema中所有對象的審計功能,只能一個一個對象審計,對于后面創(chuàng)建的對象,Oracle則提供on
default子句來實(shí)現(xiàn)自動審計,比如執(zhí)行audit drop on default by access;后,
對于隨后創(chuàng)建的對象的drop操作都會審計。但這個default會對之后創(chuàng)建的所有數(shù)據(jù)庫對象有效,似乎沒辦法指定只對某個用戶創(chuàng)建的對象有效,想比trigger可以對schema的DDL進(jìn)行“審計”,這個功能稍顯不足。
4、審計的一些其他選項(xiàng)
by access / by session:
by access 每一個被審計的操作都會生成一條audit trail。
by
session 一個會話里面同類型的操作只會生成一條audit trail,默認(rèn)為by session。
whenever [not] successful:
whenever successful
操作成功(dba_audit_trail中returncode字段為0) 才審計,
whenever not successful
反之。省略該子句的話,不管操作成功與否都會審計。
5、和審計相關(guān)的視圖
dba_audit_trail:保存所有的audit
trail,實(shí)際上它只是一個基于aud$的視圖。其它的視圖dba_audit_session,dba_audit_object,dba_audit_statement都只是dba_audit_trail的一個子集。
dba_stmt_audit_opts:可以用來查看statement審計級別的audit
options,即數(shù)據(jù)庫設(shè)置過哪些statement級別的審計。dba_obj_audit_opts,dba_priv_audit_opts視圖功能與之類似
all_def_audit_opts:用來查看數(shù)據(jù)庫用on
default子句設(shè)置了哪些默認(rèn)對象審計。
6、取消審計
將對應(yīng)審計語句的audit改為noaudit即可,如audit session whenever successful對應(yīng)的取消審計語句為noaudit session whenever successful;
7、10g中的審計告知一切
Oracle 數(shù)據(jù)庫 10g 審計以一種非常詳細(xì)的級別捕獲用戶行為,它可以消除手動的、基于觸發(fā)器的審計。
假定用戶 Joe
具有更新那張表的權(quán)限,并按如下所示的方式更新了表中的一行數(shù)據(jù):
update SCOTT.EMP set salary = 12000 where
empno = 123456;
您如何在數(shù)據(jù)庫中跟蹤這種行為呢?在 Oracle 9i
數(shù)據(jù)庫及其較低版本中,審計只能捕獲“誰”執(zhí)行此操作,而不能捕獲執(zhí)行了“什么”內(nèi)容。例如,它讓您知道 Joe 更新了 SCOTT
所有的表EMP,但它不會顯示他更新了該表中員工號為 123456 的薪水列。它不會顯示更改前的薪水列的值 —
要捕獲如此詳細(xì)的更改,您將不得不編寫您自己的觸發(fā)器來捕獲更改前的值,或使用 LogMiner 將它們從存檔日志中檢索出來。
細(xì)粒度審計(FGA) ,是在
Oracle 9i 中引入的,能夠記錄 SCN 號和行級的更改以重建舊的數(shù)據(jù),但是它們只能用于 select 語句,而不能用于 DML ,如 update
、insert 和delete 語句。因此,對于 Oracle 數(shù)據(jù)庫 10g
之前的版本,使用觸發(fā)器雖然對于以行級跟蹤用戶初始的更改是沒有吸引力的選擇,但它也是唯一可靠的方法。
8、實(shí)例講解
8.1、激活審計
sqlplus / as sysdba
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
SQL> alter system set audit_sys_operations=TRUE scope=spfile;
--審計管理用戶(以sysdba/sysoper角色登陸)
SQL> alter system set
audit_trail=db,extended scope=spfile;
SQL> startup force;
SQL> show
parameter audit
NAME TYPE
VALUE
------------------------------------ -----------
------------------------------
audit_file_dest
string
/u01/app/oracle/admin/ORCL/adump
audit_sys_operations
boolean TRUE
audit_syslog_level
string
audit_trail string DB, EXTENDED
8.2、開始審計
sqlplus / as sysdba
SQL> audit all on t_test;
SQL> conn
u_test
SQL> select * from t_test;
SQL> insert into u_test.t_test
(c2,c5) values ('test1','2');
SQL> commit;
SQL> delete from
u_test.t_test;
SQL> commit;
SQL> conn /as sysdba
SQL> col
DEST_NAME format a30
col OS_USERNAME format a15
col USERNAME format
a15
col USERHOST format a15
col TERMINAL format a15
col OBJ_NAME format
a30
col SQL_TEXT format a60
SQL> select
OS_USERNAME,username,USERHOST,TERMINAL,TIMESTAMP,OWNER,obj_name,ACTION_NAME,sessionid,os_process,sql_text
from dba_audit_trail;
sql> audit select table by u_test by access;
如果在命令后面添加by
user則只對user的操作進(jìn)行審計,如果省去by用戶,則對系統(tǒng)中所有的用戶進(jìn)行審計(不包含sys用戶).
例:
AUDIT DELETE ANY TABLE; --審計刪除表的操作
AUDIT DELETE ANY TABLE
WHENEVER NOT SUCCESSFUL; --只審計刪除失敗的情況
AUDIT DELETE ANY TABLE WHENEVER
SUCCESSFUL; --只審計刪除成功的情況
AUDIT DELETE,UPDATE,INSERT ON user.table by
test; --審計test用戶對表user.table的delete,update,insert操作
8.3、撤銷審計
SQL> noaudit all on t_test;
9、審計語句
多層環(huán)境下的審計:appserve-應(yīng)用服務(wù)器,jackson-client
AUDIT SELECT TABLE BY appserve ON
BEHALF OF jackson;
審計連接或斷開連接:
AUDIT SESSION;
AUDIT SESSION BY jeff, lori; -- 指定用戶
審計權(quán)限(使用該權(quán)限才能執(zhí)行的操作):
AUDIT DELETE ANY TABLE BY ACCESS WHENEVER NOT
SUCCESSFUL;
AUDIT DELETE ANY TABLE;
AUDIT SELECT TABLE, INSERT TABLE,
DELETE TABLE, EXECUTE PROCEDURE BY ACCESS WHENEVER NOT SUCCESSFUL;
對象審計:
AUDIT DELETE ON jeff.emp;
AUDIT SELECT, INSERT, DELETE ON
jward.dept BY ACCESS WHENEVER SUCCESSFUL;
取消審計:
NOAUDIT session;
NOAUDIT session BY jeff, lori;
NOAUDIT DELETE
ANY TABLE;
NOAUDIT SELECT TABLE, INSERT TABLE, DELETE TABLE,EXECUTE
PROCEDURE;
NOAUDIT ALL; -- 取消所有statement審計
NOAUDIT ALL PRIVILEGES;
-- 取消所有權(quán)限審計
NOAUDIT ALL ON DEFAULT; -- 取消所有對象審計
10、清除審計信息
DELETE FROM SYS.AUD$;
DELETE FROM SYS.AUD$ WHERE obj$name='EMP';
11、審計視圖
STMT_AUDIT_OPTION_MAP -- 審計選項(xiàng)類型代碼
AUDIT_ACTIONS --
action代碼
ALL_DEF_AUDIT_OPTS -- 對象創(chuàng)建時默認(rèn)的對象審計選項(xiàng)
DBA_STMT_AUDIT_OPTS --
當(dāng)前數(shù)據(jù)庫系統(tǒng)審計選項(xiàng)
DBA_PRIV_AUDIT_OPTS -- 權(quán)限審計選項(xiàng)
DBA_OBJ_AUDIT_OPTS
USER_OBJ_AUDIT_OPTS -- 對象審計選項(xiàng)
DBA_AUDIT_TRAIL
USER_AUDIT_TRAIL -- 審計記錄
DBA_AUDIT_OBJECT
USER_AUDIT_OBJECT
-- 審計對象列表
DBA_AUDIT_SESSION
USER_AUDIT_SESSION --
session審計
DBA_AUDIT_STATEMENT
USER_AUDIT_STATEMENT --
語句審計
DBA_AUDIT_EXISTS -- 使用BY AUDIT NOT
EXISTS選項(xiàng)的審計
DBA_AUDIT_POLICIES -- 審計POLICIES
DBA_COMMON_AUDIT_TRAIL
-- 標(biāo)準(zhǔn)審計+精細(xì)審計
12、將審計結(jié)果表從system表空間里移動到別的表空間上
實(shí)際上sys.aud$表上包含了兩個lob字段,并不是簡單的move table就可以。
下面是具體的過程:
alter table
sys.aud$ move tablespace users;
alter table sys.aud$ move lob(sqlbind) store
as( tablespace USERS);
alter table sys.aud$ move lob(SQLTEXT) store as(
tablespace USERS);
alter index sys.I_AUD1 rebuild tablespace u
到此,相信大家對“什么是Oracle審計”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!