oracle 審計

Oracle 審計功能(Oracle10g

 

·                     1、什麼是審計

審計(Audit)用於監視用戶所執行的數據庫操作,審計記錄可存在數據字典表(稱爲審計記錄:存儲在system表空間中的 SYS.AUD$中,可通過視圖dba_audit_trail查看)或操作系統審計記錄中(默認位置爲$ORACLE_BASE/admin/$ORACLE_SID/adump/).。默認情況下審計是沒有開啓的。

當數據庫的審計是使能的,在語句執行階段產生審計記錄。

審計記錄包含:

(1)有審計的操作、

(2)用戶執行的操作、

(3)操作的日期和時間等信息。

不管你是否打開數據庫的審計功能,以下這些操作系統會強制記錄:用管理員權限連接Instance;啓動數據庫;關閉數據庫。

Oracle審計功能

審計是對選定的用戶動作的監控和記錄,通常用於:

    審查可疑的活動。例如:數據被非授權用戶所刪除,此時安全管理員可決定對該數據庫的所有連接進行審計,以及對數據庫的所有表的成功地或不成功地刪除進行審計。

監視和收集關於指定數據庫活動的數據。例如:DBA可收集哪些被修改、執行了多少次邏輯的I/O等統計數據。

ORACLE所允許的審計選擇限於下列方面:

   審計語句的成功執行、不成功執行,或者其兩者。

   對每一用戶會話審計語句執行一次或者對語句每次執行審計一次。

   對全部用戶或指定用戶的活動的審計。

審計相關的表安裝、轉移

  SQLPLUS> connect / AS SYSDBA

  SQLPLUS> select * from sys.aud$;     --沒有記錄返回 

  SQLPLUS> select * from dba_audit_trail;   - 沒有記錄返回

 如果做上述查詢的時候發現表不存在,說明審計相關的表還沒有安裝,需要安裝。

 

  SQLPLUS> connect / as sysdba

  SQLPLUS> @$ORACLE_HOME/rdbms/admin/cataudit.sql

 審計表安裝在SYSTEM表空間。所以要確保SYSTEM表空間又足夠的空間存放審計信息。

安裝後要重啓數據庫

將審計相關的表移動到其他表空間

由於AUD$表等審計相關的表存放在SYSTEM表空間,因此爲了不影響系統的性能,保護SYSTEM表空間,最好把AUD$移動到其他的表空間上。可以使用下面的語句來進行移動:

 

sql>connect / as sysdba;

 

sql>alter table aud$ move tablespace <new tablespace>;

sql>alter index I_aud1 rebuild online tablespace <new tablespace>;

 

SQL> alter table audit$ move tablespace <new tablespace>;

SQL> alter index i_audit rebuild online tablespace <new tablespace>;

 

SQL> alter table audit_actions move tablespace <new tablespace>;

SQL> alter index i_audit_actions rebuild online tablespace <new tablespace>;

 

2、和審計相關的兩個主要參數

Audit_sys_operations

默認爲false,當設置爲true時,所有sys用戶(包括以sysdba, sysoper身份登錄的用戶)的操作都會被記錄,audit trail不會寫在aud$表中,這個很好理解,如果數據庫還未啓動aud$不可用,那麼像conn /as sysdba這樣的連接信息,只能記錄在其它地方。如果是windows平臺,audti trail會記錄在windows的事件管理中,如果是linux/unix平臺則會記錄在audit_file_dest參數指定的文件中。

Audit_trail

None:是默認值,不做審計;

DB:將audit trail 記錄在數據庫的審計相關表中,如aud$,審計的結果只有連接信息;

DB,Extended:這樣審計結果裏面除了連接信息還包含了當時執行的具體語句;

OS:將audit trail 記錄在操作系統文件中,文件名由audit_file_dest參數指定;

XML:10g裏新增的。

注:這兩個參數是static參數,需要重新啓動數據庫才能生效。

3、審計級別

當開啓審計功能後,可在三個級別對數據庫進行審計:Statement(語句)、Privilege(權限)、object(對象)。

3.1  Statement:

語句審計,對某種類型的SQL語句審計,不指定結構或對象。比如audit table 會審計數據庫中所有的create table,drop table,truncate table語句,alter session by cmy會審計cmy用戶所有的數據庫連接。

3.2  Privilege:

權限審計,當用戶使用了該權限則被審計,如執行grant select any table to a,當執行了audit select any table語句後,當用戶a 訪問了用戶b的表時(如select * from b.t)會用到select any table權限,故會被審計。注意用戶是自己表的所有者,所以用戶訪問自己的表不會被審計。 特權審計。

3.3  Object:

對象審計,對一特殊模式對象上的指定語句的審計. 如審計on關鍵字指定對象的相關操作,如aduit alter,delete,drop,insert on cmy.t by scott; 這裏會對cmy用戶的t表進行審計,但同時使用了by子句,所以只會對scott用戶發起的操作進行審計。

注意:Oracle沒有提供對schema中所有對象的審計功能,只能一個一個對象審計,對於後面創建的對象,Oracle則提供on default子句來實現自動審計,比如執行audit drop on default by access;後,對於隨後創建的對象的drop操作都會審計。但這個default會對之後創建的所有數據庫對象有效,似乎沒辦法指定只對某個用戶創建的對象有效,想比 trigger可以對schema的DDL進行“審計”,這個功能稍顯不足。

4、審計的一些其他選項

4.1 by access / by session:

by access  每一個被審計的操作都會生成一條audit trail。

by session 一個會話裏面同類型的操作只會生成一條audit trail,默認爲by session。

4.2 whenever [not] successful:

whenever successful 操作成功(dba_audit_trail中returncode字段爲0) 才審計,

whenever not successful 反之。省略該子句的話,不管操作成功與否都會審計。

5、和審計相關的視圖

5.1 dba_audit_trail:保存所有的audit trail,實際上它只是一個基於aud$的視圖。其它的視圖dba_audit_session,dba_audit_object, dba_audit_statement都只是dba_audit_trail的一個子集。

5.2 dba_stmt_audit_opts:可以用來查看statement審計級別的audit options,即數據庫設置過哪些statement級別的審計。dba_obj_audit_opts,dba_priv_audit_opts視圖功能與之類似

5.3 all_def_audit_opts:用來查看數據庫用on default子句設置了哪些默認對象審計。

6、取消審計

將對應審計語句的audit改爲noaudit即可,

如audit session whenever successful

對應的取消審計語句爲noaudit session whenever successful;

7、10g中的審計告知一切

Oracle 數據庫 10g 審計以一種非常詳細的級別捕獲用戶行爲,它可以消除手動的、基於觸發器的審計。

假定用戶 Joe 具有更新那張表的權限,並按如下所示的方式更新了表中的一行數據:

update SCOTT.EMP set salary = 12000 where empno = 123456;

您如何在數據庫中跟蹤這種行爲呢?在 Oracle 9i 數據庫及其較低版本中,審計只能捕獲“誰”執行此操作,而不能捕獲執行了“什麼”內容。例如,它讓您知道 Joe 更新了 SCOTT 所有的表EMP,但它不會顯示他更新了該表中員工號爲 123456 的薪水列。它不會顯示更改前的薪水列的值 — 要捕獲如此詳細的更改,您將不得不編寫您自己的觸發器來捕獲更改前的值,或使用 LogMiner 將它們從存檔日誌中檢索出來。

細粒度審計(FGA):精細審計 ,是在 Oracle 9i 中引入的,能夠記錄 SCN 號和行級的更改以重建舊的數據,但是它們只能用於 select 語句,而不能用於 DML ,如 update 、insert 和delete 語句。因此,對於 Oracle 數據庫 10g 之前的版本,使用觸發器雖然對於以行級跟蹤用戶初始的更改是沒有吸引力的選擇,但它也是唯一可靠的方法。

8.審計的相關基本操作

8.1  審計功能的參數控制

audit_trail 參數的值可以設置爲以下幾種

1. NONE:不開啓

2. DB:開啓審計功能

3. OS:審計記錄寫入一個操作系統文件。

4. TRUE:與參數DB一樣

5. FALSE:不開啓審計功能。

這個參數是寫道spfile裏面的,需要重啓數據庫

8.2  查看是否審計功能是否啓動

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

8.3 開啓審計

SQL> conn /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> 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.4  關閉審計

SQL> conn /as sysdba

SQL> show parameter audit

SQL> alter system set audit_trail=none;

關閉審計也需要重啓實例

9. 審計實例

9.1 激活審計

SQL> conn sys/admin as sysdba

已連接。

SQL> show parameter audit

NAME                           TYPE        VALUE

------------------------------------         ----------- ------------------------------

audit_file_dest                      string      D:\ORACLE\ADMIN\DBA\ADUMP

audit_sys_operations                 boolean     FALSE

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      D:\ORACLE\ADMIN\DBA\ADUMP

audit_sys_operations                 boolean     TRUE

audit_trail                          string      DB, EXTENDED

9.2 開始審計

注意:無法對 SYS 用戶操作執行 audit 或 noaudit 命令

SQL> conn  system/admin

SQL> audit all on test;

SQL> commit;

SQL> delete from test;

SQL> commit;

SQL> select OS_USERNAME,USERNAME,USERHOST,TERMINAL,TIMESTAMP,OWNER,

obj_name,ACTION_NAME,sessionid,os_process,sql_text from dba_audit_trail;

OS_USER USERNAME USERHOST   TERMINAL        TIMESTAMP      OWNER

-------   -------- --------------- --------------- -------------- ----------------

user    SYSTEM   WORKGROUP\HFCC- HFCC-KF-3068    22-10月-09     SYSTEM

SQL> audit select table by test by access;

如果在命令後面添加by user則只對user的操作進行審計,如果省去by用戶,則對系統中所有的用戶進行審計(不包含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 SYSTEM; --審計SYSTEM用戶對錶user.table的delete,update,insert操作

9.3 撤銷審計

SQL> noaudit all on t_test;

 

10.FGA策略(細粒度審計)

DBMS_FGA是SYS用戶的一個包

10.1 增加 FGA 策略

-- 審計表
GRANT RESOURCE,CONNECT TO BANK IDENTIFIED BY BANK;

CREATE TABLE BANK.ACCOUNTS
(
  ACCT_NO NUMBER PRIMARY KEY,
  CUST_ID NUMBER NOT NULL ,
  BALANCE NUMBER(15,2) NULL
);
insert into bank.accounts values(1,1,10000);
insert into bank.accounts values(2,2,20000);
commit;

Begin
dbms_fga.drop_policy (
  object_schema=>'BANK',
  object_name=>'ACCOUNTS',
  policy_name=>'ACCOUNTS_ACCESS');
dbms_fga.add_policy (
  object_schema=>'BANK',
  object_name=>'ACCOUNTS',
  policy_name=>'ACCOUNTS_ACCESS');
end;
/

select * from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text  from dba_fga_audit_trail;

-- 審計列和審計條件, 在add_policy中加入
--   audit_column => 'BALANCE'
--   audit_condition => 'BALANCE >= 11000'

Begin
dbms_fga.drop_policy (
  object_schema=>'BANK',
  object_name=>'ACCOUNTS',
  policy_name=>'ACCOUNTS_ACCESS');

dbms_fga.add_policy (
  object_schema=>'BANK',
  object_name=>'ACCOUNTS',
  audit_column => 'BALANCE',
  audit_condition => 'BALANCE >= 11000',
  policy_name=>'ACCOUNTS_ACCESS');
end;
/

select BALANCE from bank.accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text  from dba_fga_audit_trail;

10.2 管理 FGA 策略
--要刪除策略,您可以使用以下語句:
begin
dbms_fga.drop_policy (
object_schema => 'BANK',
object_name => 'ACCOUNTS',
policy_name => 'ACCOUNTS_ACCESS'
   );
end;
/

-- 對於更改策略而言,沒有隨取隨用的解決方案。要更改策略中的任何參數,必須刪除策略,再使用更改後的參數添加策略。

-- 需要臨時禁用審計收集 — 例如,如果您希望將線索表移動到不同的表空間或者要刪除線索表。您可以按如下方法禁用 FGA 策略:
begin
dbms_fga.enable_policy (
object_schema => 'BANK',
object_name => 'ACCOUNTS',
policy_name => 'ACCOUNTS_ACCESS',
enable => FALSE
   );
end;
/
-- 重新啓用很簡單 enable =>; TRUE

--演示何時審計操作以及何時不審計操作的各種情況 SQL 語句 審計狀態

select balance from bank.accounts;   進行審計。用戶選擇了在添加策略時所指定的審計列 BALANCE。
select * from  bank.accounts;      進行審計。即使用戶沒有明確指定列 BALANCE,* 也隱含地選擇了它。
select cust_id from bank.accounts where balance < 10000; 進行審計。即使用戶沒有明確指定列 BALANCE,where 子句也隱含地選擇了它。
select cust_id from bank.accounts;   不進行審計。用戶沒有選擇列 BALANCE。
select count(*) from bank.accounts;  不進行審計。用戶沒有明確或隱含地選擇列 BALANCE。

10.3  處理器模塊
-- FGA 的功能不只是記錄審計線索中的事件;FGA 還可以任意執行過程。
-- 過程可以執行一項操作,比如當用戶從表中選擇特定行時向審計者發送電子郵件警告,或者可以寫到不同的審計線索中。
-- 這種存儲代碼段可以是獨立的過程或者是程序包中的過程,稱爲策略的處理器模塊。
-- 實際上由於安全性原因,它不必與基表本身處於同一模式中,您可能希望特意將它放置在不同的模式中。
-- 由於只要 SELECT 出現時過程就會執行,非常類似於 DML 語句啓動的觸發器,您還可以將其看作 SELECT 語句觸發器。

-- 以下參數指定將一個處理器模塊指定給策略:
--  handler_schema 擁有數據過程的模式
--  handler_module 過程名稱
-- 處理器模塊還可以採用程序包的名稱來代替過程名稱。在這種情況下,參數 handler_module 在 package.procedure 的格式中指定。

10.4  FGA 數據字典視圖
-- FGA 策略的定義位於數據字典視圖 DBA_AUDIT_POLICIES 中。

-- 審計線索收集在 SYS 擁有的表 FGA_LOG$ 中。對於 SYS 擁有的任何原始表,此表上的某些視圖以對用戶友好的方式顯示信息。DBA_FGA_AUDIT_TRAIL 是該表上的一個視圖。
-- 一個重要的列是 SQL_BIND,它指定查詢中使用的綁定變量的值 — 這是顯著增強該工具功能的一項信息。
-- 另一個重要的列是 SCN,當發生特定的查詢時,它記錄系統更改號。
-- 此信息用於識別用戶在特定時間看到了什麼,而不是現在的值,它使用了閃回查詢,這種查詢能夠顯示在指定的 SCN 值時的數據。

10.5 視圖和 FGA
-- 到目前爲止已經討論了在表上應用 FGA;現在讓我們來看如何在視圖上使用 FGA。假定在 ACCOUNTS 表上定義視圖 VW_ACCOUNTS 如下:

create view bank.vw_accounts as select * from bank.accounts;

select * from bank.vw_accounts;
select timestamp, db_user,os_user,object_schema,object_name,sql_text  from dba_fga_audit_trail;

10.5.1 如果您只希望審計對視圖的查詢而不是對錶的查詢,可以對視圖本身建立策略。
-- 通過將視圖名稱而不是表的名稱傳遞給打包的過程 dbms_fga.add_policy 中的參數 object_name,可以完成這項工作。
-- 隨後 DBA_FGA_AUDIT_TRAIL 中的 OBJECT_NAME 列將顯示視圖的名稱,並且不會出現有關表訪問的附加記錄。

10.6 其它用途
 除了記錄對錶的選擇訪問,FGA 還可用於某些其它情況:
--  您可以對數據倉庫使用 FGA,以捕獲特定的表、視圖或物化視圖上發生的所有語句,這有助於計劃索引。您不需要到 V$SQL 視圖去獲取這些信息。即使 SQL 語句已經超出了 V$SQL 的期限,在 FGA 審計線索中將會始終提供它。
--  由於 FGA 捕獲綁定變量,它可以幫助您瞭解綁定變量值的模式,這有助於設計直方圖集合等。
--  處理器模塊可以向審計者或 DBA 發送警告,這有助於跟蹤惡意應用程序。
--  由於 FGA 可以作爲 SELECT 語句的觸發器,您可以在需要這種功能的任何時候使用它。

結論
 FGA 在 Oracle 數據庫中支持隱私和職能策略。因爲審計發生在數據庫內部而不是應用程序中,所以無論用戶使用的訪問方法是什麼(通過諸如 SQL*Plus 等工具或者應用程序),都對操作進行審計,允許進行非常簡單的設置。

 

數據字典視圖 DBA_AUDIT_POLICIES 中重要的列
-----------------------------------------------------------------------
OBJECT_SCHEMA   對其定義了 FGA 策略的表或視圖的所有者
OBJECT_NAME     表或視圖的名稱
POLICY_NAME     策略的名稱 — 例如,ACCOUNTS_ACCESS
POLICY_TEXT     在添加策略時指定的審計條件 — 例如,BALANCE >;= 11000
POLICY_COLUMN   審計列 — 例如,BALANCE
ENABLED         如果啓用則爲 YES,否則爲 NO 
PF_SCHEMA       擁有策略處理器模塊的模式(如果存在)
PF_PACKAGE      處理器模塊的程序包名稱(如果存在)
PF_FUNCTION     處理器模塊的過程名稱(如果存在)

 

數據字典視圖 DBA_FGA_AUDIT_TRAIL 中重要的列
-----------------------------------------------------------------------
SESSION_ID      審計會話標識符;與 V$SESSION 視圖中的會話標識符不同
TIMESTAMP       審計記錄生成時的時間標記
DB_USER         發出查詢的數據庫用戶
OS_USER         操作系統用戶
USERHOST        用戶連接的機器的主機名
CLIENT_ID       客戶標識符(如果由對打包過程 dbms_session.set_identifier 的調用所設置)
EXT_NAME        外部認證的客戶名稱,如 LDAP 用戶
OBJECT_SCHEMA   對該表的訪問觸發了審計的表所有者
OBJECT_NAME     對該表的 SELECT 操作觸發了審計的表名稱
POLICY_NAME     觸發審計的策略名稱(如果對錶定義了多個策略,則每個策略將插入一條記錄。在此情況下,該列顯示哪些行是由哪個策略插入的。)
SCN             記錄了審計的 Oracle 系統更改號
SQL_TEXT        由用戶提交的 SQL 語句 
SQL_BIND        由 SQL 語句使用的綁定變量(如果存在)

 

結論

1.       對錶的審計:可以單獨對錶的create,alter進行審計,如果要對drop操作進行審計需要對錶加audit table(該命令包含有create table、drop table、truncate table);

audit alter table (該命令包含了 alter table ).
2. 對視圖的審計:可以單獨對視圖的create進行審計,如果要對drop操作進行審計需要對視圖加audit view(該命令包含有create view,drop view).
3. 對程序包的審計:可以對包(函數,存儲過程等)的create進行審計,如果需要對drop操作進行審計需要加audit procedure(該命令對CREATE FUNCTION, CREATE LIBRARY , CREATE PACKAGE, CREATE PACKAGE BODY, CREATE PROCEDURE, DROP FUNCTION, DROP LIBRARY, DROP PACKAGE, DROP PROCEDURE進行審計)
4. 對用戶的審計:可以通過audit user(該命令包含 create user,alter user,drop user)進行審計.

5、使用如下語句,

audit insert table; 

audit update table; 

audit delete table;
audit  select table

可以對所有用戶(不包含sys用戶)下的表進行insert、update、delete、select 審計。

 

 

實例:

 

 1、select * from dba_audit_trail;

   其中有“returncode”列:0,代表語句執行正常;非0,代表語句執行異常;有待驗證

3、對於 drop table 語句的審覈只能是 audit table; 
如果僅僅是對 alter any table 系統權限進行審覈,當用戶使用 alter table 語句修改用戶所擁有的表時,是不會差生任何審覈記錄,因爲沒有用到 alter any table 系統權限。

4、AUDIT table BY ACCESS 對 drop table、alter table 和 create table 語句進行審覈。

5、 aud$表中的數據無法刪除,則以sys用戶進行刪除;

 

例1:

1、查看數據庫審計狀態:

 

2、開啓數據庫審計功能、重啓數據庫、查看數據庫審計狀態:

 

3、查看審計記錄表、視圖:

select * from sys.aud$; -- 審計記錄表,可以刪除表裏面的數據;

select * from dba_audit_trail t ; -- 審計視圖,數據來源於sys.aud$ 表;
select * from dba_stmt_audit_opts;  -- 視圖,查看數據庫開啓了那些審計功能;

4、數據庫審計相關的表默認在system表空間,把該表移動到其他自定義表空間:

sql>alter table aud$ move tablespace <new tablespace>;

sql>alter index I_aud1 rebuild online tablespace <new tablespace>;

 

SQL> alter table audit$ move tablespace <new tablespace>;

SQL> alter index i_audit rebuild online tablespace <new tablespace>;

 

SQL> alter table audit_actions move tablespace <new tablespace>;

SQL> alter index i_audit_actions rebuild online tablespace <new tablespace>;

5、 設置審計項目:

 (1)對錶的審計:可以單獨對錶的create,alter進行審計,如果要對drop操作進行審計需要對錶加audit table(該命令包含有create table、drop table、truncate table);

audit alter table (該命令包含了 alter table ).
(2)使用如下語句,

audit insert table; 

audit update table; 

audit delete table;
audit select table

可以對所有用戶(不包含sys用戶)下的表進行insert、update、delete、select 審計。

6、 取消審計項目:

把audit換成noaudit 即可,如:audit insert table;    audit update table;…..

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章