談一談Oracle11gR2的審計(jì)管理
我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、土默特左旗ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的土默特左旗網(wǎng)站制作公司
作者:趙全文 網(wǎng)名:guestart
在Oracle數(shù)據(jù)庫的安全特性當(dāng)中,審計(jì)被作為特別重要的一個(gè)方面。數(shù)據(jù)庫的審計(jì)功能主要是用來審計(jì)各種類型的DDL和DML語句,而審計(jì)管理作為一項(xiàng)新特性被引進(jìn)到Oracle的11g R1版本當(dāng)中,此時(shí)它的審計(jì)功能并不強(qiáng)大而且還有許多bug,然而到了11gR2時(shí),已經(jīng)修復(fù)了很多bug及它的審計(jì)功能進(jìn)一步增強(qiáng)。
今天我和大家分享一下,在Oracle 11gR2的版本中,有關(guān)審計(jì)的一些特性。出于美國安全法,Oracle在11g 的版本對審計(jì)管理的策略有所改變,初始化參數(shù)AUDIT_TRAIL的默認(rèn)值為'DB',也就是說把所有的審計(jì)數(shù)據(jù)都存放到AUD$表,而這個(gè)表又默認(rèn)是在SYSTEM的表空間里。
當(dāng)我們在生產(chǎn)環(huán)境中部署一套Oracle數(shù)據(jù)庫以后,默認(rèn)審計(jì)功能是開啟的,業(yè)務(wù)剛上線那段時(shí)間,數(shù)據(jù)量不大時(shí),SYSTEM表空間的容量很寬裕,并沒有什么壓力。當(dāng)業(yè)務(wù)運(yùn)行了一段時(shí)間,突然有一天,前端應(yīng)用就會(huì)反映說,數(shù)據(jù)庫特別慢。這時(shí)我們DBA對數(shù)據(jù)庫進(jìn)行各種檢查,就會(huì)發(fā)現(xiàn)SYSTEM表空間的已用空間百分比為99.97%,這一點(diǎn)毫不夸張,我就親身經(jīng)歷過。我們說這是事后救火,其實(shí)我們完全可以在上線前,把AUD$表遷移到其它的專門存放審計(jì)數(shù)據(jù)的表空間,在業(yè)務(wù)上線并運(yùn)行一段時(shí)間之后,評估一下審計(jì)數(shù)據(jù)的數(shù)據(jù)量,然后設(shè)置審計(jì)數(shù)據(jù)的維護(hù)策略。
下面,我們采取三種方法對Oracle數(shù)據(jù)庫的審計(jì)進(jìn)行設(shè)置。嚴(yán)格的來說,是兩種方法,第一種更為粗暴,直接關(guān)閉審計(jì)功能,就是將初始化參數(shù)AUDIT_TRAIL的值設(shè)為'NONE',然后重啟數(shù)據(jù)庫使之生效;第二種和第三種是針對開啟數(shù)據(jù)庫審計(jì)功能的維護(hù)管理。在生產(chǎn)環(huán)境中,不建議使用第一種,因?yàn)殛P(guān)閉審計(jì)以后,數(shù)據(jù)庫出現(xiàn)安全隱患以后不利于排查分析。為了大家有所了解,我也一并演示操作。
首先,查看數(shù)據(jù)庫的版本,我所演示的環(huán)境為Oracle 11.2.0.4.0。
第一種方法,關(guān)閉審計(jì)功能。
第二種方法,把SYSTEM表空間里的AUD$表遷移到其它的表空間,以減輕SYSTEM表空間的壓力。
(1)查詢AUD$表所在的表空間
(2)查詢AUD$表的數(shù)據(jù)量有多少,發(fā)現(xiàn)竟然有80多G
(3)創(chuàng)建專門存放AUD$表的單獨(dú)的表空間AUDIT_TBS
(4)遷移AUD$表到新的表空間AUDIT_TBS
使用Oracle自帶的包DBMS_AUDIT_MGMT中的存儲過程SET_AUDIT_TRAIL_LOCATION來實(shí)現(xiàn),該存儲過程接受2個(gè)參數(shù),順序依次是AUDIT_TRAIL_TYPE和AUDIT_TRAIL_LOCATION_VALUE,參見官方文檔的如下截圖,
其中參數(shù)AUDIT_TRAIL_TYPE有以下幾種取值,見官方文檔的如下截圖,
各種取值的中文解釋如下:
AUDIT_TRAIL_ALL 所有的審計(jì)類型,包括標(biāo)準(zhǔn)數(shù)據(jù)庫審計(jì)、細(xì)粒度審計(jì)、操作系統(tǒng)審計(jì)和XML文件審計(jì)
AUDIT_TRAIL_AUD_STD 標(biāo)準(zhǔn)數(shù)據(jù)庫審計(jì)
AUDIT_TRAIL_DB_STD 標(biāo)準(zhǔn)數(shù)據(jù)庫審計(jì)和細(xì)粒度審計(jì)
AUDIT_TRAIL_FGA_STD 細(xì)粒度審計(jì)
AUDIT_TRAIL_FILES 操作系統(tǒng)和XML文件審計(jì)
AUDIT_TRAIL_OS 操作系統(tǒng)審計(jì),審計(jì)數(shù)據(jù)存放在操作系統(tǒng)的文件里
AUDIT_TRAIL_XML XML文件審計(jì),審計(jì)數(shù)據(jù)存放在XML文件里
在這里,我們使用標(biāo)準(zhǔn)數(shù)據(jù)庫審計(jì),所以使用參數(shù)AUDIT_TRAIL_AUD_STD。
參數(shù)AUDIT_TRAIL_LOCATION_TYPE的取值是要遷移到的表空間的名字AUDIT_TBS,要執(zhí)行的存儲過程如下圖所示,
從中發(fā)現(xiàn),執(zhí)行了將近一個(gè)小時(shí),才遷移完成。
此時(shí),AUDIT_TBS表空間已有數(shù)據(jù),SYSTEM表空間已經(jīng)釋放,壓力減輕。見下圖所示,
第三種方法,上面雖然減輕了SYSTEM表空間的壓力,但是如果不對審計(jì)數(shù)據(jù)進(jìn)行定時(shí)清除和歸檔這種維護(hù)管理的話,新的表空間的容量也會(huì)有不足的時(shí)候,因此也需要不定期的擴(kuò)充容量才可以。顯然,這也不是個(gè)完美的解決辦法。下面給審計(jì)設(shè)置維護(hù)策略, 6 / 12
(1)查詢AUD$表的數(shù)據(jù)開始生成的時(shí)間戳,現(xiàn)在是2017年2月8日,說明審計(jì)數(shù)據(jù)已保留了將近8個(gè)月。
(2)用Oracle自帶的包DBMS_AUDIT_MGMT中的存儲過程SET_AUDIT_TRAIL_PROPERTY設(shè)置審計(jì)的維護(hù)屬性,即每清除多少條數(shù)據(jù)提交一次。該存儲過程接受3個(gè)參數(shù),順序依次是AUDIT_TRAIL_TYPE、AUDIT_TRAIL_PROPERTY和AUDIT_TRAIL_PROPERTY_VALUE。
其中參數(shù)AUDIT_TRAIL_TYPE的取值在第二種方法已說明,參數(shù)AUDIT_TRAIL_PROPERTY和AUDIT_TRAIL_PROPERTY_VALUE的取值見下面的官方文檔說明,
這里,我們使用參數(shù)AUDIT_TRAIL_TYPE的取值為AUDIT_TRAIL_AUD_STD,參數(shù)AUDIT_TRAIL_PROPERTY的取值為DB_DELETE_BATCH_SIZE,參數(shù)AUDIT_TRAIL_PROPERTY_VALUE的取值為10000。那么執(zhí)行下面的存儲過程,
(3)用Oracle自帶的包DBMS_AUDIT_MGMT中的存儲過程INIT_CLEANUP設(shè)置審計(jì)數(shù)據(jù)保留的天數(shù),該存儲過程接受2個(gè)參數(shù),順序依次是AUDIT_TRAIL_TYPE和DEFAULT_CLEANUP_INTERVAL。見官方文檔的說明,其中參數(shù)DEFAULT_CLEANUP_INTERVAL的取值為1至999,單位為小時(shí)。
用Oracle自帶的包DBMS_AUDIT_MGMT中的存儲過程SET_LAST_ARCHIVE_TIMESTAMP設(shè)置上次歸檔審計(jì)記錄的時(shí)間戳,該存儲過程接受2個(gè)參數(shù),順序依次是AUDIT_TRAIL_TYPE、LAST_ARCHIVE_TIME和RAC_INSTANCE_NUMBER。見官文檔的說明,參數(shù)RAC_INSTANCE_NUMBER取默認(rèn)值NULL,可以不寫。
這里,我們設(shè)置審計(jì)數(shù)據(jù)保留的天數(shù)為30天,即720小時(shí),上次歸檔審計(jì)記錄的時(shí)間戳為30天之前。那么執(zhí)行下面的存儲過程,
(4)用Oracle自帶的包DBMS_AUDIT_MGMT中的存儲過程CREATE_PURGE_JOB設(shè)置每隔多長時(shí)間清除審計(jì)數(shù)據(jù)的JOB,該存儲過程接受4個(gè)參數(shù),順序依次是AUDIT_TRAIL_TYPE、AUDIT_TRAIL_PURGE_INTERVAL、AUDIT_TRAIL_PURGE_NAME和USE_LAST_ARCH_TIMESTAMP。見官方文檔的說明,
這里,我們每隔7天,即168小時(shí)清除一次審計(jì)數(shù)據(jù),那么設(shè)參數(shù)AUDIT_TRAIL_PURGE_INTERVAL的值為168,設(shè)參數(shù)USE_LAST_ARCH_TIMESTAMP的值為TRUE(也是默認(rèn)值)。那么執(zhí)行下面的存儲過程,
同時(shí),在EMCC 12C的監(jiān)控界面下已經(jīng)看到一個(gè)名叫“PURGE_AUD_STD”的JOB在運(yùn)行,還有相應(yīng)的SQL也在運(yùn)行。見下圖,
由于上次以來沒有進(jìn)行審計(jì)清理,現(xiàn)在保留了近8個(gè)月的數(shù)據(jù),所以現(xiàn)在一次清理,只保留30天的數(shù)據(jù)會(huì)稍顯費(fèi)時(shí)。不過執(zhí)行完這次JOB,以后再清理歷史數(shù)據(jù)就不費(fèi)吹灰之力了。
上面就把三種維護(hù)審計(jì)的方法都介紹完了,我們演示的只是將審計(jì)數(shù)據(jù)保存在DB里,其實(shí)還可以保存在OS和XML里,不過我不建議這樣做,按照官方文檔來說,保存在DB里由Oracle進(jìn)行維護(hù)會(huì)減少和OS通信的IO操作。
總結(jié):
1.直接關(guān)閉審計(jì),修改初始化參數(shù)AUDIT_TRAIL的值為NONE,并重啟數(shù)據(jù)庫生效;
2.將SYSTEM表空間中的AUD$表遷移到其它的表空間,以減輕SYSTEM表空間的壓力;
3.在第2種方法的基礎(chǔ)上,設(shè)置審計(jì)數(shù)據(jù)保留天數(shù)并定時(shí)清除過期的審計(jì)數(shù)據(jù)。
另外,本文在編寫過程中,參考了以下網(wǎng)址,特別說明
官方文檔 https://docs.oracle.com/cd/E18283_01/appdev.112/e16760/d_audit_mgmt.htm#BABDAHBG
oraclewiki http://www.oracle-wiki.net/startdocshowtomanageaudit
Laurent Leturgez https://laurent-leturgez.com/2011/06/09/managing-database-audit-trail-in-oracle-11gr2/
Suresh Karthikeyan https://www.pythian.com/blog/oracle-database-script-to-purge-aud-table-using-dbms_audit_mgmt-package/
如果您覺得此篇文章對您有幫助,歡迎關(guān)注微信公眾號:guestart的DBA學(xué)習(xí)筆記,您的支持是對我最大的鼓勵(lì)!