Oracle如何找到引起账号锁定的IP的一点思考与总结

数据库 Oracle
在ORACLE数据库中,如果没有修改过FAILED_LOGIN_ATTEMPTS的话,默认10次输入错误密码后就会锁住用户。

 [[404798]]

本文转载自微信公众号「DBA闲思杂想录」,作者潇湘隐者。转载本文请联系DBA闲思杂想录公众号。

在ORACLE数据库中,如果没有修改过FAILED_LOGIN_ATTEMPTS的话,默认10次输入错误密码后就会锁住用户。

SQL> SELECT *  
  2  FROM DBA_PROFILES 
  3  WHERE RESOURCE_NAME='FAILED_LOGIN_ATTEMPTS'
 
PROFILE                        RESOURCE_NAME                    RESOURCE LIMIT 
------------------------------ -------------------------------- -------- ---------------------------------------- 
DEFAULT                        FAILED_LOGIN_ATTEMPTS            PASSWORD 10 
MONITORING_PROFILE             FAILED_LOGIN_ATTEMPTS            PASSWORD UNLIMITED 
 
SQL> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

那么在数据库维护过程中,如果出现账号被锁定的情况,如何事后分析是那个IP或主机导致账号被锁定了呢?不同的情形有不同的分析方法,主要看是否开启了数据库审计功能

开启了数据库审计

如果开了审计功能的话,这个分析定位就非常简单容易。因为数据库的审计功能会记录这些信息到数据库当中。

检查是否开启审计,主要查看audit_sys_operations参数是否为TRUE。

SQL> show parameter audit 
 
NAME                                 TYPE        VALUE 
------------------------------------ ----------- ------------------------------ 
audit_file_dest                      string      /u01/app/oracle/admin/gsp/adum 
                                                 p 
audit_sys_operations                 boolean     TRUE 
audit_syslog_level                   string 
audit_trail                          string      DB_EXTENDED 
SQL>  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

如果开启了审计功能,通过下面SQL语句就能轻松找到引起账号锁定的主机(通过主机找到具体IP地址)

----RETURNCODE=1017表示登录失败返回ORA-01017: invalid username/password; logon denied错误的会话信息。

SELECT USERNAME 
      ,USERHOST 
      ,TIMESTAMP 
      ,RETURNCODE 
FROM dba_audit_session 
WHERE USERNAME='TEST' 
 AND RETURNCODE='1017'  
ORDER BY TIMESTAMP DESC
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

数据库审计关闭

如果数据库审计功能是关闭的情况下,那么能否定位、找到导致账号锁定的主机或IP地址呢?如果出现账号被锁的情况,可以先查一下dba_users视图,看看账号是在什么时间点被锁定的。注意(有些版本有Bug,会出现LOCK_DATE不准确的情况。)

SQL> ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'
 Session altered. 
SQL> SELECT username, account_status,lock_date, PROFILE  
  2  FROM dba_users WHERE username='TEST'
 
USERNAME                       ACCOUNT_STATUS                   LOCK_DATE           PROFILE 
------------------------------ -------------------------------- ------------------- ---------- 
TEST                           LOCKED(TIMED)                    2018-06-16 23:49:14 DEFAULT 
 
SQL>  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

网上有些文章信誓旦旦的宣称通过监听日志可以分析出哪些IP导致账号被锁定了,但是经过动手实验分析,发现通过监听日志文件根本无法定位引起账号锁定的IP地址,原因有两个:

1、 无法通过监听日志判断登录会话是否出现ORA-01017错误,因为登录成功与登录失败遭遇ORA-01017错误的会话的监听日志信息是一样。无法区别!

2、 即使账号锁定的时间能定位到秒,但是生产环境中,一秒内有大量的监听日志生成,根本无法定位是哪一个具体IP

3、 登录失败的监听日志可能不是连续的。而是在一段时间生成的。

不过如果事前你定义了数据库触发器,那么就可以轻松定位到具体IP, 网友提供了一个触发器,如下所示:

CREATE OR REPLACE TRIGGER sys.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); 
BEGIN 
  IF (ora_is_servererror(1017)) THEN 
    -- get ip FOR remote connections : 
    IF upper(sys_context('userenv''network_protocol')) = 'TCP' THEN 
      ip := sys_context('userenv''ip_address'); 
    END IF; 
    SELECT sid INTO v_sid FROM sys.v_$mystat WHERE rownum < 2; 
    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, 'YYYY-MM-DD HH24:MI:SS') || 
               ' Password Erro: logon denied from ' || nvl(ip, 'localhost') || ' ' || 
               v_pid || ' User:' || v_os_user || ' with ' || v_program || ' – ' || 
               v_module || ' ' || v_action||' dbuser:' || v_username; 
    sys.dbms_system.ksdwrt(2, message); 
  END IF; 
END

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

在客户端使用SQL*Plus测试,模拟输入错误的密码登录数据库

C:\Users>sqlplus test/1234@myvm 
 
SQL*Plus: Release 11.2.0.1.0 Production on 星期日 6月 17 00:35:21 2018 
 
Copyright (c) 1982, 2010, Oracle.  All rights reserved. 
 
ERROR: 
ORA-01017: invalid username/password; logon denied 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

此时,触发器捕获到这个错误,就会在告警日志中生成类似下面这样的错误日志信息:

Sun Jun 17 08:01:44 2018 
2018-06-17 08:01:44 Password Erro: logon denied from 192.168.125.193 26639 User:KongLB with sqlplus.exe ��� sqlplus.exe  dbuser:test 
  • 1.
  • 2.

当然,如果你也可以改写该触发器,将捕获的相关信息写入数据库相关表。目前,我是将登陆失败的信息写入告警日志,监控告警日志(alert_$ORACLE_SID.log)的作业则会将分析告警日志,定期将错误解析出来,发送给DBA!

 

责任编辑:武晓燕 来源: DBA闲思杂想录
相关推荐

2011-07-04 09:33:04

惠普转型李艾科

2012-03-27 08:49:19

Json

2009-09-14 20:17:05

并行LINQ

2011-12-23 09:16:19

2014-09-17 10:30:25

代码

2013-06-26 10:13:32

C语言结构体结构体偏移

2022-04-06 07:14:29

区块链网络生态系统

2021-05-17 11:47:41

多租户系统私有化

2011-07-18 16:33:20

sqlite

2021-06-10 16:18:39

Oracle账号信息

2012-05-07 10:40:57

阿里巴巴去IOE

2021-06-30 07:51:09

新项目领域建模

2018-03-21 14:23:39

vagrant测试环境

2009-08-18 13:06:17

C#枚举类型

2018-03-28 15:07:16

测试环境vagrant

2015-03-26 09:23:17

天玑科技融合架构

2024-04-28 14:54:09

机器人代码

2021-09-28 18:54:26

信息流大数据人工智能

2010-04-19 14:01:22

Oracle查看分区表

2017-12-29 21:49:36

信息安全网络攻击漏洞
点赞
收藏

51CTO技术栈公众号