首页 > Linux操作系统 > Linux操作系统 > 使用触发器跟踪会话登陆的尝试
概述:
用户想对登陆数据库的会话的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/ ,如需转载,请注明出处,否则将追究法律责任。