在ORACLE数据库中,如果没有修改过FAILED_LOGIN_ATTEMPTS的话,默认10次尝试失败后就会锁住用户。此时再登录数据库,就会遇到ORA-28000: the account is locked

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>

那么在数据库维护过程中,如果出现账号被锁定的情况,如何事后分析是那个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> 

如果开启了审计功能,通过下面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;

数据库审计关闭

 

 如果数据库审计功能是关闭的情况下,那么能否定位、找到导致账号锁定的主机或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> 

网上有些文章信誓旦旦的宣称通过监听日志可以分析出哪些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;

/

在客户端使用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

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

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

当然,如果你也可以改写该触发器,将捕获的相关信息写入数据库相关表。

ORACLE如何找到引起账号锁定的IP的一点思考与总结的更多相关文章

  1. Oracle 找到引起账户锁定的IP

    在ORACLE数据库中,如果没有修改过FAILED_LOGIN_ATTEMPTS的话,默认10次尝试失败后就会锁住用户.此时再登录数据库,就会遇到ORA-28000: the account is l ...

  2. Oracle 支持在具有 DHCP 分配的 IP 地址的系统上进行安装

    今天在安装Oracle 10g的时候,遇到了“ Oracle 支持在具有 DHCP 分配的 IP 地址的系统上进行安装” 这个问题,经过搜索,找到了解决方案,具体如下: win7下右键单机" ...

  3. oracle 帐号scott被锁定 如何解锁

    由于多次输入:账号 密码不对 oracle 帐号scott被锁定 如何解锁: 具体操作步骤如下:C:> sqlplus请输入用户名:sys输入口令:sys as sysdba //注意:在口令这 ...

  4. 通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile

      通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁 ...

  5. 安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined

    安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined 出现这种错误是因为主机名和/etc/host ...

  6. oracle记录各登陆主机用户名,登陆ip,所执行的命令

    oracle记录各登陆主机用户名,登陆ip,所执行的命令 /etc/profile #history USER_IP=`>/dev/null| awk '{print $NF}'|sed -e ...

  7. Oracle 11G R2 RAC中的scan ip 的用途和基本原理【转】

    Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...

  8. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:4.安装Oracle RAC FAQ-4.7.Oracle 11G R2 RAC修改public网络IP

    问题:Linuxrac2节点的public网IP被占用,导致集群节点2无法访问 1.禁止相关CRS资源的启动,停止这些资源(vip,listener,scan,scan_listener,databa ...

  9. Oracle 11G R2 RAC中的scan ip 的用途和基本原理

    Oracle 11G R2 RAC增加了scan ip功能,在11.2之前,client链接数据库的时候要用vip,假如你的cluster有4个节点,那么客户端的tnsnames.ora中就对应有四个 ...

随机推荐

  1. 全网最详细的Centos7系统里安装Openresty(图文详解)

    不多说,直接上干货! 介绍: Nginx 采用一个 master 进程管理多个 worker 进程(master-worker)模式,基本的事件处理都在 woker 中,master 负责一些全局初始 ...

  2. ③JSP经典回顾

    jsp概述 jsp实际就是一个高级servlet,比servlet容易很多.jsp/servlet在jsp容器中运行.例如,Tomcat就是一个Servlet/jsp容器. 关于tomcat:[传送门 ...

  3. 非业务 Oracle SQL 语句备份

    1.创建一个将 Oracle 生成的 GUID 格式化为标准的 GUID 的函数 2.在 PLSQL 中测试并输出语句异常的语句块 3.在查询语句中日期的一种特殊表示方法 4.利用 ROWNUM 做分 ...

  4. SpringBoot 启动概述

    透过现象看本质,SpringApplication 只是将一个典型的Spring应用的启动流程进行了扩展,因此,透彻理解 Spring 容器是打开 Spring Boot 大门的一把钥匙. Sprin ...

  5. ES6躬行记(4)——模板字面量

    模板字面量(Template Literal)是一种能够嵌入表达式的格式化字符串,有别于普通字符串,它使用反引号(`)包裹字符序列,而不是双引号或单引号.模板字面量包含特定形式的占位符(${expre ...

  6. spring-boot(六) 邮件服务

    学习文章来自:springboot(十):邮件服务 简单使用 1.pom包配置 pom包里面添加spring-boot-starter-mail包引用 <dependencies> < ...

  7. springboot情操陶冶-SpringApplication(一)

    SpringApplication是所有springboot的入口类,分析此类有助于我们了解springboot的工作机制.本文以2.0.3.REALEASE版本作分析 SpringApplicati ...

  8. 你可能没听过的11个Python库

    目前,网上已有成千上万个Python包,但几乎没有人能够全部知道它们.单单 PyPi上就有超过47000个包列表. 现在,越来越多的数据科学家开始使用Python,虽然他们从 pandas, scik ...

  9. T-SQL :SQL Server 定义数据完整性 6大约束(三)

    1.创建一客户张表 IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL DROP TABLE dbo.Employees; CREATE TABLE dbo. ...

  10. Navicat Mysql快捷键

    .ctrl+q 打开查询窗口 .ctrl+/ 注释sql语句 .ctrl+shift +/ 解除注释 .ctrl+r 运行查询窗口的sql语句 .ctrl+shift+r 只运行选中的sql语句 .F ...