分享Oracle審計安全的4大觸發器,值得收藏

2019-12-08     波波說運維

概述

今天主要介紹一下關於Oracle安全的核心4大觸發器,主要是做審計用,僅供參考。


1、會話登陸事件審計觸發器(資料庫級別)

CREATE OR REPLACE TRIGGER 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 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;



2、會話登離事件審計觸發器(資料庫級別)

CREATE OR REPLACE TRIGGER 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 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;



3、DDL事件審計觸發器(資料庫級別)

CREATE OR REPLACE TRIGGER 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 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;



4、核心表刪除事件審計觸發器(表級別)

CREATE OR REPLACE TRIGGER delete_log_trigger
AFTER DELETE ON rfuser.io_log_detail
/*
||名稱:核心表刪除事件審計觸發器
||說明:
*/
FOR EACH ROW
BEGIN
INSERT INTO record_log
SELECT :old.ERR_DESC,
USER,
SYSDATE,
sys_context('userenv', 'ip_address'),
q.sql_text,
:OLD.START_TIME
FROM v$sql q, v$session s
WHERE s.audsid = (SELECT userenv('SESSIONID') FROM dual)
AND s.sql_id = q.sql_id;
END delete_log_trigger;



覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~


文章來源: https://twgreatdaily.com/zh-cn/Rlvi5m4BMH2_cNUgq610.html