資料庫審計方案(包括login,logout,DML,DDL等)

bq_wang發表於2008-11-19
/*===============================================================================
 ||檔名:資料庫審計事件記錄指令碼
 ||說明:為了對資料庫事件進行審計,而進行相關設計
  ==============================================================================*/

/* ========================= 審計記錄表 ========================= */

/* -------- 系統會話事件審計表 -------- */
CREATE TABLE SYSTEM.Audit_Login_DB(
/*
 ||名稱:審計資料庫會話登陸事件記錄表
 ||說明:
*/
  Session_Id   NUMBER,          /* 會話ID */
  OS_User      VARCHAR2(200),   /* 終端OS使用者 */
  IP_Address   VARCHAR2(200),   /* 終端IP地址 */
  Terminal     VARCHAR2(200),   /* 終端 */
  Host         VARCHAR2(200),   /* 終端主機名 */
  User_Name    VARCHAR2(30),    /* ORACLE 使用者名稱*/
  LogOn_Date   DATE,            /* 登陸時間 */
  LogOff_Date  DATE,            /* 登離時間 */
  Elapsed_Minutes   NUMBER      /* 線上時間 */
 )
TABLESPACE TOOLS;

/* -------- 會話事件審計表索引 --------- */
CREATE INDEX IX_AUDIT_LOGIN_SESSIONID ON SYSTEM.AUDIT_LOGIN_DB(SESSION_ID)
TABLESPACE INDX;
 
CREATE INDEX IX_AUDIT_LOGIN_LOGONDATE ON SYSTEM.AUDIT_LOGIN_DB(LOGON_DATE)
TABLESPACE INDX;


/* -------- DDL事件審計表 -------- */
CREATE TABLE system.Audit_DDL_OBJ(
/*
 ||名稱:審計針對資料庫物件的DDL記錄表
 ||說明:
*/
  Opr_Time     DATE,            /* 操作時間 */
  Session_Id   NUMBER,          /* 會話ID */
  OS_User      VARCHAR2(200),   /* 終端OS使用者 */
  IP_Address   VARCHAR2(200),   /* 終端IP地址 */
  Terminal     VARCHAR2(200),   /* 終端 */
  Host         VARCHAR2(200),   /* 終端主機名 */
  User_Name    VARCHAR2(30),    /* ORACLE 使用者名稱*/
  DDL_Type     VARCHAR2(30),    /* DDL操作型別 */
  DDL_Sql      VARCHAR2(2000),  /* DDL語句 */
  Object_Type  VARCHAR2(18),    /* 操作物件型別 */
  Owner        VARCHAR2(30),    /* 物件擁有者 */
  Object_Name  VARCHAR2(128)    /* 物件名稱 */
 )
;

/* -------- DDL事件審計表索引 --------- */
CREATE INDEX IX_AUDIT_DDL_SESSIONID ON SYSTEM.AUDIT_DDL_OBJ(SESSION_ID)
TABLESPACE INDX;

CREATE INDEX IX_AUDIT_DDL_OPRTIME ON SYSTEM.AUDIT_DDL_OBJ(OPR_TIME)
TABLESPACE INDX;


/* ========================= 審計觸發器 ========================= */

/* ------- AFTER LOGON ON DATABASE 觸發器 -------*/
CREATE OR REPLACE TRIGGER SYS.Login_Audit_Trigger
AFTER LOGON ON DATABASE
/*
 ||名稱:會話登陸事件審計觸發器
 ||說明:
*/
DECLARE
  
   Session_Id_Var   NUMBER;          /* 會話ID */
   Os_User_Var      VARCHAR2(200);   /* 終端OS使用者 */
   IP_Address_Var   VARCHAR2(200);   /* 終端IP */
   Terminal_Var     VARCHAR2(200);   /* 終端 */
   Host_Var         VARCHAR2(200);   /* 終端主機名 */

BEGIN

   /* 獲取登陸使用者資訊 */
   SELECT   SYS_CONTEXT('USERENV','SESSIONID'),
            SYS_CONTEXT('USERENV','OS_USER'),
            SYS_CONTEXT('USERENV','IP_ADDRESS'),
            SYS_CONTEXT('USERENV','TERMINAL'),
            SYS_CONTEXT('USERENV','HOST')
   INTO     Session_Id_Var,
            Os_User_Var,
            IP_Address_Var,
            Terminal_Var,
            Host_Var
   FROM     DUAL;
  
   /* 記錄登陸審計資訊 */
   INSERT INTO system.Audit_Login_DB(
               Session_Id,      /* 會話ID */
               OS_User,         /* 終端OS使用者 */
               IP_Address,      /* 終端IP地址 */
               Terminal,        /* 終端 */
               Host,            /* 終端主機名 */
               User_Name,       /* ORACLE 使用者名稱*/
               LogOn_Date,      /* 登陸時間 */
               LogOff_Date,     /* 登離時間 */
               Elapsed_Minutes  /* 線上時間 */
              )
       VALUES( Session_Id_Var,
               Os_User_Var,
               IP_Address_Var,
               Terminal_Var,
               Host_Var,
               USER,
               SYSDATE,
               NULL,
               NULL);
 
   COMMIT;
EXCEPTION
   WHEN OTHERS THEN
      NULL;
END Login_Audit_Trigger;
/


/* ------- BEFORE LOGOFF ON DATABASE 觸發器 -------*/
CREATE OR REPLACE TRIGGER SYS.LogOff_Audit_Trigger
BEFORE LOGOFF ON DATABASE
/*
 ||名稱:會話登離事件審計觸發器
 ||說明:
*/
DECLARE
  
   Session_Id_Var   NUMBER;          /* 會話ID */
  
BEGIN
  
   /* 獲取登陸使用者資訊 */
   SELECT   SYS_CONTEXT('USERENV','SESSIONID')
   INTO     Session_Id_Var
   FROM     DUAL;
     
   /* 更新會話審計記錄資訊 */
   UPDATE system.Audit_Login_DB
      SET LogOff_Date = SYSDATE,
          Elapsed_Minutes = ROUND((SYSDATE - LogOn_Date)* 1440)
   WHERE  Session_Id = Session_Id_Var;
   --WHERE  SYS_CONTEXT('USERENV','SESSIONID') = Session_Id;
 
   COMMIT;
  
EXCEPTION
   WHEN OTHERS THEN
      NULL;
 
END LogOff_Audit_Trigger;
/


/* ------- AFTER DDL ON DATABASE 觸發器 -------*/
CREATE OR REPLACE TRIGGER SYS.DDL_Audit_Trigger
AFTER DDL ON DATABASE
/*
 ||名稱:DDL事件審計觸發器
 ||說明:
*/
DECLARE
  
   Session_Id_Var   NUMBER;          /* 會話ID */
   Os_User_Var      VARCHAR2(200);   /* 終端OS使用者 */
   IP_Address_Var   VARCHAR2(200);   /* 終端IP */
   Terminal_Var     VARCHAR2(200);   /* 終端 */
   Host_Var         VARCHAR2(200);   /* 終端主機名 */
   Cut              NUMBER;          /* SQL列表長度 */
   Sql_Text         ORA_NAME_LIST_T; /* SQL_TEXT 列表 */
   L_Trace          NUMBER;          /* 迴圈執行條件 */
   DDL_Sql_Var      VARCHAR2(2000);  /* DDL語句 */

BEGIN

   /* 獲取操作使用者資訊 */
   SELECT   SYS_CONTEXT('USERENV','SESSIONID'),
            SYS_CONTEXT('USERENV','OS_USER'),
            SYS_CONTEXT('USERENV','IP_ADDRESS'),
            SYS_CONTEXT('USERENV','TERMINAL'),
            SYS_CONTEXT('USERENV','HOST')
   INTO     Session_Id_Var,
            Os_User_Var,
            IP_Address_Var,
            Terminal_Var,
            Host_Var
   FROM     DUAL;
  
   /* 獲取DDL SQL語句 */
   BEGIN
    
      SELECT COUNT(*) INTO L_Trace FROM DUAL
       WHERE ORA_DICT_OBJ_NAME NOT LIKE 'MLOG%'
         AND ORA_DICT_OBJ_NAME NOT LIKE '%LOG'
         AND UTL_INADDR.GET_HOST_ADDRESS IS NOT NULL
         AND SYS_CONTEXT('USERENV','IP_ADDRESS') IS NOT NULL
         AND SYS_CONTEXT('USERENV','IP_ADDRESS') <> UTL_INADDR.GET_HOST_ADDRESS;

      IF L_Trace > 0 THEN

         Cut := ORA_SQL_TXT(Sql_Text);

         FOR i IN 1..Cut LOOP
            DDL_Sql_Var := SUBSTR(DDL_Sql_Var || Sql_Text(i),1,2000);
         END LOOP;
      END IF;
     
   EXCEPTION
      WHEN OTHERS THEN
         NULL;
   END;
  
   /* 記錄登陸審計資訊 */
   INSERT INTO system.Audit_DDL_OBJ(
               Opr_Time,     /* 操作時間 */
               Session_Id,   /* 會話ID */
               OS_User,      /* 終端OS使用者 */
               IP_Address,   /* 終端IP地址 */
               Terminal,     /* 終端 */
               Host,         /* 終端主機名 */
               User_Name,    /* ORACLE 使用者名稱*/
               DDL_Type,     /* DDL操作型別 */
               DDL_Sql,      /* DDL語句 */
               Object_Type,  /* 操作物件型別 */
               Owner,        /* 物件擁有者 */
               Object_Name   /* 物件名稱 */
              )
       VALUES( SYSDATE,
               Session_Id_Var,
               Os_User_Var,
               IP_Address_Var,
               Terminal_Var,
               Host_Var,
               ORA_LOGIN_USER,
               ORA_SYSEVENT,
               DDL_Sql_Var,
               ORA_DICT_OBJ_TYPE,
               ORA_DICT_OBJ_OWNER,
               ORA_DICT_OBJ_NAME);
 
   COMMIT;
  
EXCEPTION
   WHEN OTHERS THEN
      NULL;
 
END DDL_Audit_Trigger;
/

/* ========================= 審計DML語句 ========================= */
/*
 ||名稱:利用DBMS_FGA包的細粒度審計功能實現對DML語句的審計
 ||說明:
*/

CREATE SEQUENCE SEQ_SELECT_NUMBER MINVALUE 1 MAXVALUE 100000 START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE SEQ_INSERT_NUMBER MINVALUE 1 MAXVALUE 100000 START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE SEQ_UPDATE_NUMBER MINVALUE 1 MAXVALUE 100000 START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE SEQ_DELETE_NUMBER MINVALUE 1 MAXVALUE 100000 START WITH 1 INCREMENT BY 1;
SELECT 'DBMS_FGA.ADD_POLICY(OBJECT_SCHEMA => '''||OWNER||''', OBJECT_NAME => '''||TABLE_NAME||''',STATEMENT_TYPES => ''SELECT'',POLICY_NAME => ''CHK_SELECT_'||SEQ_SELECT_NUMBER.NEXTVAL||'''); ' FROM ALL_TABLES WHERE WNER='INXITE'
UNION
SELECT 'DBMS_FGA.ADD_POLICY(OBJECT_SCHEMA => '''||OWNER||''', OBJECT_NAME => '''||TABLE_NAME||''',STATEMENT_TYPES => ''INSERT'',POLICY_NAME => ''CHK_INSERT_'||SEQ_INSERT_NUMBER.NEXTVAL||'''); ' FROM ALL_TABLES WHERE WNER='INXITE'
UNION
SELECT 'DBMS_FGA.ADD_POLICY(OBJECT_SCHEMA => '''||OWNER||''', OBJECT_NAME => '''||TABLE_NAME||''',STATEMENT_TYPES => ''UPDATE'',POLICY_NAME => ''CHK_UPDATE_'||SEQ_UPDATE_NUMBER.NEXTVAL||'''); ' FROM ALL_TABLES WHERE WNER='INXITE'
UNION
SELECT 'DBMS_FGA.ADD_POLICY(OBJECT_SCHEMA => '''||OWNER||''', OBJECT_NAME => '''||TABLE_NAME||''',STATEMENT_TYPES => ''DELETE'',POLICY_NAME => ''CHK_DELETE_'||SEQ_DELETE_NUMBER.NEXTVAL||'''); ' FROM ALL_TABLES WHERE WNER='INXITE'

--需要在以上生成的語句前加上BEGIN,END;語句,以補充完全

參考文件:
細粒度審計(FGA) http://www.itpub.net/viewthread.php?tid=239693&extra=page%3D2%26amp%3Bfilter%3Ddigest
Oracle Audit Vault
建立監控表的DML的觸發器--Oracle審計 http://203.208.33.101/search?q=cache:MueGFCXzT6wJ:blog.oracle.com.cn/index.php/181019/viewspace-30154+Oracle+AFTER+DML+ON+DATABASE&hl=zh-CN&ct=clnk&cd=3&gl=cn&lr=lang_zh-CN&st_usg=ALhdy28qAdXB_OiidITLXDsOWWwjr0WCLw
資料庫審計事件記錄指令碼 宇野,抱歉找不到原地址連結了

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-498098/,如需轉載,請註明出處,否則將追究法律責任。

相關文章