ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 使用触发器跟踪会话登陆的尝试

使用触发器跟踪会话登陆的尝试

原创 Linux操作系统 作者:lxjweb 时间:2009-07-20 13:38:43 0 删除 编辑

概述:

  用户想对登陆数据库的会话的IP进行跟踪,无论是有效ip还是无效IP,结果在测试中发现对于无效ip的机器过来的会话(如果具有DBA权限,都能登陆)。我们对不具有登陆权限的IP过来的dba会话,同样做了记录,但是不在报警日志中进行记录。

表XXZX_IP_INVITEDNODES

-- Create table
create table TEST.XXZX_IP_INVITEDNODES
(
  SERVERIP  VARCHAR2(15),
  USERIP    VARCHAR2(15),
  USERNAME  VARCHAR2(30),
  MACHINE   VARCHAR2(40),
  APP       VARCHAR2(60),
  APP_UNIT  VARCHAR2(60),
  PRINCIPLE VARCHAR2(15),
  TELEPHONE VARCHAR2(30),
  REMARK    VARCHAR2(100)
)

记录有效IP列表

表XXZX_IP_SESSION_HISTORY

create table TEST.XXZX_IP_SESSION_HISTORY
(
  SERVERIP    VARCHAR2(15),
  USERIP      VARCHAR2(15),
  USERNAME    VARCHAR2(30),
  LOG_TIME    DATE,
  MACHINE     VARCHAR2(40),
  RUN_PROGRAM VARCHAR2(60),
  VALID       NUMBER
)

记录所有尝试登陆会话的部分信息

 

--触发器过程:

CREATE OR REPLACE TRIGGER xxzx_ip_logon_history
  AFTER LOGON ON database
Declare
  ipinfo varchar2(15);
  iuser  varchar2(50);
  ipcnt  number :=0;
  idba   number :=0;
  iflag  number :=0;
  PRAGMA AUTONOMOUS_TRANSACTION;  --PL/SQL自治事务,否则第37行commit在9i的触发器中不能存在
BEGIN
  /*
   需求:无论是有效IP还是无效IP,都在历史表记录
        对于具有DBA权限的用户,除了记录历史表外还要屏蔽在报警日志里记录错误信息
   注意:如果用pl/developer工具测试,会出现同时在历史表记录2条的情况
   修改时间:2009年7月20号 by lxj
  */

  select sys_context('userenv', 'ip_address') into ipinfo from dual; --会话IP
  select user into iuser from dual;                                  --会话用户

  select COUNT(*) into idba from dba_role_privs dr                   --此会话是否具有DBA权限
    where dr.granted_role='DBA' and dr.grantee=iuser; --1
  select count(0) into ipcnt from test.xxzx_ip_invitednodes i where i.userip = ipinfo;--是否允许的IP
  
  if ipcnt = 0 Then                 --此用户IP是被禁止则记录历史表,非DBA用户则阻断
     if idba > 0  then
        iflag := -1;
     end if;
    
     --如果是被阻止的,无论哪类用户,均记录历史表
     insert into test.xxzx_ip_session_history
     select (select utl_inaddr.get_host_address from dual),
              SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
              username,SYSDATE,
              machine||'_禁止',program,iflag
     from v_$session
     where sid = (select sid from v$mystat where rownum < 2);
    
     commit; --9i中必须启动自治事务,否则此处commit不可用 

     --弹出提示框,此条件可以防止被阻拦的DBA权限在报警日志写错误
     if iflag <> -1 then
       RAISE_APPLICATION_ERROR(-20099,
           '登陆无效,请确认您的IP或者请以DBA登陆',FALSE);
     end if;     
            
  else --此用户IP合法,同样记录历史表
     iflag := 1;
     insert into test.xxzx_ip_session_history
     select (select utl_inaddr.get_host_address from dual),
               SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
               username,SYSDATE,
               machine||'_允许',
               program,iflag
     from v_$session
     where sid = (select sid from v$mystat where rownum < 2);
     commit;  --新加,9i中必须启动自治事务,否则此处commit不可用
  end if;

END;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/388619/viewspace-609696/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-06-08

  • 博文量
    14
  • 访问量
    51473