最近發生帳號莫名其妙被鎖定(嘗試登入失敗導致)的問題,一直沒有頭緒到底是怎麼發生的,所以上Oracle Metalink 網站島相關的資料,特別將相關的內容節錄如下,做個紀錄。

 

目的
本故障排除指南旨在提供有關跟蹤ora-1017 失敗、數據庫身份驗證期間登錄被拒絕的可疑登錄的信息。
請注意,惡意來源在大多數情況下並不是登錄失敗的原因。它可能只是用戶名或密碼中的拼寫錯誤、其中包含無效密碼的 cron 作業,甚至是配置錯誤的 Oracle 客戶端程序(例如,參見參考註釋 267401.1)。
無論如何,這些不成功的連接嘗試可能會令人討厭,尤其是當密碼管理策略對 failed_login_attempts 有限制並導致 ora-28000“帳戶被鎖定”錯誤時。

故障排除步驟
檢查 DBA_USERS

如果用戶的 ACCOUNT_STATUS 是 LOCKED,這意味著該帳戶被 DBA 鎖定,執行

ALTER USER &username ACCOUNT LOCK; 

如果 ACCOUNT_STATUS 為 LOCKED(TIMED),這意味著它由於超過允許的 FAILED_LOGIN_ATTEMPTS 數量而被鎖定,即使 PASSWORD_LOCK_TIME 設置為無限制也是如此。
帳戶永遠不會因為密碼過期而被鎖定。在帳戶實際被鎖定之前,您可以通過檢查 USER$.LCOUNT 列來檢查迄今為止的失敗登錄嘗試次數:


select name,lcount from user$ where name='&USERNAME';
 

審核不成功的登錄

首先通過設置 audit_trail = db 建立標準審計並發出:

AUDIT SESSION WHENEVER NOT SUCCESSFUL;

找出“上週”開始嘗試登錄失敗的審核記錄如下:

select username,
os_username,
userhost,
client_id,
trunc(timestamp),
count(*) failed_logins
from dba_audit_trail
where returncode=1017 and --1017 is invalid username/password
timestamp > sysdate -7
group by username,os_username,userhost, client_id,trunc(timestamp); 

註釋: USERHOST 列僅填充了 10G 的客戶端主機名稱,在早期版本中,這是用戶在 RAC 環境中訪問數據庫的 Oracle 實例的數字實例 ID 。

可選地選擇更多列,但是這些可能不會為您提供相關信息,您查看此註釋的原因可能是您在此處找到了一些條目並需要更多信息。嘗試將 DBA_USERS.LOCK_DATE 與正在運行的腳本或批處理作業相關聯。


在“init.ora”參數文件中設置事件
在您的參數文件中設置以下事件以在生成 ORA-1017 時轉儲跟蹤文件:


event = "1017 trace name errorstack level 10"

或者,您可以作為特權用戶發出以下命令,這只會影響新進程,因此可能無法在共享服務器環境中工作:


alter system set events '1017 trace name errorstack level 10';


每當有人嘗試使用無效的用戶名/密碼時,這將在 user_dump_dest 中生成一個跟?文件,因為在級別 10 請求跟蹤,它將包含一個標記為 PROCESS STATE 的部分,其中包含跟蹤信息,例如:


O/S info: user: userx, term: pts/1, ospid: ***** , machine: *****
program: sqlplus@***** (TNS V1-V3)
application name: sqlplus@**** (TNS V1-V3), hash value=0
last wait for 'SQL*Net message from client' blocking sess=0x0 seq=2 wait_tim
e=5570 seconds since wait started=0


在這種情況下,啟動客戶端會話的是由操作系統用戶“userx”啟動的 sqlplus 客戶端。調用堆棧跟?部分可以幫助支持進一步診斷問題。提示:如果操作系統用戶或程序是“oracle”,則連接可能源自數據庫鏈接。


使用觸發器捕獲附加信息
以下觸發器代碼可用於收集有關不成功登錄嘗試的附加信息,如果您已經有此觸發事件的觸發器,而不是在同一事件上具有更多觸發器,建議將此代碼集成到現有觸發器中,注意這是只是一個提供一些基本信息的示例,它可以隨意更改或修改,例如,您可能更喜歡將條目記錄在表中而不是 alert.log 文件中,即使會話未經過身份驗證,此觸發器也會觸發,請保持觸發代碼盡可能簡單,以盡量減少對性能的影響。


-- sample trigger to write diagnostic info to alert.log
-- for failed login attempts (ora-1017)

create or replace trigger logon_denied_to_alert
after servererror on database
declare
message varchar2(256);
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_client_id VARCHAR2(64);
begin
IF (ora_is_servererror(1017)) THEN

-- get IP for remote connections:
if sys_context('userenv','network_protocol') = 'TCP' then
IP := sys_context('userenv','ip_address');
end if;

select distinct sid into v_sid from sys.v_$mystat;
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');
dbms_application_info.READ_MODULE(v_module,v_action);

v_client_id := sys_context('userenv','client_identifier');

message:= to_char(sysdate,'Dy Mon dd HH24:MI:SS YYYY')||
' logon denied '|| 'IP ='||nvl(IP,'localhost')||' pid = '||v_pid||
' os user = '||v_os_user||' client id = '||v_client_id||
' with program= '||v_program||' module ='||v_module||' action='||v_action;

sys.dbms_system.ksdwrt(2,message);

-- remove comments from next line to let it hang for 5 minutes
-- to be able to do more diagnostics on the operating system:
-- sys.dbms_lock.sleep(300);
end if;
end;
/
-- end trigger

alert.log 的一些示例輸出如下所示:

2011 年 5 月 20 日星期五 10:00:50 2011 年 5 月 20 日星期五 10:00:50 登錄被拒絕 IP = localhost pid = **** os user = oracle client id = with program= sqlplus@<host name> (TNS V1-V3 ) 模塊=sqlplus@<主機名> (TNS V1-V3) 操作=
更多屬性可以在註釋 120797.1 中找到,但是請考慮當此觸發器因登錄嘗試失敗而觸發時,並非所有會話特定信息都可用,因為它對於經過身份驗證的會話是可用的。


使用 SQLNET Tracing 收集詳細信息
sqlnet 跟蹤可以為您提供有關連接嘗試的更多詳細信息,僅當上述信息未為您提供足夠信息時才使用它,因為如果啟用 sqlnet 跟?將很難找到您要查找的內容,以啟用它創建或編輯服務器端 sqlnet.ora 文件並輸入以下參數:


# 服務器端 sqlnet 跟蹤參數
# server side sqlnet trace parameters
trace_level_server = 16
trace_file_server=server
trace_directory_server = <any directory on a volume with enough freespace>

作為最後的手段,您可能希望將希望寄託在網絡或操作系統級別的數據包嗅探器(sniffer)上,但是此類工具的使用超出了本文的範圍,您可能需要諮詢您當地的網絡管理員以了解這種可能性。

 

注意:如果您看到您的 RDBMS 帳戶被鎖定(帶有 ORA-28000“帳戶已鎖定。”錯誤)即使用戶從未連續提供錯誤密碼
FAILED_LOGIN_ATTEMPTS 次,並且審核中沒有 ORA-1017 錯誤跟蹤用戶帳戶,則可能是一個已知的錯誤,並且必須應用補丁來修復問題錯誤 30210753。

請應用補丁並驗證問題是否得到修復。

參考

注意:1309738.1 - 由於無效登錄嘗試導致的高“庫緩存鎖定”等待時間
注意:114930.1 - Oracle 密碼管理策略
注意:120797.1 - 如何確定當前會話的客戶端 IP 地址、語言和地區以及用戶
名註意:221944.1 - 如何審計潛在的破壞用戶名/密碼的嘗試
注意:259387.1 - 如何更改數據庫控制監控的數據庫 10g 和 11g 中的 DBSNMP 密碼
注意:260111.1 - 如何解釋 DBA_USERS 中的 ACCOUNT_STATUS 列
注意:284344.1 - DBA_USERS.ACCOUNT_STATUS 顯示 LOCKED 後FAILED_LOGIN_ATTEMPTS 被破壞

arrow
arrow
    文章標籤
    oracle
    全站熱搜

    噗噗噗的潛水珽 發表在 痞客邦 留言(0) 人氣()