在oracle数据库日常的管理工作中,我们经常会遇到用户登录失败的情况。这些失败的登录尝试可能来自恶意攻击、误操作、用户修改了密码但应用配置没修改或者其他原因。为了快速定位问题,我们需要找到造成用户登录失败的主机名(或者IP)、应用程序等信息,以下是几种主要的方法:
方法一:通过审计表查询
如果数据库有开启审计功能,可以直接查询aud$表来获取最近一天由于密码错误导致登录失败的信息。以下是查询语句:
col USERHOST for a10
col userid for a10
col COMMENT$TEXT for a60;
col NTIMESTAMP# for a30;
col SPARE1 for a10;
set linesize 400;
select sessionid, userid, userhost, comment$text, spare1, ntimestamp#
from aud$
where returncode = 1017
and ntimestamp# > sysdate - 1;

如果数据库未打开审计功能,则使用下面介绍的另外2种方法。
方法二:使用1017事件捕获信息
通过设置event,生成trace 文件,可以查看该帐号是由哪个主机发起,捕获登录失败的信息,以下是设置步骤:
-
启用1017事件:
ALTER SYSTEM SET EVENTS '1017 trace name errorstack level 3'; -
查看alert日志:
打开alert日志,看到如下报错:
OS Pid: 9931 executed alter system set events '1017 trace name errorstack level 3' Thu Feb 06 23:56:33 2025 Errors in file /u01/app/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_23383.trc: ORA-01017: invalid username/password; logon denied Thu Feb 06 23:56:34 2025 Dumping diagnostic data in directory=[cdmp_20250206235634], requested by (instance=1, osid=23383), summary=[abnormal process termination]. Thu Feb 06 23:57:01 2025打开相关的trace文件,可以看到客户端的详细信息如:
client details: O/S info: user: oracle, term: unknown, ospid: 1234 machine: ora11g program: JDBC Thin Client application name: JDBC Thin Client, hash value=2546894660 -
关闭1017事件:
跟踪完毕,要及时关闭该trace,方法如下:
ALTER SYSTEM SET EVENTS '1017 trace name errorstack off';
方法三:使用触发器捕获登录失败的主机信息
为了捕获登录失败的主机信息,可以在数据库中创建一个触发器。以下是一个示例触发器:
CREATE OR REPLACE TRIGGER "LOGON_DENIED_TO_ALERT"
AFTER servererror ON DATABASE
DECLARE
message VARCHAR2(168);
ip VARCHAR2(15);
v_os_user VARCHAR2(80);
v_module VARCHAR2(50);
v_action VARCHAR2(50);
v_pid VARCHAR2(10);
v_sid NUMBER;
v_program VARCHAR2(48);
v_username VARCHAR2(32);
v_host VARCHAR2(32);
BEGIN
IF (ora_is_servererror(1017)) THEN
-- 获取远程连接的IP地址
IF upper(sys_context('userenv', 'network_protocol')) = 'TCP' THEN
ip := sys_context('userenv', 'ip_address');
v_host := sys_context('userenv', 'host');
END IF;
-- 获取会话ID
SELECT sid INTO v_sid FROM sys.v_$mystat WHERE rownum < 2;
-- 获取进程ID和程序信息
SELECT p.spid, v.program
INTO v_pid, v_program
FROM v$process p, v$session v
WHERE p.addr = v.paddr
AND v.sid = v_sid;
-- 获取操作系统用户
v_os_user := sys_context('userenv', 'os_user');
-- 获取数据库用户
v_username := sys_context('userenv','authenticated_identity');
-- 获取模块和动作信息
dbms_application_info.read_module(v_module, v_action);
-- 构建日志消息
message := to_char(SYSDATE, 'YYYYMMDD HH24MISS') ||
' ORA-01017 failed logon denied from ' || nvl(ip, 'localhost')||'(' ||v_host|| ') ' ||
v_pid || ' ' || v_os_user || ' with ' || v_program || ' - ' ||
v_module || ' ' || v_action||' dbuser:' || v_username;
-- 写入系统日志
sys.dbms_system.ksdwrt(2, message);
END IF;
END;
/
查看alert日志,出现如下报错内容:
Fri Feb 07 00:07:48 2025
20250207 000748 ORA-01017 failed logon denied from 10.10.10.160(ora11g) 25571 oracle with JDBC Thin Client - JDBC Thin Client dbuser:SZR
注意触发器的性能影响:触发器会在每次服务器错误时触发,可能对数据库性能产生影响。建议在捕获到所需信息后及时禁用或删除触发器。
-
禁用触发器:
ALTER TRIGGER LOGON_DENIED_TO_ALERT DISABLE; -
删除触发器:
DROP TRIGGER LOGON_DENIED_TO_ALERT;
总结
通过以上方法,我们可以快速定位失败用户登录的应用主机名和数据库用户信息。这些方法在实际工作中非常实用,可以帮助我们及时发现和解决潜在的安全问题。
最后修改时间:2025-02-11 10:50:58
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




