oracle:记录尝试错误登录信息、锁定用户的排查

在实际运维过程中,我们经常碰到一台数据库服务器被众多应用连接,因为各种原因,有时候更改用户密码后,经常出现应用配置文件中密码更改不全,导致用户被锁定,这个时候如果通过监听去排查,就比较不是那么容易。

实际上,oracle数据库是可以讲错误登录信息记录到表或者记录到alert日志的,一般通过使用SYS用户创建触发器来实现,例如记录到alert日志,直接上代码:

DECLAREV_ERR_MESSAGE   VARCHAR2(168);V_IP        VARCHAR2(15);V_OS_USER VARCHAR2(80);V_MODULE  VARCHAR2(50);V_ACTION  VARCHAR2(50);V_SPID     VARCHAR2(10);V_SID     NUMBER;V_PROGRAM VARCHAR2(48);
BEGINIF (ora_is_servererror(1017)) THEN-- get V_IP FOR remote connections :IF upper(sys_context('userenv', 'network_protocol')) = 'TCP' THENV_IP := sys_context('userenv', 'V_IP_address');END IF;SELECT sid INTO V_SID FROM sys.v_$mystat WHERE rownum < 2;SELECT p.spid, v.programINTO V_SPID, V_PROGRAMFROM v$process p, v$session vWHERE p.addr = v.paddrAND v.sid = V_SID;V_OS_USER := sys_context('userenv', 'os_user');dbms_application_info.read_module(V_MODULE, V_ACTION);V_ERR_MESSAGE := to_char(SYSDATE, 'YYYYMMDD HH24MISS') ||' logon denied from ' || nvl(V_IP, 'localhost') || ' ' ||V_SPID || ' ' || V_OS_USER || ' with ' || V_PROGRAM || ' – ' ||V_MODULE || ' ' || V_ACTION;sys.dbms_system.ksdwrt(2, V_ERR_MESSAGE);END IF;
END;
/

你也可以在V_ERR_MESSAGE变量中定义一个自定义的ORA代码,这样可以直接进监控系统;

例如记录到表,直接上代码:

--创建记录表drop table tb_login_fail purge;create table tb_login_fail(c_IP VARCHAR2(15),c_user VARCHAR2(100),c_OS_USER VARCHAR2(100),c_MODULE VARCHAR2(100),c_ACTION VARCHAR2(100),c_SPID VARCHAR2(10),c_SID NUMBER,c_PROGRAM VARCHAR2(100),created_date date);--创建触发器:
CREATE OR REPLACE TRIGGER logon_denied_to_tableAFTER servererror ON DATABASE
DECLAREV_IP        VARCHAR2(15);V_OS_USER VARCHAR2(80);V_MODULE  VARCHAR2(50);V_ACTION  VARCHAR2(50);V_SPID     VARCHAR2(10);v_user  VARCHAR2(100);V_SID     NUMBER;V_PROGRAM VARCHAR2(48);
BEGINIF (ora_is_servererror(1017)) THEN-- get V_IP FOR remote connections :IF upper(sys_context('userenv', 'network_protocol')) = 'TCP' THENV_IP := sys_context('userenv', 'V_IP_address');END IF;--  v_user :=SYS_CONTEXT('USERENV','SESSION_USER');SELECT sid INTO V_SID FROM sys.v_$mystat WHERE rownum < 2;SELECT p.spid, v.program,v.usernameINTO V_SPID, V_PROGRAM,v_userFROM v$process p, v$session vWHERE p.addr = v.paddrAND v.sid = V_SID;V_OS_USER := sys_context('userenv', 'os_user');dbms_application_info.read_module(V_MODULE, V_ACTION);
insert into tb_login_fail values(V_IP,v_user,V_OS_USER,V_MODULE,V_ACTION,V_SPID,V_SID,V_PROGRAM,sysdate);
commit;END IF;
END;
/--将表授权给某个普通用户,自己可以写的 :)

这样,我们就可以在alert日志或者表里面查询到什么时候,哪个客户端使用的错误的用户或者密码尝试登路了。是不是比通过监听日志排查简单很多。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部