数据库审计方案(包括login,logout,DML,DDL等)

简介:
数据库审计方案(包括login,logout,DML,DDL等)
/*===============================================================================
||文件名:数据库审计事件记录脚本
||说明:为了对数据库事件进行审计,而进行相关设计
  ==============================================================================*/
/* ========================= 审计记录表 ========================= */
/* -------- 系统会话事件审计表 -------- */
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;语句,以补充完全
 





本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/312746 ,如需转载请自行联系原作者
相关文章
|
10月前
|
SQL 关系型数据库 数据库
【YashanDB知识库】OM仲裁节点故障后手工切换方案和yasom仲裁重新部署后重新纳管数据库集群方案
本文介绍了主备数据库集群的部署、OM仲裁故障切换及重新纳管的全过程。首先通过解压软件包并调整安装参数完成数据库集群部署,接着说明了在OM仲裁故障时的手动切换方案,包括关闭自动切换开关、登录备节点执行切换命令。最后详细描述了搭建新的yasom仲裁节点以重新纳管数据库集群的步骤,如生成配置文件、初始化进程、执行托管命令等,确保新旧系统无缝衔接,保障数据服务稳定性。
|
4月前
|
SQL 数据管理 BI
数据库操作三基石:DDL、DML、DQL 技术入门指南
本文围绕数据库操作核心语言 DDL、DML、DQL 展开入门讲解。DDL 作为 “结构建筑师”,通过CREATE(建库 / 表)、ALTER(修改表)、DROP(删除)等命令定义数据库结构;DML 作为 “数据管理员”,以INSERT(插入)、UPDATE(更新)、DELETE(删除)操作数据表记录,需搭配WHERE条件避免误操作;DQL 作为 “数据检索师”,通过SELECT结合WHERE、ORDER BY、LIMIT等子句实现数据查询与统计。三者相辅相成,是数据库操作的基础,使用时需注意 DDL 的不可撤销性、DML 的条件约束及 DQL 的效率优化,为数据库学习与实践奠定基础。
|
9月前
|
SQL 人工智能 数据可视化
16.1k star! 只需要DDL就能一键生成数据库关系图!开源神器ChartDB让你的数据结构"看得见"
ChartDB是一款开源的数据库可视化神器,通过一句智能查询就能自动生成专业的数据库关系图。无需安装客户端、不用暴露数据库密码,打开网页就能完成从数据建模到迁移的全流程操作,堪称开发者的"数据库透视镜"。
2107 67
|
消息中间件 canal 缓存
项目实战:一步步实现高效缓存与数据库的数据一致性方案
Hello,大家好!我是热爱分享技术的小米。今天探讨在个人项目中如何保证数据一致性,尤其是在缓存与数据库同步时面临的挑战。文中介绍了常见的CacheAside模式,以及结合消息队列和请求串行化的方法,确保数据一致性。通过不同方案的分析,希望能给大家带来启发。如果你对这些技术感兴趣,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!
680 6
项目实战:一步步实现高效缓存与数据库的数据一致性方案
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
7月前
|
SQL 存储 关系型数据库
一、数据库和表的基本操作 DDL
在使用 MySQL 做项目或写业务逻辑时,离不开对数据库和数据表的基本操作。我们这次从创建数据库讲起,一步步带你掌握如何新建表、查看表结构、修改字段、重命名、删除等常用命令。每一个知识点都有示例代码可直接上手,还准备了一套完整的动手练习,帮助你把概念变成熟练技能。如果你刚入门 SQL,或者想系统梳理一遍 DDL 基础,这篇会是不错的起点。
488 1
|
关系型数据库 MySQL 数据库
|
存储 机器学习/深度学习 自然语言处理
LangChain与向量数据库:高效的信息检索方案
【8月更文第4天】随着自然语言处理技术的发展,特别是深度学习的进步,我们能够更加高效地处理大量的文本数据。LangChain 作为一种强大的工具链,旨在简化和加速构建复杂的自然语言处理应用程序。结合向量数据库,LangChain 可以实现高效且精准的信息检索功能。本文将探讨这一组合的工作原理,并通过一个具体的实现案例来展示其在实际应用中的效果。
1298 2
|
10月前
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
10月前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。