暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

揪出内鬼,快速定位用户登录失败的相关信息

原创 szrsu 2025-02-07
1117

在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;

image.png

如果数据库未打开审计功能,则使用下面介绍的另外2种方法。

方法二:使用1017事件捕获信息

通过设置event,生成trace 文件,可以查看该帐号是由哪个主机发起,捕获登录失败的信息,以下是设置步骤:

  1. 启用1017事件

    ALTER SYSTEM SET EVENTS '1017 trace name errorstack level 3';
  2. 查看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
    
    
  3. 关闭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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论