ORACLE 11g 实现伪审计用户<登陆退出>的详细记录

需求就是需要记录用户登陆登出的记录,包括时间以及连接ip地址以及连接方式等等,这样有助于跟踪分析问题,特别是一些人为无意识的dml操作导致数据丢失、数据混乱的问题追踪,还是非常有效的。
大家知道Oracle库开启了审计audit后,肯定有办法查到问题,但是审计比较消耗资源,所以可以通过触发器之类的来间接实现这个功能。

1、建记录表

-- Create table
create table UC_LOGON_OFF
(
  user_id         VARCHAR2(30),
  session_id      NUMBER(8),
  host            VARCHAR2(30),
  last_program    VARCHAR2(48),
  last_action     VARCHAR2(32),
  last_module     VARCHAR2(32),
  logon_day       DATE,
  logon_time      VARCHAR2(10),
  logoff_day      DATE,
  logoff_time     VARCHAR2(10),
  elapsed_minutes NUMBER(8),
  sid             NUMBER(8),
  serial          NUMBER(8)
)
tablespace USERS
  pctfree   10       //--Pctfree:块中保留用于UPDATE操作的空间百分比,当数据占用的空间达到此上限时,新的数据将不能插入此块中
  initrans  1        //1--并行事务控制,1个代表最多一个并行事务
  maxtrans  255;    //--maxtrains定义了数据块中数据槽的最大值。事务表会根据需要动态扩展,最大达到MAXTRANS 个条目(假设块上有足够的自由空间)。所分配的每个事务条目需要占用块首部中的23~24 字节的存储空间。

2、建立登陆触发器

CREATE OR REPLACE TRIGGER trig_logon_audit
  AFTER LOGON
   ON DATABASE
BEGIN
   INSERT INTO timdba.uc_logon_off
        select  USER,
                SYS_CONTEXT (‘USERENV‘, ‘SESSIONID‘),
                SYS_CONTEXT (‘USERENV‘, ‘HOST‘),
                NULL,
                NULL,
                NULL,
                SYSDATE,
                TO_CHAR (SYSDATE, ‘yyyy-mm-dd hh24:mi:ss‘),
                NULL,
                NULL,
                NULL,
                NULL, nullfrom dual;
END;  

3,建立登出的触发器
登出这里也采用了insert语句,是考虑到因为用户如果用了update的话,在登陆记录里面做update操作,如果登陆用户恶意的话,它是可以修改记录的。它下次登陆后,直接修改上次登陆的记录的ip地址等等信息,这样就会给我们误导了,当然我们也可以根据归档日志来分析,但是会比较麻烦一些,那么同理这张记录表uc_logon_off表就失去记录的功效了,因为每次我们都会怀疑这里的记录是否被认为修过过了,而不是真实的原始记录。
那现在改成了insert,再加上后面禁止delete、update操作,那么就确保uc_logon_off表的数据的真实性,虽然有可能被人恶意insert新记录的可能,但是每次它连接后最后一条记录都是真实的,这样我们就只根据uc_logon_off表进行分析就可以得出用户的操作行为记录。

CREATE OR REPLACE TRIGGER trig_logoff_audit
 BEFORE LOGOFF
   ON DATABASE
DECLARE
    v_date date;
BEGIN
    SELECt t.logon_day INTO v_date from (select logon_day FROM timdba.uc_logon_off where session_id= SYS_CONTEXT (‘USERENV‘, ‘SESSIONID‘) AND logon_day IS NOT NULL order by logon_day asc) t where rownum<2;
    INSERT INTO timdba.uc_logon_off
        select  USER,
                SYS_CONTEXT (‘userenv‘, ‘SESSIONID‘),
                SYS_CONTEXT (‘userenv‘, ‘host‘),
               (SELECT action FROM v$session WHERE SYS_CONTEXT (‘USERENV‘, ‘SESSIONID‘) = audsid),
               (SELECT program FROM v$session WHERE SYS_CONTEXT (‘USERENV‘, ‘SESSIONID‘) = audsid),
               (SELECT module  FROM v$session WHERE SYS_CONTEXT (‘USERENV‘, ‘SESSIONID‘) = audsid),
                v_date,
                TO_CHAR(v_date, ‘hh24:mi:ss‘),
                sysdate,
                TO_CHAR(sysdate, ‘hh24:mi:ss‘),
                TRUNC(TO_NUMBER(sysdate - v_date) * 1440,2),
                ROUND(TO_NUMBER(sysdate - v_date) * 24 * 60*60 ),
                NULL,
                SYS_CONTEXT (‘userenv‘, ‘ip_address‘) from dual;  

                commit;
   COMMIT;
END;

4,禁止删改登陆登出操作记录

create or replace trigger timdba.trig_uc_logonoff
  before update or delete on timdba.uc_logon_off
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  IF deleting THEN
    RAISE_APPLICATION_ERROR(-20001, ‘can not delete ‘);
  ELSIF updating then
    RAISE_APPLICATION_ERROR(-20001, ‘can not update ‘);
  END IF;
END;  

5,给所有的用户授权记录操作
因为触发器里面需要查询v$sql以及v$session,还要对timdba.uc_logon_off表进行操作,所以需要赋予这些操作权限,那么如果要记录所有用户的,就需要把所有用户都赋予这样的操作权限。

--(1)统计需要授权的语句
grant create session,connect to dw;
grant select on v_$sql to dw;
grant select on v_$session to dw;
grant select,insert on timdba.uc_logon_off to dw;  

--(2)创建临时表,记录所有用户
create table timdba.Z_USERS as select distinct owner from all_objects;  

--(3)生成授权的sql语句
select ‘grant create session,connect to ‘ || owner ||‘; ‘ from timdba.Z_USERS t where t.owner not in(‘TIMDBA‘,‘SYS‘,‘SYSTEM‘)
union all
select  ‘grant select on v_$sql to  ‘ || owner ||‘; ‘ from timdba.Z_USERS t where t.owner not in(‘TIMDBA‘,‘SYS‘,‘SYSTEM‘)
union all
select ‘grant select on v_$session to  ‘ || owner ||‘; ‘   from timdba.Z_USERS t where t.owner not in(‘TIMDBA‘,‘SYS‘,‘SYSTEM‘)
union all
select ‘grant select,insert on timdba.uc_logon_off to ‘ || owner ||‘; ‘ from timdba.Z_USERS t where t.owner not in(‘TIMDBA‘,‘SYS‘,‘SYSTEM‘);  

--(4)将sql结果记录copy到一个文件grant_logonoff.sql,放到/home/oracle目录,然后sqlplus登陆执行sql文件授权。
SQL> @/home/oracle/grant_logonoff.sql;
Grant succeeded.
Grant succeeded.
Grant succeeded.
……s     

6,查看部分记录
查询sql:

select  t.elapsed_minutes,t.elapsed_seconds,t.ip,t.*
from  uc_logon_off twhere t.user_id in(‘DW‘,‘LOGMINER‘,‘YS‘,‘TIMDBA‘,‘PLCRM‘)      and t.elapsed_minutes is not null order by t.logon_day desc,t.session_id desc;
时间: 2024-12-17 03:01:57

ORACLE 11g 实现伪审计用户<登陆退出>的详细记录的相关文章

Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错GConf error

Linux 的 GConf error 解决办法 问题: Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错,导致重新进入Centos系统后出现: GConf error:Failed to contact configuration server;some possible cause are that you need to enable TCP/IP networking for ORBIT or you have stale NFSlocks due to a sys

Oracle 11g、12c大量错误登陆尝试带来的数据库异常

APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.5 and later Information in this document applies to any platform. CAUSE A hang is possible in earlier versions of RDBMS as a result of an unpublished bug fixed in the following version

【Oracle RAC】Linux系统Oracle12c RAC安装配置详细记录过程V2.0(图文并茂)

[Oracle RAC]Linux系统Oracle12c RAC安装配置详细过程V2.0(图文并茂) 2 Oracle12c RAC数据库安装准备工作2.1 安装环境介绍2.2 数据库安装软件下载3 Oracle12c RAC数据库安装环境配置3.1 安装主机或虚拟机3.2 安装操作系统3.3 hosts文件配置3.4 添加组与用户3.5 添加文件系统3.6 修改操作系统参数3.7 禁止NTP3.8 配置grid和oracle用户的环境变量3.9 配置SSH信任关系3.10 调整页面交换空间3.

(总结)Oracle 11g常用管理命令(用户、表空间、权限)

1.启动oracle数据库: 从root切换到oracle用户进入:su - oracle 进入sqlplus环境,nolog参数表示不登录:sqlplus /nolog 以管理员模式登录:sqlplus / as sysdba 启动数据库startup;停止数据库shutdown immediate远程连接数据库sqlplus /nologconn sys/[email protected]:1521/orainstance as sysdba也可以直接运行:dbstart#启动数据库的脚本d

ORACLE 11g 用Duplicate恢复Data Guard 备库详细过程

1.先查找备库控制文件路径 先在备库上找出控制文件的路径,通过和主库一样,不过为了以防万一,还是check为好. SQL>  select name from v$controlfile; NAME -------------------------------------------------------------------------------- /Oracle/app/oracle/oradata/powerdes/control01.ctl /oracle/app/oracle/

oracle 11g登录em,“出现内部错误,有关详细信息,请查看日志文件。”

今天,登录oracle数据库em的时候,出现了这样的画面. 我找了很多资料也没找到解决办法.在经过一番研究之后发现,可能是我昨天更改了我计算机的名称,导致了我的em不能登录. 解决办法:恢复以前的计算机名即可. 步骤:1.打开控制面板->系统和安全->系统 2.找到计算机名.域和工作组设置,点击更改设置 3.在弹出窗口(计算机名)下,点击更改: 4.更改计算机名: 5.按确定保存之后,重启. 6.重新登录em即可. 当然此类方法可能只试用更改过计算机名称

深入剖析哪些服务是Oracle 11g必须开启的

这篇文章主要介绍了哪些服务是Oracle 11g必须开启的以及这些服务的详细介绍,需要的朋友可以参考下 成功安装Oracle 11g数据库后,你会发现自己电脑运行速度会变慢,配置较低的电脑甚至出现非常卡的状况,通过禁止非必须开启的Oracle服务可以提升电脑的运行速度.那么,具体该怎么做呢? 按照win7 64位环境下Oracle 11g R2安装详解中的方法成功安装Oracle 11g后,共有7个服务,分别为Oracle ORCL VSS Writer Service,OracleDBCons

oracle 11gR2启用对sys用户操作行为的审计

在oracle 11gR2中,缺省在audit_file_dest目录会记录sys用户的登录审计信息,但并不会审计操作内容. 启用对sys用户操作行为的审计 SQL> alter system set audit_sys_operations=TRUE scope=spfile; System altered. 因为是audit_sys_operations是静态参数,需要重新数据库 SQL> shutdown immediate; Database closed. Database dism

oracle 11g 设置用户密码大小写敏感

11g通过一个参数设置密码大小写敏感,下面来做个试验: C:\Documents and Settings\guogang>sqlplus gg_test/[email protected]_gg SQL*Plus: Release 10.2.0.1.0 - Production on 星期一 8月 4 17:54:19 2014 Copyright (c) 1982, 2005, Oracle.  All rights reserved. 连接到: Oracle Database 11g En