ORACLE如何找到引起账号锁定的IP的一点思考与总结
前端之家收集整理的这篇文章主要介绍了
ORACLE如何找到引起账号锁定的IP的一点思考与总结,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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
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>
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;
/