方法1:创建触发器
方法1:数据库中创建触发器(只记录失败),但是需要开发同意或者开发自己创建。找到密码输入错误的服务器,进行数据源配置的更改。
该方法适用于要求找到密码错误用户所在服务器的场景下。
CREATE OR REPLACE TRIGGER sys.logon_denied_to_alertAFTER servererror ON DATABASE
DECLAREmessage 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);
BEGINIF (ora_is_servererror(1017)) THEN-- get ip FOR remote connections :IF upper(sys_context('userenv', 'network_protocol')) = 'TCP' THENip := sys_context('userenv', 'ip_address');END IF;SELECT sid INTO v_sid FROM sys.v_$mystat WHERE rownum < 2;SELECT p.spid, v.programINTO v_pid, v_programFROM v$process p, v$session vWHERE p.addr = v.paddrAND 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;
/
这个触发器不写入数据库表,会在告警日志中记录
--查看数据库的告警日志
[oracle@top132] cd /u01/app/oracle/diag/rdbms/topdh/topdh/trace
[oracle@top132:/u01/app/oracle/diag/rdbms/topdh/topdh/trace]$ tail -200f alert_topdh.log
Fri Dec 01 19:48:49 2023
2023-12-01 19:48:49 Password Erro: logon denied from localhost 5944 User:oracle with sqlplus@top132 (TNS V1-V3) – sqlplus@top132 (TNS V1-V3) dbuser:hr
Fri Dec 01 19:52:21 2023
2023-12-01 19:52:21 Password Erro: logon denied from 192.168.16.122 6273 User:Administrator with navicat.exe – navicat.exe dbuser:SYS
参考链接:https://www.cnblogs.com/plluoye/p/10951120.html
方法2:设置密码输错次数参数
在不需要查被锁定用户的服务器的场景下可以用该方法。
Oracle profile文件设置了密码输错次数限制,超过该次数就会被锁定,更改Oracle profile文件设置了密码输错次数限制为无限制。
查询用户信息
--查询用户信息
set linesize 999
set pagesize 999
select username,account_status,lock_date,profile from dba_users;USERNAME ACCOUNT_STATUS LOCK_DATE PROFILE
------------------------------ -------------------------------- ------------------- ------------------------------
......
SYXK LOCKED 2024-05-08 15:39:25 DEFAULT
.......
查询状态为:LOCKED(TIMED)
查看profile文件配置信息
--查看profile文件配置信息
set linesize 999
set pagesize 999
SELECT resource_name,resource_type,limit FROM dba_profiles WHERE profile='DEFAULT'; RESOURCE_NAME RESOURCE LIMIT
-------------------------------- -------- ----------------------------------------
COMPOSITE_LIMIT KERNEL UNLIMITED
SESSIONS_PER_USER KERNEL UNLIMITED
CPU_PER_SESSION KERNEL UNLIMITED
CPU_PER_CALL KERNEL UNLIMITED
LOGICAL_READS_PER_SESSION KERNEL UNLIMITED
LOGICAL_READS_PER_CALL KERNEL UNLIMITED
IDLE_TIME KERNEL UNLIMITED
CONNECT_TIME KERNEL UNLIMITED
PRIVATE_SGA KERNEL UNLIMITED
FAILED_LOGIN_ATTEMPTS PASSWORD 10
PASSWORD_LIFE_TIME PASSWORD UNLIMITED
PASSWORD_REUSE_TIME PASSWORD UNLIMITED
PASSWORD_REUSE_MAX PASSWORD UNLIMITED
PASSWORD_VERIFY_FUNCTION PASSWORD NULL
PASSWORD_LOCK_TIME PASSWORD 1
PASSWORD_GRACE_TIME PASSWORD 7已选择16行。
修改参数FAILED_LOGIN_ATTEMPTS
--修改参数FAILED_LOGIN_ATTEMPTS
alter profile default limit FAILED_LOGIN_ATTEMPTS unlimited;补充:也可以同时进行以下参数修改
alter profile default limit password_grace_time unlimited;
alter profile default limit password_life_time unlimited;
alter profile default limit password_lock_time unlimited;
解锁用户
alter user syxk account unlock;
修改之后不需要重启动数据库,会立即生效。
补充:参数理解
FAILED_LOGIN_ATTEMPTS
FAILED_LOGIN_ATTEMPTS (单位:次数)
- 用户登录数据库失败次数(密码错误),是整个数据库中各个会话的总和,直到达到这个数,帐户锁定。不是针对特定会话的。
- 只要登录成功一次,这个计数器就重置为 0 .
- 帐户锁定后,手工解锁或自动解锁后,该计数器也会重置为 0 .
PASSWORD_LOCK_TIME
PASSWORD_LOCK_TIME (单位:天) 帐户锁定后,多少天后自动解锁。
对应的内部表: user$ (lcount)
PASSWORD_GRACE_TIME
密码到期提前7天提醒
添加profile文件并分配用户
--创建profile文件
create profile profile名字 limit FAILED_LOGIN_ATTEMPTS 10 PASSWORD_LIFE_TIME 180 PASSWORD_REUSE_TIME UNLIMITED PASSWORD_REUSE_MAX UNLIMITED PASSWORD_VERIFY_FUNCTION null PASSWORD_LOCK_TIME 1 PASSWORD_GRACE_TIME 30;--新创建的profile文件分配给用户
alter user 用户名 profile profile名字;
参考链接:https://blog.csdn.net/xiezuoyong/article/details/88849226
方法3:通过告警日志排查
方法3:提供告警日志,根据账户锁定时间逐个排查日志中记录的ip。
该方法不太好用,因为有的日志中ip较多。