前言:
在一次的巡检过程中,突然发现user_objects对象表中发现很多陌生的类,询问开发说,应用中好像没有创建;一度以为可能是被攻击,最后排查出,确实是应用创建的;为了避免这种情况,不那么费力去排查,开启DDL审计功能
- 创建表空间
说明:为了便于空间的管理,新建表空间存放审计日志的表
create tablespace STAT_LOG datafile
'/mnt/vde1/oradata/stat_log_01.dbf' SIZE 512M AUTOEXTEND ON NEXT 512M MAXSIZE 32767M ;
- 创建存放审计日志的表
create table AUDIT_DDL_OBJ
(
OPR_TIME DATE,
SESSION_ID NUMBER,
OS_USER VARCHAR2(200),
IP_ADDRESS VARCHAR2(200),
TERMINAL VARCHAR2(200),
HOST VARCHAR2(200),
USER_NAME VARCHAR2(30),
DDL_TYPE VARCHAR2(30),
DDL_SQL VARCHAR2(4000),
OBJECT_TYPE VARCHAR2(18),
OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(128)
)
tablespace STAT_LOG;
-- Add comments to the columns
comment on column AUDIT_DDL_OBJ.OPR_TIME is '操作时间';
comment on column AUDIT_DDL_OBJ.SESSION_ID is '会话ID';
comment on column AUDIT_DDL_OBJ.OS_USER is '终端OS用户';
comment on column AUDIT_DDL_OBJ.IP_ADDRESS is '终端IP地址';
comment on column AUDIT_DDL_OBJ.TERMINAL is '终端';
comment on column AUDIT_DDL_OBJ.HOST is '终端主机名';
comment on column AUDIT_DDL_OBJ.USER_NAME is 'ORACLE 用户名';
comment on column AUDIT_DDL_OBJ.DDL_TYPE is 'DDL操作类型';
comment on column AUDIT_DDL_OBJ.DDL_SQL is 'DDL语句 ';
comment on column AUDIT_DDL_OBJ.OBJECT_TYPE is '操作对象类型';
comment on column AUDIT_DDL_OBJ.OWNER is '对象拥有者';
comment on column AUDIT_DDL_OBJ.OBJECT_NAME is '对象名称';
- 创建DDL事件审计触发器
CREATE OR REPLACE TRIGGER DDL_Audit_Trigger
AFTER DDL ON DATABASE
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
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); /* 终端主机名 */
n NUMBER; /* SQL列表长度 */
Sql_Text ORA_NAME_LIST_T; /* SQL_TEXT 列表 */
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;
/* IP_Address_Var为空时,记录的是Oracle使用SYS用户的内部操作,
如AWR/ASH的更新、全局临时表的创建或情况等,不需要记录
*/
--IF IP_Address_Var IS NULL THEN
-- RETURN;
--END IF;
/* 获取DDL SQL语句 */
n := ORA_SQL_TXT(Sql_Text);
FOR i IN 1..n LOOP
DDL_Sql_Var := DDL_Sql_Var || Sql_Text(i);
END LOOP;
DDL_Sql_Var := SUBSTR(DDL_Sql_Var, 1, 4000);
/* 记录登陆审计信息 */
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;
- 验证,新增一个表,再进行删除,查看相关记录
create table test (i int);
drop table test;
select * from sys.AUDIT_DDL_OBJ ;

我们看到,创建表,删除表的都已详细记录,且删除的过程:将表重命名后放回收站(┗( ´・∧・`)┛)也看到了;
嗯!还附带了2行生产数据。【涉及生产数据,将用户名和和主机相关信息脱敏了,请见谅】
最后修改时间:2022-07-18 09:07:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




