暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

Oracle开启DDL审计

原创 企系山顶上噶雪梨 2022-07-17
1954

前言:
在一次的巡检过程中,突然发现user_objects对象表中发现很多陌生的类,询问开发说,应用中好像没有创建;一度以为可能是被攻击,最后排查出,确实是应用创建的;为了避免这种情况,不那么费力去排查,开启DDL审计功能

  1. 创建表空间
    说明:为了便于空间的管理,新建表空间存放审计日志的表
create tablespace STAT_LOG datafile '/mnt/vde1/oradata/stat_log_01.dbf' SIZE 512M AUTOEXTEND ON NEXT 512M MAXSIZE 32767M ;
  1. 创建存放审计日志的表
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 '对象名称';
  1. 创建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;
  1. 验证,新增一个表,再进行删除,查看相关记录
create table test (i int); drop table test;
select * from sys.AUDIT_DDL_OBJ ;

模拟结果.png
我们看到,创建表,删除表的都已详细记录,且删除的过程:将表重命名后放回收站(┗( ´・∧・`)┛)也看到了;
嗯!还附带了2行生产数据。【涉及生产数据,将用户名和和主机相关信息脱敏了,请见谅】

最后修改时间:2022-07-18 09:07:52
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论