|
了解如何使用 Oracle 數(shù)據(jù)庫(kù)的細(xì)粒度審計(jì)特性來(lái)跟蹤對(duì)表中特定行的只讀訪問(wèn) — 以及更多信息 傳統(tǒng)的 Oracle 數(shù)據(jù)庫(kù)審計(jì)選件允許您在宏觀級(jí)別上跟蹤用戶在對(duì)象上所執(zhí)行的操作 — 例如,如果您審計(jì)對(duì)某個(gè)表的 SELECT 語(yǔ)句,則可以跟蹤是誰(shuí)從表中選擇了數(shù)據(jù)。但是,您不知道他們選擇了什么。利用數(shù)據(jù)操縱語(yǔ)句 — 如 INSERT、UPDATE 或 DELETE — 您可以通過(guò)使用觸發(fā)器或使用 Oracle LogMiner 實(shí)用程序來(lái)分析歸檔日志,從而捕獲任何的更改。因?yàn)楹?jiǎn)單的 SELECT 語(yǔ)句是不操縱數(shù)據(jù)的,它們既不啟動(dòng)觸發(fā)器,也不記入到那些以后可以進(jìn)行挖掘的歸檔日志中,所以這兩種技術(shù)在涉及到 SELECT 語(yǔ)句的地方無(wú)法滿足要求。 Oracle9i Database 推出了一種稱為細(xì)粒度審計(jì) (FGA) 的新特性,它改變了這種局面。該特性允許您將單個(gè)的 SELECT 語(yǔ)句聯(lián)同用戶提交的確切語(yǔ)句一起進(jìn)行審計(jì)。除了簡(jiǎn)單地跟蹤語(yǔ)句之外,F(xiàn)GA 還通過(guò)在每次用戶選擇特定的數(shù)據(jù)集時(shí)執(zhí)行一段代碼,提供了一種方法來(lái)模擬用于 SELECT 語(yǔ)句的觸發(fā)器。在分為三部分的這一系列文章中,我將說(shuō)明如何使用 FGA 解決實(shí)際問(wèn)題。這第一部分的主要內(nèi)容是構(gòu)建基本的 FGA 系統(tǒng)。 示例安裝 我們的示例基于一個(gè)銀行系統(tǒng),已經(jīng)通過(guò)應(yīng)用程序級(jí)的審計(jì)按照傳統(tǒng)提供了用戶訪問(wèn)特定數(shù)據(jù)的審計(jì)線索。但是,只要用戶使用諸如 SQL*Plus 等工具從應(yīng)用程序以外的地方訪問(wèn)數(shù)據(jù),該系統(tǒng)就不能滿足要求。在本文中,我將說(shuō)明作為 DBA 的您能夠如何使用 FGA 來(lái)完成捕獲用戶對(duì)特定行的 SELECT 訪問(wèn)的任務(wù),無(wú)論訪問(wèn)的工具或機(jī)制是什么。 在我們的示例中,數(shù)據(jù)庫(kù)有一個(gè)名為 ACCOUNTS 的表,由模式 BANK 擁有,其結(jié)構(gòu)如下:
Name Null? Type ---------------- -------- ------------ ACCT_NO NOT NULL NUMBER CUST_ID NOT NULL NUMBER BALANCE NUMBER(15,2)
為了構(gòu)造一個(gè)能夠?qū)θ魏卧诖吮碇羞x擇的用戶進(jìn)行審計(jì)的系統(tǒng),您需要定義對(duì)該表的 FGA 策略如下:
begin dbms_fga.add_policy ( object_schema=>'BANK', object_name=>'ACCOUNTS', policy_name=>'ACCOUNTS_ACCESS' ); end;
這段代碼必須由具有執(zhí)行程序包 dbms_fga 權(quán)限的用戶來(lái)執(zhí)行。但是,為了提高安全性,建議不要對(duì)用戶 BANK(將要被審計(jì)的表的所有者)授予執(zhí)行權(quán)限;而應(yīng)該將權(quán)限授予一個(gè)安全的用戶(比如 SECMAN),此用戶應(yīng)該執(zhí)行添加策略的過(guò)程。 在定義了策略以后,當(dāng)用戶以通常的方式對(duì)表進(jìn)行查詢時(shí),如下所示:
select * from bank.accounts;
審計(jì)線索記錄此操作。您可以使用以下語(yǔ)句查看線索:
select timestamp, db_user, os_user, object_schema, object_name, sql_text from dba_fga_audit_trail; TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT --------- ------- ------- ------- -------- ---------------------- 22-SEP-03 BANK ananda BANK ACCOUNTS select * from accounts
注意名為 DBA_FGA_AUDIT_TRAIL 的新視圖,它記錄細(xì)粒度的訪問(wèn)信息。其中顯示了審計(jì)事件的時(shí)間標(biāo)記、查詢者的數(shù)據(jù)庫(kù)用戶 ID、操作系統(tǒng)用戶 ID、查詢中所使用表的名稱和所有者,最后還有確切的查詢語(yǔ)句。在 Oracle9i Database 之前不可能得到這種信息,但隨著 FGA 的推出,獲得此信息變得輕而易舉。 在 Oracle9i Database 中,F(xiàn)GA 只能捕獲 SELECT 語(yǔ)句。利用 Oracle Database 10g,F(xiàn)GA 還可以處理 DML 語(yǔ)句 — INSERT、UPDATE 和 DELETE — 使其成為完整的審計(jì)特性。在本系列的第 3 部分,我將詳細(xì)說(shuō)明這些新的功能。 審計(jì)列和審計(jì)條件 讓我們更詳細(xì)地檢查前面的示例。我們要求審計(jì)對(duì)該表所使用的任何 SELECT 語(yǔ)句。但是在現(xiàn)實(shí)中,可能不必要這樣做,并且這樣可能會(huì)使存儲(chǔ)線索的審計(jì)表承受不起。當(dāng)用戶選擇含有敏感信息的余額列時(shí),銀行可能需要進(jìn)行審計(jì),但當(dāng)用戶選擇特定客戶的賬號(hào)時(shí),可能不需要進(jìn)行審計(jì)。列 BALANCE(選擇它可觸發(fā)審計(jì))稱為審計(jì)列,在此情況下,dbms_fga.add_policy 過(guò)程的參數(shù)指定該列如下:
audit_column => 'BALANCE'
如果每次用戶從表中選擇時(shí)都記錄審計(jì)線索,則線索的大小將增長(zhǎng),導(dǎo)致空間和管理問(wèn)題,因此您可能希望只有在滿足特定條件時(shí)進(jìn)行審計(jì),而不是每次都進(jìn)行審計(jì)。也許只有當(dāng)用戶訪問(wèn)極為富有的戶主賬號(hào)時(shí),銀行需要審計(jì) — 例如,只有當(dāng)用戶選擇了余額為 11,000 美元或更多的賬號(hào)時(shí)需要審計(jì)。這種類(lèi)型的條件稱為審計(jì)條件,并作為一項(xiàng)參數(shù)傳遞到 dbms_fga.add_policy 過(guò)程,如下所示:
audit_condition => 'BALANCE >= 11000'
讓我們來(lái)看這兩個(gè)參數(shù)如何起作用。現(xiàn)在策略定義的形式類(lèi)似于:
begin dbms_fga.add_policy ( object_schema=>'BANK', object_name=>'ACCOUNTS', policy_name=>'ACCOUNTS_ACCESS', audit_column => 'BALANCE', audit_condition => 'BALANCE >= 11000' ); end;
在此情況下,只有當(dāng)用戶選擇列 BALANCE 并且檢索的行包含大于或等于 $11,000 的余額時(shí),才會(huì)審計(jì)該操作。如果這兩個(gè)條件中有一個(gè)不為真,則該操作不會(huì)被寫(xiě)入到審計(jì)線索中。表 1 中的示例演示了何時(shí)審計(jì)操作和何時(shí)不審計(jì)操作的各種情況。 優(yōu)化器模式 FGA 需要基于開(kāi)銷(xiāo)的優(yōu)化 (CBO),以便正確地工作。在基于規(guī)則的優(yōu)化時(shí),只要用戶從表中進(jìn)行選擇,無(wú)論是否選擇了相關(guān)的列,都始終生成審計(jì)線索,增加了誤導(dǎo)項(xiàng)目出現(xiàn)的可能性。為使 FGA 正確地工作,除了在實(shí)例級(jí)啟用 CBO 之外,在 SQL 語(yǔ)句中應(yīng)該沒(méi)有規(guī)則暗示,并且必須至少使用評(píng)估選項(xiàng)對(duì)查詢中的所有表進(jìn)行分析。 管理 FGA 策略 在前文中您看到了如何添加 FGA 策略。要?jiǎng)h除策略,您可以使用以下語(yǔ)句:
begin dbms_fga.drop_policy ( object_schema => 'BANK', object_name => 'ACCOUNTS', policy_name => 'ACCOUNTS_ACCESS' ); end;
對(duì)于更改策略而言,沒(méi)有隨取隨用的解決方案。要更改策略中的任何參數(shù),必須刪除策略,再使用更改后的參數(shù)添加策略。 有時(shí)您可能需要臨時(shí)禁用審計(jì)收集 — 例如,如果您希望將線索表移動(dòng)到不同的表空間或者要?jiǎng)h除線索表。您可以按如下方法禁用 FGA 策略:
begin dbms_fga.enable_policy ( object_schema => 'BANK', object_name => 'ACCOUNTS', policy_name => 'ACCOUNTS_ACCESS', enable => FALSE ); end;
要重新啟用它,可使用同一函數(shù),但是將參數(shù) enable 設(shè)置為 TRUE。 處理器模塊 FGA 的功能不只是記錄審計(jì)線索中的事件;FGA 還可以任意執(zhí)行過(guò)程。過(guò)程可以執(zhí)行一項(xiàng)操作,比如當(dāng)用戶從表中選擇特定行時(shí)向?qū)徲?jì)者發(fā)送電子郵件警告,或者可以寫(xiě)到不同的審計(jì)線索中。這種存儲(chǔ)代碼段可以是獨(dú)立的過(guò)程或者是程序包中的過(guò)程,稱為策略的處理器模塊。實(shí)際上由于安全性原因,它不必與基表本身處于同一模式中,您可能希望特意將它放置在不同的模式中。由于只要 SELECT 出現(xiàn)時(shí)過(guò)程就會(huì)執(zhí)行,非常類(lèi)似于 DML 語(yǔ)句啟動(dòng)的觸發(fā)器,您還可以將其看作 SELECT 語(yǔ)句觸發(fā)器。以下參數(shù)指定將一個(gè)處理器模塊指定給策略: handler_schema 擁有數(shù)據(jù)過(guò)程的模式 處理器模塊還可以采用程序包的名稱來(lái)代替過(guò)程名稱。在這種情況下,參數(shù) handler_module 在 package.procedure 的格式中指定。 FGA 數(shù)據(jù)字典視圖 FGA 策略的定義位于數(shù)據(jù)字典視圖 DBA_AUDIT_POLICIES 中。表 2 包含該視圖中一些重要列的簡(jiǎn)短描述。 審計(jì)線索收集在 SYS 擁有的表 FGA_LOG$ 中。對(duì)于 SYS 擁有的任何原始表,此表上的某些視圖以對(duì)用戶友好的方式顯示信息。DBA_FGA_AUDIT_TRAIL 是該表上的一個(gè)視圖。表 3 包含該視圖中重要列的簡(jiǎn)短描述。 一個(gè)重要的列是 SQL_BIND,它指定查詢中使用的綁定變量的值 — 這是顯著增強(qiáng)該工具功能的一項(xiàng)信息。 另一個(gè)重要的列是 SCN,當(dāng)發(fā)生特定的查詢時(shí),它記錄系統(tǒng)更改號(hào)。此信息用于識(shí)別用戶在特定時(shí)間看到了什么,而不是現(xiàn)在的值,它使用了閃回查詢,這種查詢能夠顯示在指定的 SCN 值時(shí)的數(shù)據(jù)。我將在本系列的第 2 部分中詳細(xì)說(shuō)明這種功能強(qiáng)大的特性。 視圖和 FGA 到目前為止我已經(jīng)討論了在表上應(yīng)用 FGA;現(xiàn)在讓我們來(lái)看如何在視圖上使用 FGA。假定在 ACCOUNTS 表上定義視圖 VW_ACCOUNTS 如下:
create view vw_accounts as select * from accounts;
現(xiàn)在,如果用戶從視圖中而不是從表中進(jìn)行選擇:
select * from vw_accounts;
您將看到以下審計(jì)線索:
select object_name, sql_text from dba_fga_audit_trail; OBJECT_NAME SQL_TEXT ----------- ------------------------------------------------- ACCOUNTS select * from vw_accounts
注意,是基表名稱而不是視圖名稱出現(xiàn)在 OBJECT_NAME 列中,因?yàn)橐晥D中的選擇是從基表中進(jìn)行選擇。但是,SQL_TEXT 列記錄了用戶提交的實(shí)際語(yǔ)句,而這正是您希望了解的。
如果您只希望審計(jì)對(duì)視圖的查詢而不是對(duì)表的查詢,可以對(duì)視圖本身建立策略。通過(guò)將視圖名稱而不是表的名稱傳遞給打包的過(guò)程 dbms_fga.add_policy 中的參數(shù) object_name,可以完成這項(xiàng)工作。隨后 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列將顯示視圖的名稱,并且不會(huì)出現(xiàn)有關(guān)表訪問(wèn)的附加記錄。 其它用途 除了記錄對(duì)表的選擇訪問(wèn),F(xiàn)GA 還可用于某些其它情況:
結(jié)論 FGA 使您在 Oracle 數(shù)據(jù)庫(kù)中支持隱私和職能策略。因?yàn)閷徲?jì)發(fā)生在數(shù)據(jù)庫(kù)內(nèi)部而不是應(yīng)用程序中,所以無(wú)論用戶使用的訪問(wèn)方法是什么(通過(guò)諸如 SQL*Plus 等工具或者應(yīng)用程序),都對(duì)操作進(jìn)行審計(jì),允許進(jìn)行非常簡(jiǎn)單的設(shè)置。 下一次我將討論高級(jí) FGA 技術(shù)以及 Oracle Database 10g 中的新特性,這些特性使 FGA 的功能極為強(qiáng)大,適用于所有類(lèi)型的審計(jì)情況。 Arup Nanda (arup@proligence.com) 是 IntelliClaim 的首席數(shù)據(jù)庫(kù)設(shè)計(jì)人員,該公司位于 Connecticut 的 Norwalk,提供對(duì)衛(wèi)生保健保險(xiǎn)索賠管理高度安全和基于規(guī)則的優(yōu)化。他是 2003 年度 Oracle DBA 獎(jiǎng)的獲得者,并與他人合作編著了即將出版的 Oracle 隱私安全性審計(jì)(Rampant TechPress 出版,2003)。 表 1:演示何時(shí)審計(jì)操作以及何時(shí)不審計(jì)操作的各種情況
表 2:數(shù)據(jù)字典視圖 DBA_AUDIT_POLICIES 中重要的列
表 3:DBA_FGA_AUDIT_TRAIL 視圖中重要的列
|
|
|
來(lái)自: wxwwsnd > 《我的圖書(shū)館》